@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
@@ -11,8 +11,8 @@ import WebGLCapabilities from './utils/WebGLCapabilities.js';
11
11
  import { GLFeatureName } from './utils/WebGLConstants.js';
12
12
  import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
13
13
 
14
- import { warnOnce } from '../../utils.js';
15
- import { WebGLCoordinateSystem } from '../../constants.js';
14
+ import { warnOnce, warn, error } from '../../utils.js';
15
+ import { WebGLCoordinateSystem, TimestampQuery } from '../../constants.js';
16
16
  import WebGLTimestampQueryPool from './utils/WebGLTimestampQueryPool.js';
17
17
 
18
18
  /**
@@ -198,7 +198,7 @@ class WebGLBackend extends Backend {
198
198
  * the WebXR device API.
199
199
  *
200
200
  * @private
201
- * @type {WebGLFramebuffer}
201
+ * @type {?WebGLFramebuffer}
202
202
  * @default null
203
203
  */
204
204
  this._xrFramebuffer = null;
@@ -219,7 +219,7 @@ class WebGLBackend extends Backend {
219
219
  const parameters = this.parameters;
220
220
 
221
221
  const contextAttributes = {
222
- antialias: renderer.samples > 0,
222
+ antialias: renderer.currentSamples > 0,
223
223
  alpha: true, // always true for performance reasons
224
224
  depth: renderer.depth,
225
225
  stencil: renderer.stencil
@@ -297,19 +297,6 @@ class WebGLBackend extends Backend {
297
297
 
298
298
  }
299
299
 
300
- /**
301
- * Can be used to synchronize CPU operations with GPU tasks. So when this method is called,
302
- * the CPU waits for the GPU to complete its operation (e.g. a compute task).
303
- *
304
- * @async
305
- * @return {Promise} A Promise that resolves when synchronization has been finished.
306
- */
307
- async waitForGPU() {
308
-
309
- await this.utils._clientWaitAsync();
310
-
311
- }
312
-
313
300
  /**
314
301
  * Ensures the backend is XR compatible.
315
302
  *
@@ -363,7 +350,7 @@ class WebGLBackend extends Backend {
363
350
  // are midframe flushes and an external depth texture.
364
351
  if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
365
352
 
366
- console.warn( 'THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
353
+ warn( 'WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
367
354
 
368
355
  }
369
356
 
@@ -376,14 +363,13 @@ class WebGLBackend extends Backend {
376
363
  /**
377
364
  * Inits a time stamp query for the given render context.
378
365
  *
379
- * @param {RenderContext} renderContext - The render context.
366
+ * @param {string} type - The type of the timestamp query.
367
+ * @param {string} uid - A unique identifier for the timestamp query.
380
368
  */
381
- initTimestampQuery( renderContext ) {
369
+ initTimestampQuery( type, uid ) {
382
370
 
383
371
  if ( ! this.disjoint || ! this.trackTimestamp ) return;
384
372
 
385
- const type = renderContext.isComputeNode ? 'compute' : 'render';
386
-
387
373
  if ( ! this.timestampQueryPool[ type ] ) {
388
374
 
389
375
  // TODO: Variable maxQueries?
@@ -393,11 +379,11 @@ class WebGLBackend extends Backend {
393
379
 
394
380
  const timestampQueryPool = this.timestampQueryPool[ type ];
395
381
 
396
- const baseOffset = timestampQueryPool.allocateQueriesForContext( renderContext );
382
+ const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
397
383
 
398
384
  if ( baseOffset !== null ) {
399
385
 
400
- timestampQueryPool.beginQuery( renderContext );
386
+ timestampQueryPool.beginQuery( uid );
401
387
 
402
388
  }
403
389
 
@@ -408,16 +394,16 @@ class WebGLBackend extends Backend {
408
394
  /**
409
395
  * Prepares the timestamp buffer.
410
396
  *
411
- * @param {RenderContext} renderContext - The render context.
397
+ * @param {string} type - The type of the timestamp query.
398
+ * @param {string} uid - A unique identifier for the timestamp query.
412
399
  */
413
- prepareTimestampBuffer( renderContext ) {
400
+ prepareTimestampBuffer( type, uid ) {
414
401
 
415
402
  if ( ! this.disjoint || ! this.trackTimestamp ) return;
416
403
 
417
- const type = renderContext.isComputeNode ? 'compute' : 'render';
418
404
  const timestampQueryPool = this.timestampQueryPool[ type ];
419
405
 
420
- timestampQueryPool.endQuery( renderContext );
406
+ timestampQueryPool.endQuery( uid );
421
407
 
422
408
  }
423
409
 
@@ -467,7 +453,7 @@ class WebGLBackend extends Backend {
467
453
 
468
454
  //
469
455
 
470
- this.initTimestampQuery( renderContext );
456
+ this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
471
457
 
472
458
  renderContextData.previousContext = this._currentContext;
473
459
  this._currentContext = renderContext;
@@ -540,107 +526,8 @@ class WebGLBackend extends Backend {
540
526
  }
541
527
 
542
528
  this._currentContext = previousContext;
543
- const renderTarget = renderContext.renderTarget;
544
-
545
- if ( renderContext.textures !== null && renderTarget ) {
546
-
547
- const renderTargetContextData = this.get( renderTarget );
548
-
549
- if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
550
-
551
- const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
552
-
553
- let mask = gl.COLOR_BUFFER_BIT;
554
-
555
- if ( renderTarget.resolveDepthBuffer ) {
556
-
557
- if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
558
- if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
559
-
560
- }
561
-
562
- const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
563
- const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
564
529
 
565
- const textures = renderContext.textures;
566
- const isMRT = textures.length > 1;
567
-
568
- state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
569
- state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
570
-
571
- if ( isMRT ) {
572
-
573
- // blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
574
- // the engine temporarily removes all attachments and then configures each attachment for the resolve.
575
-
576
- for ( let i = 0; i < textures.length; i ++ ) {
577
-
578
- gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
579
- gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
580
-
581
- }
582
-
583
- }
584
-
585
- for ( let i = 0; i < textures.length; i ++ ) {
586
-
587
- if ( isMRT ) {
588
-
589
- // configure attachment for resolve
590
-
591
- const { textureGPU } = this.get( textures[ i ] );
592
-
593
- gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
594
- gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
595
-
596
- }
597
-
598
- if ( renderContext.scissor ) {
599
-
600
- const { x, y, width, height } = renderContext.scissorValue;
601
-
602
- const viewY = renderContext.height - height - y;
603
-
604
- gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
605
-
606
- } else {
607
-
608
- gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
609
-
610
- }
611
-
612
- }
613
-
614
- if ( isMRT ) {
615
-
616
- // restore attachments
617
-
618
- for ( let i = 0; i < textures.length; i ++ ) {
619
-
620
- const { textureGPU } = this.get( textures[ i ] );
621
-
622
- gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
623
- gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
624
-
625
- }
626
-
627
- }
628
-
629
- if ( this._supportsInvalidateFramebuffer === true ) {
630
-
631
- gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
632
-
633
- }
634
-
635
- } else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
636
-
637
- const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
638
- state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
639
- gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
640
-
641
- }
642
-
643
- }
530
+ this._resolveRenderTarget( renderContext );
644
531
 
645
532
  if ( previousContext !== null ) {
646
533
 
@@ -659,7 +546,7 @@ class WebGLBackend extends Backend {
659
546
 
660
547
  }
661
548
 
662
- this.prepareTimestampBuffer( renderContext );
549
+ this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
663
550
 
664
551
  }
665
552
 
@@ -799,9 +686,11 @@ class WebGLBackend extends Backend {
799
686
  * @param {boolean} depth - Whether the depth buffer should be cleared or not.
800
687
  * @param {boolean} stencil - Whether the stencil buffer should be cleared or not.
801
688
  * @param {?Object} [descriptor=null] - The render context of the current set render target.
802
- * @param {boolean} [setFrameBuffer=true] - TODO.
689
+ * @param {boolean} [setFrameBuffer=true] - Controls whether the intermediate framebuffer should be set or not.
690
+ * @param {boolean} [resolveRenderTarget=true] - Controls whether an active render target should be resolved
691
+ * or not. Only relevant for explicit clears.
803
692
  */
804
- clear( color, depth, stencil, descriptor = null, setFrameBuffer = true ) {
693
+ clear( color, depth, stencil, descriptor = null, setFrameBuffer = true, resolveRenderTarget = true ) {
805
694
 
806
695
  const { gl, renderer } = this;
807
696
 
@@ -884,6 +773,8 @@ class WebGLBackend extends Backend {
884
773
 
885
774
  }
886
775
 
776
+ if ( setFrameBuffer && resolveRenderTarget ) this._resolveRenderTarget( descriptor );
777
+
887
778
  }
888
779
 
889
780
  }
@@ -900,8 +791,10 @@ class WebGLBackend extends Backend {
900
791
 
901
792
  const { state, gl } = this;
902
793
 
794
+ //
795
+
903
796
  state.bindFramebuffer( gl.FRAMEBUFFER, null );
904
- this.initTimestampQuery( computeGroup );
797
+ this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
905
798
 
906
799
  }
907
800
 
@@ -912,7 +805,7 @@ class WebGLBackend extends Backend {
912
805
  * @param {Node} computeNode - The compute node.
913
806
  * @param {Array<BindGroup>} bindings - The bindings.
914
807
  * @param {ComputePipeline} pipeline - The compute pipeline.
915
- * @param {number|null} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
808
+ * @param {?number} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
916
809
  */
917
810
  compute( computeGroup, computeNode, bindings, pipeline, count = null ) {
918
811
 
@@ -959,6 +852,12 @@ class WebGLBackend extends Backend {
959
852
 
960
853
  count = count[ 0 ];
961
854
 
855
+ } else if ( count && typeof count === 'object' && count.isIndirectStorageBufferAttribute ) {
856
+
857
+ warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not IndirectStorageBufferAttribute' );
858
+
859
+ count = computeNode.count;
860
+
962
861
  }
963
862
 
964
863
  if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
@@ -1007,7 +906,7 @@ class WebGLBackend extends Backend {
1007
906
 
1008
907
  gl.disable( gl.RASTERIZER_DISCARD );
1009
908
 
1010
- this.prepareTimestampBuffer( computeGroup );
909
+ this.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
1011
910
 
1012
911
  if ( this._currentContext ) {
1013
912
 
@@ -1169,12 +1068,12 @@ class WebGLBackend extends Backend {
1169
1068
  if ( object._multiDrawInstances !== null ) {
1170
1069
 
1171
1070
  // @deprecated, r174
1172
- warnOnce( 'THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1071
+ warnOnce( 'WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
1173
1072
  renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
1174
1073
 
1175
1074
  } else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) {
1176
1075
 
1177
- warnOnce( 'THREE.WebGLRenderer: WEBGL_multi_draw not supported.' );
1076
+ warnOnce( 'WebGLBackend: WEBGL_multi_draw not supported.' );
1178
1077
 
1179
1078
  } else {
1180
1079
 
@@ -1246,7 +1145,7 @@ class WebGLBackend extends Backend {
1246
1145
  this._currentContext.activeCubeFace = i;
1247
1146
 
1248
1147
  this._setFramebuffer( this._currentContext );
1249
- this.clear( false, true, stencilBuffer, this._currentContext, false );
1148
+ this.clear( false, true, stencilBuffer, this._currentContext, false, false );
1250
1149
 
1251
1150
  }
1252
1151
 
@@ -1387,10 +1286,11 @@ class WebGLBackend extends Backend {
1387
1286
  * Destroys the GPU data for the given texture object.
1388
1287
  *
1389
1288
  * @param {Texture} texture - The texture.
1289
+ * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
1390
1290
  */
1391
- destroyTexture( texture ) {
1291
+ destroyTexture( texture, isDefaultTexture = false ) {
1392
1292
 
1393
- this.textureUtils.destroyTexture( texture );
1293
+ this.textureUtils.destroyTexture( texture, isDefaultTexture );
1394
1294
 
1395
1295
  }
1396
1296
 
@@ -1415,21 +1315,15 @@ class WebGLBackend extends Backend {
1415
1315
  /**
1416
1316
  * This method does nothing since WebGL 2 has no concept of samplers.
1417
1317
  *
1418
- * @param {Texture} texture - The texture to create the sampler for.
1318
+ * @param {Texture} texture - The texture to update the sampler for.
1319
+ * @return {string} The current sampler key.
1419
1320
  */
1420
- createSampler( /*texture*/ ) {
1321
+ updateSampler( /*texture*/ ) {
1421
1322
 
1422
- //console.warn( 'Abstract class.' );
1323
+ return '';
1423
1324
 
1424
1325
  }
1425
1326
 
1426
- /**
1427
- * This method does nothing since WebGL 2 has no concept of samplers.
1428
- *
1429
- * @param {Texture} texture - The texture to destroy the sampler for.
1430
- */
1431
- destroySampler( /*texture*/ ) {}
1432
-
1433
1327
  // node builder
1434
1328
 
1435
1329
  /**
@@ -1632,7 +1526,7 @@ class WebGLBackend extends Backend {
1632
1526
  const vertexErrors = this._getShaderErrors( gl, glVertexShader, 'vertex' );
1633
1527
  const fragmentErrors = this._getShaderErrors( gl, glFragmentShader, 'fragment' );
1634
1528
 
1635
- console.error(
1529
+ error(
1636
1530
  'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
1637
1531
  'VALIDATE_STATUS ' + gl.getProgramParameter( programGPU, gl.VALIDATE_STATUS ) + '\n\n' +
1638
1532
  'Program Info Log: ' + programLog + '\n' +
@@ -1644,7 +1538,7 @@ class WebGLBackend extends Backend {
1644
1538
 
1645
1539
  } else if ( programLog !== '' ) {
1646
1540
 
1647
- console.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );
1541
+ warn( 'WebGLProgram: Program Info Log:', programLog );
1648
1542
 
1649
1543
  }
1650
1544
 
@@ -1845,28 +1739,46 @@ class WebGLBackend extends Backend {
1845
1739
 
1846
1740
  for ( const binding of bindGroup.bindings ) {
1847
1741
 
1742
+ const map = this.get( binding );
1743
+
1848
1744
  if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1849
1745
 
1850
1746
  const data = binding.buffer;
1851
- const bufferGPU = gl.createBuffer();
1747
+ let { bufferGPU } = this.get( data );
1852
1748
 
1853
- gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1854
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1749
+ if ( bufferGPU === undefined ) {
1855
1750
 
1856
- this.set( binding, {
1857
- index: i ++,
1858
- bufferGPU
1859
- } );
1751
+ // create
1752
+
1753
+ bufferGPU = gl.createBuffer();
1754
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1755
+ gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1756
+
1757
+ this.set( data, { bufferGPU } );
1758
+
1759
+ } else {
1760
+
1761
+ // update
1762
+
1763
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1764
+ gl.bufferSubData( gl.UNIFORM_BUFFER, 0, data );
1765
+
1766
+ }
1767
+
1768
+ map.index = i ++;
1769
+ map.bufferGPU = bufferGPU;
1770
+
1771
+ this.set( binding, map );
1860
1772
 
1861
1773
  } else if ( binding.isSampledTexture ) {
1862
1774
 
1863
1775
  const { textureGPU, glTextureType } = this.get( binding.texture );
1864
1776
 
1865
- this.set( binding, {
1866
- index: t ++,
1867
- textureGPU,
1868
- glTextureType
1869
- } );
1777
+ map.index = t ++;
1778
+ map.textureGPU = textureGPU;
1779
+ map.glTextureType = glTextureType;
1780
+
1781
+ this.set( binding, map );
1870
1782
 
1871
1783
  }
1872
1784
 
@@ -2092,8 +2004,9 @@ class WebGLBackend extends Backend {
2092
2004
  const { textureGPU } = this.get( textures[ 0 ] );
2093
2005
 
2094
2006
  const cubeFace = this.renderer._activeCubeFace;
2007
+ const mipLevel = this.renderer._activeMipmapLevel;
2095
2008
 
2096
- gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
2009
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
2097
2010
 
2098
2011
  } else {
2099
2012
 
@@ -2115,8 +2028,9 @@ class WebGLBackend extends Backend {
2115
2028
  } else if ( isRenderTarget3D || isRenderTargetArray ) {
2116
2029
 
2117
2030
  const layer = this.renderer._activeCubeFace;
2031
+ const mipLevel = this.renderer._activeMipmapLevel;
2118
2032
 
2119
- gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, layer );
2033
+ gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
2120
2034
 
2121
2035
  } else {
2122
2036
 
@@ -2126,7 +2040,9 @@ class WebGLBackend extends Backend {
2126
2040
 
2127
2041
  } else {
2128
2042
 
2129
- gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0 );
2043
+ const mipLevel = this.renderer._activeMipmapLevel;
2044
+
2045
+ gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
2130
2046
 
2131
2047
  }
2132
2048
 
@@ -2543,6 +2459,120 @@ class WebGLBackend extends Backend {
2543
2459
 
2544
2460
  }
2545
2461
 
2462
+ /**
2463
+ * The method ensures multisampled render targets are resolved.
2464
+ *
2465
+ * @private
2466
+ * @param {RenderContext} renderContext - The render context.
2467
+ */
2468
+ _resolveRenderTarget( renderContext ) {
2469
+
2470
+ const { gl, state } = this;
2471
+
2472
+ const renderTarget = renderContext.renderTarget;
2473
+
2474
+ if ( renderContext.textures !== null && renderTarget ) {
2475
+
2476
+ const renderTargetContextData = this.get( renderTarget );
2477
+
2478
+ if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
2479
+
2480
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2481
+
2482
+ let mask = gl.COLOR_BUFFER_BIT;
2483
+
2484
+ if ( renderTarget.resolveDepthBuffer ) {
2485
+
2486
+ if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
2487
+ if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
2488
+
2489
+ }
2490
+
2491
+ const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
2492
+ const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
2493
+
2494
+ const textures = renderContext.textures;
2495
+ const isMRT = textures.length > 1;
2496
+
2497
+ state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
2498
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2499
+
2500
+ if ( isMRT ) {
2501
+
2502
+ // blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
2503
+ // the engine temporarily removes all attachments and then configures each attachment for the resolve.
2504
+
2505
+ for ( let i = 0; i < textures.length; i ++ ) {
2506
+
2507
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
2508
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
2509
+
2510
+ }
2511
+
2512
+ }
2513
+
2514
+ for ( let i = 0; i < textures.length; i ++ ) {
2515
+
2516
+ if ( isMRT ) {
2517
+
2518
+ // configure attachment for resolve
2519
+
2520
+ const { textureGPU } = this.get( textures[ i ] );
2521
+
2522
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
2523
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
2524
+
2525
+ }
2526
+
2527
+ if ( renderContext.scissor ) {
2528
+
2529
+ const { x, y, width, height } = renderContext.scissorValue;
2530
+
2531
+ const viewY = renderContext.height - height - y;
2532
+
2533
+ gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
2534
+
2535
+ } else {
2536
+
2537
+ gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
2538
+
2539
+ }
2540
+
2541
+ }
2542
+
2543
+ if ( isMRT ) {
2544
+
2545
+ // restore attachments
2546
+
2547
+ for ( let i = 0; i < textures.length; i ++ ) {
2548
+
2549
+ const { textureGPU } = this.get( textures[ i ] );
2550
+
2551
+ gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
2552
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
2553
+
2554
+ }
2555
+
2556
+ }
2557
+
2558
+ if ( this._supportsInvalidateFramebuffer === true ) {
2559
+
2560
+ gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
2561
+
2562
+ }
2563
+
2564
+ } else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
2565
+
2566
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
2567
+ state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
2568
+ gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
2569
+
2570
+ }
2571
+
2572
+ }
2573
+
2574
+ }
2575
+
2546
2576
  /**
2547
2577
  * Returns `true` if the `WEBGL_multisampled_render_to_texture` extension
2548
2578
  * should be used when MSAA is enabled.
@@ -2568,6 +2598,8 @@ class WebGLBackend extends Backend {
2568
2598
  */
2569
2599
  dispose() {
2570
2600
 
2601
+ if ( this.textureUtils !== null ) this.textureUtils.dispose();
2602
+
2571
2603
  const extension = this.extensions.get( 'WEBGL_lose_context' );
2572
2604
  if ( extension ) extension.loseContext();
2573
2605