@plastic-software/three 0.180.0 → 0.181.2

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 (357) hide show
  1. package/build/three.cjs +944 -487
  2. package/build/three.core.js +506 -327
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +436 -164
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +8 -2
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +3753 -1177
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +3752 -1176
  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/animation/CCDIKSolver.js +1 -1
  15. package/examples/jsm/controls/ArcballControls.js +1 -1
  16. package/examples/jsm/controls/DragControls.js +1 -1
  17. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  18. package/examples/jsm/controls/FlyControls.js +1 -1
  19. package/examples/jsm/controls/OrbitControls.js +2 -2
  20. package/examples/jsm/controls/PointerLockControls.js +2 -2
  21. package/examples/jsm/controls/TrackballControls.js +1 -1
  22. package/examples/jsm/controls/TransformControls.js +1 -1
  23. package/examples/jsm/effects/AsciiEffect.js +8 -8
  24. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  25. package/examples/jsm/exporters/EXRExporter.js +1 -1
  26. package/examples/jsm/exporters/GLTFExporter.js +3 -3
  27. package/examples/jsm/exporters/USDZExporter.js +9 -2
  28. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  29. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  30. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  31. package/examples/jsm/geometries/TextGeometry.js +3 -2
  32. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  33. package/examples/jsm/helpers/ViewHelper.js +43 -5
  34. package/examples/jsm/inspector/Inspector.js +427 -0
  35. package/examples/jsm/inspector/RendererInspector.js +415 -0
  36. package/examples/jsm/inspector/tabs/Console.js +204 -0
  37. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  38. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  39. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  40. package/examples/jsm/inspector/ui/Graph.js +95 -0
  41. package/examples/jsm/inspector/ui/Item.js +170 -0
  42. package/examples/jsm/inspector/ui/List.js +75 -0
  43. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  44. package/examples/jsm/inspector/ui/Style.js +654 -0
  45. package/examples/jsm/inspector/ui/Tab.js +46 -0
  46. package/examples/jsm/inspector/ui/Values.js +423 -0
  47. package/examples/jsm/inspector/ui/utils.js +56 -0
  48. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  49. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  50. package/examples/jsm/interactive/SelectionBox.js +30 -0
  51. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  52. package/examples/jsm/loaders/3MFLoader.js +1 -1
  53. package/examples/jsm/loaders/ColladaLoader.js +2 -2
  54. package/examples/jsm/loaders/DDSLoader.js +1 -1
  55. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  56. package/examples/jsm/loaders/FBXLoader.js +2 -2
  57. package/examples/jsm/loaders/FontLoader.js +23 -5
  58. package/examples/jsm/loaders/GLTFLoader.js +5 -3
  59. package/examples/jsm/loaders/KTX2Loader.js +28 -21
  60. package/examples/jsm/loaders/KTXLoader.js +2 -2
  61. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  62. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  63. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  64. package/examples/jsm/loaders/LWOLoader.js +2 -2
  65. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  66. package/examples/jsm/loaders/OBJLoader.js +1 -1
  67. package/examples/jsm/loaders/PDBLoader.js +1 -1
  68. package/examples/jsm/loaders/SVGLoader.js +2 -2
  69. package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
  70. package/examples/jsm/math/ConvexHull.js +1 -1
  71. package/examples/jsm/math/ImprovedNoise.js +1 -1
  72. package/examples/jsm/math/SimplexNoise.js +1 -1
  73. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  74. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  75. package/examples/jsm/misc/TubePainter.js +383 -40
  76. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  77. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  78. package/examples/jsm/objects/Sky.js +1 -1
  79. package/examples/jsm/objects/SkyMesh.js +1 -1
  80. package/examples/jsm/objects/Water.js +3 -3
  81. package/examples/jsm/objects/WaterMesh.js +6 -6
  82. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  83. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  84. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  85. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  86. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  87. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  88. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  89. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  90. package/examples/jsm/shaders/BokehShader.js +1 -1
  91. package/examples/jsm/shaders/BokehShader2.js +1 -1
  92. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  93. package/examples/jsm/shaders/FocusShader.js +1 -1
  94. package/examples/jsm/shaders/GTAOShader.js +2 -2
  95. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  96. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  98. package/examples/jsm/shaders/SSRShader.js +1 -1
  99. package/examples/jsm/shaders/SepiaShader.js +1 -1
  100. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  101. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/TSLEncoder.js +7 -0
  104. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  105. package/examples/jsm/tsl/display/AnamorphicNode.js +2 -1
  106. package/examples/jsm/tsl/display/BloomNode.js +4 -0
  107. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  108. package/examples/jsm/tsl/display/DepthOfFieldNode.js +7 -0
  109. package/examples/jsm/tsl/display/GTAONode.js +45 -5
  110. package/examples/jsm/tsl/display/GaussianBlurNode.js +5 -3
  111. package/examples/jsm/tsl/display/OutlineNode.js +11 -0
  112. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  113. package/examples/jsm/tsl/display/SSRNode.js +2 -0
  114. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  115. package/examples/jsm/tsl/display/TRAANode.js +123 -6
  116. package/examples/jsm/tsl/display/boxBlur.js +1 -0
  117. package/examples/jsm/tsl/display/hashBlur.js +1 -0
  118. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  119. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  120. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  121. package/package.json +5 -10
  122. package/src/Three.Core.js +3 -2
  123. package/src/Three.TSL.js +7 -1
  124. package/src/Three.WebGPU.Nodes.js +2 -0
  125. package/src/Three.WebGPU.js +2 -0
  126. package/src/animation/AnimationClip.js +3 -2
  127. package/src/animation/AnimationMixer.js +3 -3
  128. package/src/animation/AnimationObjectGroup.js +2 -1
  129. package/src/animation/KeyframeTrack.js +7 -6
  130. package/src/animation/PropertyBinding.js +12 -11
  131. package/src/audio/Audio.js +10 -9
  132. package/src/audio/PositionalAudio.js +1 -1
  133. package/src/cameras/OrthographicCamera.js +1 -1
  134. package/src/cameras/PerspectiveCamera.js +1 -1
  135. package/src/cameras/StereoCamera.js +2 -2
  136. package/src/constants.js +1 -1
  137. package/src/core/BufferGeometry.js +8 -8
  138. package/src/core/EventDispatcher.js +1 -1
  139. package/src/core/InterleavedBuffer.js +1 -1
  140. package/src/core/InterleavedBufferAttribute.js +3 -2
  141. package/src/core/Object3D.js +3 -2
  142. package/src/core/Raycaster.js +2 -1
  143. package/src/core/RenderTarget.js +10 -1
  144. package/src/extras/Controls.js +5 -4
  145. package/src/extras/DataUtils.js +2 -1
  146. package/src/extras/Earcut.js +6 -0
  147. package/src/extras/ImageUtils.js +2 -2
  148. package/src/extras/PMREMGenerator.js +268 -55
  149. package/src/extras/core/Curve.js +2 -1
  150. package/src/extras/core/Interpolations.js +7 -1
  151. package/src/extras/core/ShapePath.js +4 -4
  152. package/src/extras/lib/earcut.js +7 -7
  153. package/src/geometries/BoxGeometry.js +1 -0
  154. package/src/geometries/CapsuleGeometry.js +1 -0
  155. package/src/geometries/CircleGeometry.js +1 -0
  156. package/src/geometries/ConeGeometry.js +1 -0
  157. package/src/geometries/CylinderGeometry.js +1 -0
  158. package/src/geometries/DodecahedronGeometry.js +1 -0
  159. package/src/geometries/ExtrudeGeometry.js +8 -6
  160. package/src/geometries/IcosahedronGeometry.js +1 -0
  161. package/src/geometries/LatheGeometry.js +1 -0
  162. package/src/geometries/OctahedronGeometry.js +1 -0
  163. package/src/geometries/PlaneGeometry.js +1 -0
  164. package/src/geometries/RingGeometry.js +1 -0
  165. package/src/geometries/ShapeGeometry.js +1 -0
  166. package/src/geometries/SphereGeometry.js +1 -0
  167. package/src/geometries/TetrahedronGeometry.js +1 -0
  168. package/src/geometries/TorusGeometry.js +1 -0
  169. package/src/geometries/TorusKnotGeometry.js +1 -0
  170. package/src/geometries/TubeGeometry.js +1 -0
  171. package/src/helpers/CameraHelper.js +1 -1
  172. package/src/loaders/AnimationLoader.js +2 -1
  173. package/src/loaders/AudioLoader.js +2 -1
  174. package/src/loaders/BufferGeometryLoader.js +2 -2
  175. package/src/loaders/Cache.js +2 -2
  176. package/src/loaders/DataTextureLoader.js +1 -1
  177. package/src/loaders/FileLoader.js +3 -2
  178. package/src/loaders/ImageBitmapLoader.js +5 -4
  179. package/src/loaders/ImageLoader.js +1 -1
  180. package/src/loaders/Loader.js +3 -3
  181. package/src/loaders/LoadingManager.js +25 -3
  182. package/src/loaders/MaterialLoader.js +3 -2
  183. package/src/loaders/ObjectLoader.js +13 -13
  184. package/src/loaders/TextureLoader.js +1 -1
  185. package/src/loaders/nodes/NodeLoader.js +3 -2
  186. package/src/materials/Material.js +4 -3
  187. package/src/materials/MeshBasicMaterial.js +1 -0
  188. package/src/materials/MeshDepthMaterial.js +1 -0
  189. package/src/materials/MeshLambertMaterial.js +2 -1
  190. package/src/materials/MeshMatcapMaterial.js +22 -0
  191. package/src/materials/MeshNormalMaterial.js +1 -0
  192. package/src/materials/MeshPhongMaterial.js +2 -1
  193. package/src/materials/MeshPhysicalMaterial.js +2 -1
  194. package/src/materials/MeshStandardMaterial.js +8 -7
  195. package/src/materials/MeshToonMaterial.js +1 -0
  196. package/src/materials/PointsMaterial.js +1 -1
  197. package/src/materials/ShaderMaterial.js +2 -2
  198. package/src/materials/nodes/Line2NodeMaterial.js +2 -2
  199. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  200. package/src/materials/nodes/NodeMaterial.js +62 -22
  201. package/src/materials/nodes/manager/NodeMaterialObserver.js +2 -1
  202. package/src/math/Color.js +6 -5
  203. package/src/math/ColorManagement.js +2 -2
  204. package/src/math/Cylindrical.js +1 -1
  205. package/src/math/Euler.js +2 -1
  206. package/src/math/MathUtils.js +13 -11
  207. package/src/math/Matrix2.js +1 -1
  208. package/src/math/Matrix3.js +2 -2
  209. package/src/math/Matrix4.js +7 -7
  210. package/src/math/Plane.js +1 -1
  211. package/src/math/Quaternion.js +68 -66
  212. package/src/math/Spherical.js +1 -1
  213. package/src/nodes/Nodes.js +1 -1
  214. package/src/nodes/TSL.js +1 -1
  215. package/src/nodes/accessors/CubeTextureNode.js +3 -2
  216. package/src/nodes/accessors/InstanceNode.js +22 -4
  217. package/src/nodes/accessors/Lights.js +10 -0
  218. package/src/nodes/accessors/Normal.js +5 -4
  219. package/src/nodes/accessors/Position.js +18 -2
  220. package/src/nodes/accessors/ReferenceNode.js +2 -1
  221. package/src/nodes/accessors/SceneNode.js +2 -1
  222. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  223. package/src/nodes/accessors/StorageTextureNode.js +22 -0
  224. package/src/nodes/accessors/Texture3DNode.js +1 -1
  225. package/src/nodes/accessors/TextureNode.js +61 -27
  226. package/src/nodes/code/FunctionCallNode.js +5 -4
  227. package/src/nodes/core/ArrayNode.js +1 -0
  228. package/src/nodes/core/AttributeNode.js +2 -1
  229. package/src/nodes/core/ContextNode.js +5 -10
  230. package/src/nodes/core/IndexNode.js +2 -2
  231. package/src/nodes/core/InputNode.js +2 -1
  232. package/src/nodes/core/InspectorNode.js +128 -0
  233. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
  234. package/src/nodes/core/Node.js +137 -12
  235. package/src/nodes/core/NodeBuilder.js +135 -21
  236. package/src/nodes/core/NodeFrame.js +20 -20
  237. package/src/nodes/core/NodeFunction.js +2 -1
  238. package/src/nodes/core/NodeParser.js +2 -1
  239. package/src/nodes/core/NodeUtils.js +17 -90
  240. package/src/nodes/core/ParameterNode.js +31 -0
  241. package/src/nodes/core/PropertyNode.js +7 -0
  242. package/src/nodes/core/StackNode.js +16 -14
  243. package/src/nodes/core/UniformNode.js +2 -1
  244. package/src/nodes/core/VarNode.js +70 -12
  245. package/src/nodes/core/VaryingNode.js +3 -2
  246. package/src/nodes/display/BlendModes.js +5 -4
  247. package/src/nodes/display/BumpMapNode.js +1 -1
  248. package/src/nodes/display/ColorAdjustment.js +1 -1
  249. package/src/nodes/display/NormalMapNode.js +2 -1
  250. package/src/nodes/display/PassNode.js +51 -10
  251. package/src/nodes/display/RenderOutputNode.js +28 -2
  252. package/src/nodes/display/ScreenNode.js +2 -1
  253. package/src/nodes/display/ToneMappingNode.js +31 -4
  254. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  255. package/src/nodes/fog/Fog.js +3 -2
  256. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  257. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  258. package/src/nodes/functions/BasicLightingModel.js +2 -1
  259. package/src/nodes/functions/PhysicalLightingModel.js +3 -2
  260. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  261. package/src/nodes/geometry/RangeNode.js +40 -4
  262. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  263. package/src/nodes/gpgpu/ComputeNode.js +17 -5
  264. package/src/nodes/gpgpu/SubgroupFunctionNode.js +25 -0
  265. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  266. package/src/nodes/lighting/EnvironmentNode.js +6 -6
  267. package/src/nodes/lighting/LightsNode.js +2 -3
  268. package/src/nodes/lighting/PointShadowNode.js +6 -0
  269. package/src/nodes/lighting/ShadowFilterNode.js +2 -0
  270. package/src/nodes/lighting/ShadowNode.js +75 -8
  271. package/src/nodes/math/ConditionalNode.js +6 -5
  272. package/src/nodes/math/MathNode.js +22 -4
  273. package/src/nodes/math/OperatorNode.js +3 -2
  274. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  275. package/src/nodes/shapes/Shapes.js +1 -1
  276. package/src/nodes/tsl/TSLBase.js +5 -2
  277. package/src/nodes/tsl/TSLCore.js +36 -15
  278. package/src/nodes/utils/DebugNode.js +2 -1
  279. package/src/nodes/utils/EventNode.js +36 -0
  280. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  281. package/src/nodes/utils/JoinNode.js +3 -2
  282. package/src/nodes/utils/LoopNode.js +20 -24
  283. package/src/nodes/utils/MemberNode.js +2 -1
  284. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  285. package/src/nodes/utils/RTTNode.js +12 -2
  286. package/src/nodes/utils/ReflectorNode.js +10 -3
  287. package/src/objects/Line.js +2 -1
  288. package/src/objects/LineSegments.js +2 -1
  289. package/src/objects/Skeleton.js +3 -2
  290. package/src/objects/SkinnedMesh.js +3 -1
  291. package/src/objects/Sprite.js +2 -1
  292. package/src/renderers/WebGLRenderer.js +49 -33
  293. package/src/renderers/common/Animation.js +13 -1
  294. package/src/renderers/common/Backend.js +93 -30
  295. package/src/renderers/common/Background.js +2 -1
  296. package/src/renderers/common/Bindings.js +56 -2
  297. package/src/renderers/common/CanvasTarget.js +341 -0
  298. package/src/renderers/common/Geometries.js +26 -0
  299. package/src/renderers/common/Info.js +4 -2
  300. package/src/renderers/common/InspectorBase.js +146 -0
  301. package/src/renderers/common/PostProcessing.js +6 -25
  302. package/src/renderers/common/QuadMesh.js +7 -1
  303. package/src/renderers/common/RenderList.js +7 -3
  304. package/src/renderers/common/RenderObject.js +3 -1
  305. package/src/renderers/common/RenderObjects.js +1 -1
  306. package/src/renderers/common/Renderer.js +436 -228
  307. package/src/renderers/common/RendererUtils.js +9 -0
  308. package/src/renderers/common/SampledTexture.js +8 -0
  309. package/src/renderers/common/Sampler.js +37 -11
  310. package/src/renderers/common/StorageTexture.js +9 -1
  311. package/src/renderers/common/Textures.js +89 -35
  312. package/src/renderers/common/TimestampQueryPool.js +63 -1
  313. package/src/renderers/common/UniformsGroup.js +2 -1
  314. package/src/renderers/common/XRManager.js +7 -3
  315. package/src/renderers/common/extras/PMREMGenerator.js +160 -65
  316. package/src/renderers/common/nodes/NodeLibrary.js +4 -2
  317. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  318. package/src/renderers/common/nodes/Nodes.js +38 -16
  319. package/src/renderers/shaders/DFGLUTData.js +64 -0
  320. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  321. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  322. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  323. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  324. package/src/renderers/shaders/UniformsLib.js +1 -0
  325. package/src/renderers/shaders/UniformsUtils.js +25 -4
  326. package/src/renderers/webgl/WebGLCapabilities.js +2 -1
  327. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  328. package/src/renderers/webgl/WebGLInfo.js +3 -1
  329. package/src/renderers/webgl/WebGLProgram.js +11 -10
  330. package/src/renderers/webgl/WebGLPrograms.js +2 -1
  331. package/src/renderers/webgl/WebGLShadowMap.js +2 -1
  332. package/src/renderers/webgl/WebGLState.js +15 -14
  333. package/src/renderers/webgl/WebGLTextures.js +18 -14
  334. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  335. package/src/renderers/webgl-fallback/WebGLBackend.js +22 -41
  336. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +74 -11
  337. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  338. package/src/renderers/webgl-fallback/utils/WebGLState.js +6 -5
  339. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +117 -16
  340. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +42 -12
  341. package/src/renderers/webgpu/WebGPUBackend.js +134 -108
  342. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  343. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  344. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -19
  345. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  346. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
  347. package/src/renderers/webgpu/utils/WebGPUConstants.js +5 -0
  348. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +44 -16
  349. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  350. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +146 -74
  351. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +29 -6
  352. package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
  353. package/src/renderers/webxr/WebXRManager.js +3 -2
  354. package/src/textures/Source.js +2 -1
  355. package/src/textures/Texture.js +3 -2
  356. package/src/textures/VideoTexture.js +2 -0
  357. package/src/utils.js +67 -3
@@ -4,7 +4,7 @@ let _color4 = null;
4
4
  import Color4 from './Color4.js';
5
5
  import { Vector2 } from '../../math/Vector2.js';
6
6
  import { createCanvasElement, warnOnce } from '../../utils.js';
7
- import { REVISION } from '../../constants.js';
7
+ import { REVISION, TimestampQuery } from '../../constants.js';
8
8
 
9
9
  /**
10
10
  * Most of the rendering related logic is implemented in the
@@ -64,8 +64,8 @@ class Backend {
64
64
  * @type {{render: ?TimestampQueryPool, compute: ?TimestampQueryPool}}
65
65
  */
66
66
  this.timestampQueryPool = {
67
- 'render': null,
68
- 'compute': null
67
+ [ TimestampQuery.RENDER ]: null,
68
+ [ TimestampQuery.COMPUTE ]: null
69
69
  };
70
70
 
71
71
  /**
@@ -273,20 +273,13 @@ class Backend {
273
273
  // textures
274
274
 
275
275
  /**
276
- * Creates a GPU sampler for the given texture.
276
+ * Updates a GPU sampler for the given texture.
277
277
  *
278
278
  * @abstract
279
- * @param {Texture} texture - The texture to create the sampler for.
279
+ * @param {Texture} texture - The texture to update the sampler for.
280
+ * @return {string} The current sampler key.
280
281
  */
281
- createSampler( /*texture*/ ) { }
282
-
283
- /**
284
- * Destroys the GPU sampler for the given texture.
285
- *
286
- * @abstract
287
- * @param {Texture} texture - The texture to destroy the sampler for.
288
- */
289
- destroySampler( /*texture*/ ) {}
282
+ updateSampler( /*texture*/ ) { }
290
283
 
291
284
  /**
292
285
  * Creates a default texture for the given texture that can be used
@@ -328,8 +321,9 @@ class Backend {
328
321
  *
329
322
  * @abstract
330
323
  * @param {Texture} texture - The texture.
324
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
331
325
  */
332
- destroyTexture( /*texture*/ ) { }
326
+ destroyTexture( /*texture, isDefaultTexture*/ ) { }
333
327
 
334
328
  /**
335
329
  * Returns texture data as a typed array.
@@ -439,6 +433,33 @@ class Backend {
439
433
 
440
434
  // utils
441
435
 
436
+ /**
437
+ * Updates a unique identifier for the given render context that can be used
438
+ * to allocate resources like occlusion queries or timestamp queries.
439
+ *
440
+ * @param {RenderContext|ComputeNode} abstractRenderContext - The render context.
441
+ */
442
+ updateTimeStampUID( abstractRenderContext ) {
443
+
444
+ const contextData = this.get( abstractRenderContext );
445
+ const frame = this.renderer.info.frame;
446
+
447
+ let prefix;
448
+
449
+ if ( abstractRenderContext.isComputeNode === true ) {
450
+
451
+ prefix = 'c:' + this.renderer.info.compute.frameCalls;
452
+
453
+ } else {
454
+
455
+ prefix = 'r:' + this.renderer.info.render.frameCalls;
456
+
457
+ }
458
+
459
+ contextData.timestampUID = prefix + ':' + abstractRenderContext.id + ':f' + frame;
460
+
461
+ }
462
+
442
463
  /**
443
464
  * Returns a unique identifier for the given render context that can be used
444
465
  * to allocate resources like occlusion queries or timestamp queries.
@@ -448,12 +469,64 @@ class Backend {
448
469
  */
449
470
  getTimestampUID( abstractRenderContext ) {
450
471
 
451
- const contextData = this.get( abstractRenderContext );
472
+ return this.get( abstractRenderContext ).timestampUID;
452
473
 
453
- let uid = abstractRenderContext.isComputeNode === true ? 'c' : 'r';
454
- uid += ':' + contextData.frameCalls + ':' + abstractRenderContext.id;
474
+ }
475
+
476
+ /**
477
+ * Returns all timestamp frames for the given type.
478
+ *
479
+ * @param {string} type - The type of the time stamp.
480
+ * @return {Array<number>} The timestamp frames.
481
+ */
482
+ getTimestampFrames( type ) {
483
+
484
+ const queryPool = this.timestampQueryPool[ type ];
455
485
 
456
- return uid;
486
+ return queryPool ? queryPool.getTimestampFrames() : [];
487
+
488
+ }
489
+
490
+ /**
491
+ * Returns the query pool for the given uid.
492
+ *
493
+ * @param {string} uid - The unique identifier.
494
+ * @return {TimestampQueryPool} The query pool.
495
+ */
496
+ _getQueryPool( uid ) {
497
+
498
+ const type = uid.startsWith( 'c:' ) ? TimestampQuery.COMPUTE : TimestampQuery.RENDER;
499
+ const queryPool = this.timestampQueryPool[ type ];
500
+
501
+ return queryPool;
502
+
503
+ }
504
+
505
+ /**
506
+ * Returns the timestamp for the given uid.
507
+ *
508
+ * @param {string} uid - The unique identifier.
509
+ * @return {number} The timestamp.
510
+ */
511
+ getTimestamp( uid ) {
512
+
513
+ const queryPool = this._getQueryPool( uid );
514
+
515
+ return queryPool.getTimestamp( uid );
516
+
517
+ }
518
+
519
+ /**
520
+ * Returns `true` if a timestamp for the given uid is available.
521
+ *
522
+ * @param {string} uid - The unique identifier.
523
+ * @return {boolean} Whether the timestamp is available or not.
524
+ */
525
+ hasTimestamp( uid ) {
526
+
527
+ const queryPool = this._getQueryPool( uid );
528
+
529
+ return queryPool.hasTimestamp( uid );
457
530
 
458
531
  }
459
532
 
@@ -487,9 +560,9 @@ class Backend {
487
560
  }
488
561
 
489
562
  const queryPool = this.timestampQueryPool[ type ];
563
+
490
564
  if ( ! queryPool ) {
491
565
 
492
- warnOnce( `WebGPURenderer: No timestamp query pool for type '${type}' found.` );
493
566
  return;
494
567
 
495
568
  }
@@ -502,16 +575,6 @@ class Backend {
502
575
 
503
576
  }
504
577
 
505
- /**
506
- * Can be used to synchronize CPU operations with GPU tasks. So when this method is called,
507
- * the CPU waits for the GPU to complete its operation (e.g. a compute task).
508
- *
509
- * @async
510
- * @abstract
511
- * @return {Promise} A Promise that resolves when synchronization has been finished.
512
- */
513
- async waitForGPU() {}
514
-
515
578
  /**
516
579
  * This method performs a readback operation by moving buffer data from
517
580
  * a storage buffer attribute from the GPU to the CPU.
@@ -6,6 +6,7 @@ import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
6
6
  import { Mesh } from '../../objects/Mesh.js';
7
7
  import { SphereGeometry } from '../../geometries/SphereGeometry.js';
8
8
  import { BackSide } from '../../constants.js';
9
+ import { error } from '../../utils.js';
9
10
 
10
11
  const _clearColor = /*@__PURE__*/ new Color4();
11
12
 
@@ -148,7 +149,7 @@ class Background extends DataMap {
148
149
 
149
150
  } else {
150
151
 
151
- console.error( 'THREE.Renderer: Unsupported background configuration.', background );
152
+ error( 'Renderer: Unsupported background configuration.', background );
152
153
 
153
154
  }
154
155
 
@@ -153,6 +153,40 @@ class Bindings extends DataMap {
153
153
 
154
154
  }
155
155
 
156
+ /**
157
+ * Deletes the bindings for the given compute node.
158
+ *
159
+ * @param {Node} computeNode - The compute node.
160
+ */
161
+ deleteForCompute( computeNode ) {
162
+
163
+ const bindings = this.nodes.getForCompute( computeNode ).bindings;
164
+
165
+ for ( const bindGroup of bindings ) {
166
+
167
+ this.delete( bindGroup );
168
+
169
+ }
170
+
171
+ }
172
+
173
+ /**
174
+ * Deletes the bindings for the given renderObject node.
175
+ *
176
+ * @param {RenderObject} renderObject - The renderObject.
177
+ */
178
+ deleteForRender( renderObject ) {
179
+
180
+ const bindings = renderObject.getBindings();
181
+
182
+ for ( const bindGroup of bindings ) {
183
+
184
+ this.delete( bindGroup );
185
+
186
+ }
187
+
188
+ }
189
+
156
190
  /**
157
191
  * Updates the given array of bindings.
158
192
  *
@@ -181,6 +215,10 @@ class Bindings extends DataMap {
181
215
 
182
216
  this.textures.updateTexture( binding.texture );
183
217
 
218
+ } else if ( binding.isSampler ) {
219
+
220
+ this.textures.updateSampler( binding.texture );
221
+
184
222
  } else if ( binding.isStorageBuffer ) {
185
223
 
186
224
  const attribute = binding.attribute;
@@ -286,7 +324,7 @@ class Bindings extends DataMap {
286
324
 
287
325
  }
288
326
 
289
- if ( texture.isStorageTexture === true ) {
327
+ if ( texture.isStorageTexture === true && texture.mipmapsAutoUpdate === true ) {
290
328
 
291
329
  const textureData = this.get( texture );
292
330
 
@@ -306,7 +344,23 @@ class Bindings extends DataMap {
306
344
 
307
345
  } else if ( binding.isSampler ) {
308
346
 
309
- binding.update();
347
+ const updated = binding.update();
348
+
349
+ if ( updated ) {
350
+
351
+ const samplerKey = this.textures.updateSampler( binding.texture );
352
+
353
+ if ( binding.samplerKey !== samplerKey ) {
354
+
355
+ binding.samplerKey = samplerKey;
356
+
357
+ needsBindingsUpdate = true;
358
+
359
+ cacheBindings = false;
360
+
361
+ }
362
+
363
+ }
310
364
 
311
365
  }
312
366
 
@@ -0,0 +1,341 @@
1
+ import { EventDispatcher } from '../../core/EventDispatcher.js';
2
+ import { Vector4 } from '../../math/Vector4.js';
3
+ import { FramebufferTexture } from '../../textures/FramebufferTexture.js';
4
+ import { DepthTexture } from '../../textures/DepthTexture.js';
5
+
6
+ /**
7
+ * CanvasTarget is a class that represents the final output destination of the renderer.
8
+ *
9
+ * @augments EventDispatcher
10
+ */
11
+ class CanvasTarget extends EventDispatcher {
12
+
13
+ /**
14
+ * Constructs a new CanvasTarget.
15
+ *
16
+ * @param {HTMLCanvasElement|OffscreenCanvas} domElement - The canvas element to render to.
17
+ */
18
+ constructor( domElement ) {
19
+
20
+ super();
21
+
22
+ /**
23
+ * A reference to the canvas element the renderer is drawing to.
24
+ * This value of this property will automatically be created by
25
+ * the renderer.
26
+ *
27
+ * @type {HTMLCanvasElement|OffscreenCanvas}
28
+ */
29
+ this.domElement = domElement;
30
+
31
+ /**
32
+ * The renderer's pixel ratio.
33
+ *
34
+ * @private
35
+ * @type {number}
36
+ * @default 1
37
+ */
38
+ this._pixelRatio = 1;
39
+
40
+ /**
41
+ * The width of the renderer's default framebuffer in logical pixel unit.
42
+ *
43
+ * @private
44
+ * @type {number}
45
+ */
46
+ this._width = this.domElement.width;
47
+
48
+ /**
49
+ * The height of the renderer's default framebuffer in logical pixel unit.
50
+ *
51
+ * @private
52
+ * @type {number}
53
+ */
54
+ this._height = this.domElement.height;
55
+
56
+ /**
57
+ * The viewport of the renderer in logical pixel unit.
58
+ *
59
+ * @private
60
+ * @type {Vector4}
61
+ */
62
+ this._viewport = new Vector4( 0, 0, this._width, this._height );
63
+
64
+ /**
65
+ * The scissor rectangle of the renderer in logical pixel unit.
66
+ *
67
+ * @private
68
+ * @type {Vector4}
69
+ */
70
+ this._scissor = new Vector4( 0, 0, this._width, this._height );
71
+
72
+ /**
73
+ * Whether the scissor test should be enabled or not.
74
+ *
75
+ * @private
76
+ * @type {boolean}
77
+ */
78
+ this._scissorTest = false;
79
+
80
+ /**
81
+ * The color texture of the default framebuffer.
82
+ *
83
+ * @type {FramebufferTexture}
84
+ */
85
+ this.colorTexture = new FramebufferTexture();
86
+
87
+ /**
88
+ * The depth texture of the default framebuffer.
89
+ *
90
+ * @type {DepthTexture}
91
+ */
92
+ this.depthTexture = new DepthTexture();
93
+
94
+ }
95
+
96
+ /**
97
+ * Returns the pixel ratio.
98
+ *
99
+ * @return {number} The pixel ratio.
100
+ */
101
+ getPixelRatio() {
102
+
103
+ return this._pixelRatio;
104
+
105
+ }
106
+
107
+ /**
108
+ * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.
109
+ *
110
+ * @param {Vector2} target - The method writes the result in this target object.
111
+ * @return {Vector2} The drawing buffer size.
112
+ */
113
+ getDrawingBufferSize( target ) {
114
+
115
+ return target.set( this._width * this._pixelRatio, this._height * this._pixelRatio ).floor();
116
+
117
+ }
118
+
119
+ /**
120
+ * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.
121
+ *
122
+ * @param {Vector2} target - The method writes the result in this target object.
123
+ * @return {Vector2} The renderer's size in logical pixels.
124
+ */
125
+ getSize( target ) {
126
+
127
+ return target.set( this._width, this._height );
128
+
129
+ }
130
+
131
+ /**
132
+ * Sets the given pixel ratio and resizes the canvas if necessary.
133
+ *
134
+ * @param {number} [value=1] - The pixel ratio.
135
+ */
136
+ setPixelRatio( value = 1 ) {
137
+
138
+ if ( this._pixelRatio === value ) return;
139
+
140
+ this._pixelRatio = value;
141
+
142
+ this.setSize( this._width, this._height, false );
143
+
144
+ }
145
+
146
+ /**
147
+ * This method allows to define the drawing buffer size by specifying
148
+ * width, height and pixel ratio all at once. The size of the drawing
149
+ * buffer is computed with this formula:
150
+ * ```js
151
+ * size.x = width * pixelRatio;
152
+ * size.y = height * pixelRatio;
153
+ * ```
154
+ *
155
+ * @param {number} width - The width in logical pixels.
156
+ * @param {number} height - The height in logical pixels.
157
+ * @param {number} pixelRatio - The pixel ratio.
158
+ */
159
+ setDrawingBufferSize( width, height, pixelRatio ) {
160
+
161
+ // Renderer can't be resized while presenting in XR.
162
+ if ( this.xr && this.xr.isPresenting ) return;
163
+
164
+ this._width = width;
165
+ this._height = height;
166
+
167
+ this._pixelRatio = pixelRatio;
168
+
169
+ this.domElement.width = Math.floor( width * pixelRatio );
170
+ this.domElement.height = Math.floor( height * pixelRatio );
171
+
172
+ this.setViewport( 0, 0, width, height );
173
+
174
+ this._dispatchResize();
175
+
176
+ }
177
+
178
+ /**
179
+ * Sets the size of the renderer.
180
+ *
181
+ * @param {number} width - The width in logical pixels.
182
+ * @param {number} height - The height in logical pixels.
183
+ * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.
184
+ */
185
+ setSize( width, height, updateStyle = true ) {
186
+
187
+ // Renderer can't be resized while presenting in XR.
188
+ if ( this.xr && this.xr.isPresenting ) return;
189
+
190
+ this._width = width;
191
+ this._height = height;
192
+
193
+ this.domElement.width = Math.floor( width * this._pixelRatio );
194
+ this.domElement.height = Math.floor( height * this._pixelRatio );
195
+
196
+ if ( updateStyle === true ) {
197
+
198
+ this.domElement.style.width = width + 'px';
199
+ this.domElement.style.height = height + 'px';
200
+
201
+ }
202
+
203
+ this.setViewport( 0, 0, width, height );
204
+
205
+ this._dispatchResize();
206
+
207
+ }
208
+
209
+ /**
210
+ * Returns the scissor rectangle.
211
+ *
212
+ * @param {Vector4} target - The method writes the result in this target object.
213
+ * @return {Vector4} The scissor rectangle.
214
+ */
215
+ getScissor( target ) {
216
+
217
+ const scissor = this._scissor;
218
+
219
+ target.x = scissor.x;
220
+ target.y = scissor.y;
221
+ target.width = scissor.width;
222
+ target.height = scissor.height;
223
+
224
+ return target;
225
+
226
+ }
227
+
228
+ /**
229
+ * Defines the scissor rectangle.
230
+ *
231
+ * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the box in logical pixel unit.
232
+ * Instead of passing four arguments, the method also works with a single four-dimensional vector.
233
+ * @param {number} y - The vertical coordinate for the lower left corner of the box in logical pixel unit.
234
+ * @param {number} width - The width of the scissor box in logical pixel unit.
235
+ * @param {number} height - The height of the scissor box in logical pixel unit.
236
+ */
237
+ setScissor( x, y, width, height ) {
238
+
239
+ const scissor = this._scissor;
240
+
241
+ if ( x.isVector4 ) {
242
+
243
+ scissor.copy( x );
244
+
245
+ } else {
246
+
247
+ scissor.set( x, y, width, height );
248
+
249
+ }
250
+
251
+ }
252
+
253
+ /**
254
+ * Returns the scissor test value.
255
+ *
256
+ * @return {boolean} Whether the scissor test should be enabled or not.
257
+ */
258
+ getScissorTest() {
259
+
260
+ return this._scissorTest;
261
+
262
+ }
263
+
264
+ /**
265
+ * Defines the scissor test.
266
+ *
267
+ * @param {boolean} boolean - Whether the scissor test should be enabled or not.
268
+ */
269
+ setScissorTest( boolean ) {
270
+
271
+ this._scissorTest = boolean;
272
+
273
+ }
274
+
275
+ /**
276
+ * Returns the viewport definition.
277
+ *
278
+ * @param {Vector4} target - The method writes the result in this target object.
279
+ * @return {Vector4} The viewport definition.
280
+ */
281
+ getViewport( target ) {
282
+
283
+ return target.copy( this._viewport );
284
+
285
+ }
286
+
287
+ /**
288
+ * Defines the viewport.
289
+ *
290
+ * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.
291
+ * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.
292
+ * @param {number} width - The width of the viewport in logical pixel unit.
293
+ * @param {number} height - The height of the viewport in logical pixel unit.
294
+ * @param {number} minDepth - The minimum depth value of the viewport. WebGPU only.
295
+ * @param {number} maxDepth - The maximum depth value of the viewport. WebGPU only.
296
+ */
297
+ setViewport( x, y, width, height, minDepth = 0, maxDepth = 1 ) {
298
+
299
+ const viewport = this._viewport;
300
+
301
+ if ( x.isVector4 ) {
302
+
303
+ viewport.copy( x );
304
+
305
+ } else {
306
+
307
+ viewport.set( x, y, width, height );
308
+
309
+ }
310
+
311
+ viewport.minDepth = minDepth;
312
+ viewport.maxDepth = maxDepth;
313
+
314
+ }
315
+
316
+ /**
317
+ * Dispatches the resize event.
318
+ *
319
+ * @private
320
+ */
321
+ _dispatchResize() {
322
+
323
+ this.dispatchEvent( { type: 'resize' } );
324
+
325
+ }
326
+
327
+ /**
328
+ * Frees the GPU-related resources allocated by this instance. Call this
329
+ * method whenever this instance is no longer used in your app.
330
+ *
331
+ * @fires RenderTarget#dispose
332
+ */
333
+ dispose() {
334
+
335
+ this.dispatchEvent( { type: 'dispose' } );
336
+
337
+ }
338
+
339
+ }
340
+
341
+ export default CanvasTarget;
@@ -117,6 +117,14 @@ class Geometries extends DataMap {
117
117
  */
118
118
  this.attributeCall = new WeakMap();
119
119
 
120
+ /**
121
+ * Stores the event listeners attached to geometries.
122
+ *
123
+ * @private
124
+ * @type {Map<BufferGeometry,Function>}
125
+ */
126
+ this._geometryDisposeListeners = new Map();
127
+
120
128
  }
121
129
 
122
130
  /**
@@ -189,10 +197,16 @@ class Geometries extends DataMap {
189
197
 
190
198
  geometry.removeEventListener( 'dispose', onDispose );
191
199
 
200
+ this._geometryDisposeListeners.delete( geometry );
201
+
192
202
  };
193
203
 
194
204
  geometry.addEventListener( 'dispose', onDispose );
195
205
 
206
+ // see #31798 why tracking separate remove listeners is required right now
207
+ // TODO: Re-evaluate how onDispose() is managed in this component
208
+ this._geometryDisposeListeners.set( geometry, onDispose );
209
+
196
210
  }
197
211
 
198
212
  /**
@@ -339,6 +353,18 @@ class Geometries extends DataMap {
339
353
 
340
354
  }
341
355
 
356
+ dispose() {
357
+
358
+ for ( const [ geometry, onDispose ] of this._geometryDisposeListeners.entries() ) {
359
+
360
+ geometry.removeEventListener( 'dispose', onDispose );
361
+
362
+ }
363
+
364
+ this._geometryDisposeListeners.clear();
365
+
366
+ }
367
+
342
368
  }
343
369
 
344
370
  export default Geometries;
@@ -1,3 +1,5 @@
1
+ import { error } from '../../utils.js';
2
+
1
3
  /**
2
4
  * This renderer module provides a series of statistical information
3
5
  * about the GPU memory and the rendering process. Useful for debugging
@@ -52,7 +54,7 @@ class Info {
52
54
  * @property {number} triangles - The number of rendered triangle primitives of the current frame.
53
55
  * @property {number} points - The number of rendered point primitives of the current frame.
54
56
  * @property {number} lines - The number of rendered line primitives of the current frame.
55
- * @property {number} timestamp - The timestamp of the frame when using `renderer.renderAsync()`.
57
+ * @property {number} timestamp - The timestamp of the frame.
56
58
  */
57
59
  this.render = {
58
60
  calls: 0,
@@ -123,7 +125,7 @@ class Info {
123
125
 
124
126
  } else {
125
127
 
126
- console.error( 'THREE.WebGPUInfo: Unknown object type.' );
128
+ error( 'WebGPUInfo: Unknown object type.' );
127
129
 
128
130
  }
129
131