@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -329,6 +329,47 @@ class GLSLNodeBuilder extends NodeBuilder {
329
329
 
330
330
  }
331
331
 
332
+ /**
333
+ * Returns the native snippet for a genuinely per-component vector select.
334
+ * GLSL has no vector ternary, so `float` types use `mix()`'s `bvecN`-selector
335
+ * overload; `int`/`uint`/`bool` types use an arithmetic select instead, since
336
+ * that overload doesn't exist for them.
337
+ *
338
+ * @param {string} condSnippet - The per-component boolean (`bvecN`) condition.
339
+ * @param {string} ifSnippet - The vector expression selected where `condSnippet` is `true`.
340
+ * @param {string} elseSnippet - The vector expression selected where `condSnippet` is `false`.
341
+ * @param {string} type - The (vector) type of `ifSnippet`/`elseSnippet`.
342
+ * @return {string} The resolved method name.
343
+ */
344
+ getVectorSelect( condSnippet, ifSnippet, elseSnippet, type ) {
345
+
346
+ const componentType = this.getComponentType( type );
347
+
348
+ if ( componentType === 'float' ) {
349
+
350
+ return `mix( ${elseSnippet}, ${ifSnippet}, ${condSnippet} )`;
351
+
352
+ }
353
+
354
+ const glslType = this.getType( type );
355
+
356
+ if ( componentType === 'bool' ) {
357
+
358
+ const intType = this.getType( this.getTypeFromLength( this.getTypeLength( type ), 'int' ) );
359
+ const maskSnippet = `${intType}( ${condSnippet} )`;
360
+ const ifIntSnippet = `${intType}( ${ifSnippet} )`;
361
+ const elseIntSnippet = `${intType}( ${elseSnippet} )`;
362
+
363
+ return `${glslType}( ${elseIntSnippet} + ${maskSnippet} * ( ${ifIntSnippet} - ${elseIntSnippet} ) )`;
364
+
365
+ }
366
+
367
+ const maskSnippet = `${glslType}( ${condSnippet} )`;
368
+
369
+ return `${elseSnippet} + ${maskSnippet} * ( ${ifSnippet} - ${elseSnippet} )`;
370
+
371
+ }
372
+
332
373
  /**
333
374
  * Returns the output struct name. Not relevant for GLSL.
334
375
  *
@@ -560,7 +601,10 @@ ${ flowData.code }
560
601
 
561
602
  }
562
603
 
563
- this.addLineFlowCode( `${ propertyName } = ${prefix}(${ snippet })${channel}`, storageArrayElementNode );
604
+ const texelType = this.getTypeFromLength( itemSize, this.getComponentType( prefix ) );
605
+ const elementType = storageArrayElementNode.getNodeType( this );
606
+
607
+ this.addLineFlowCode( `${ propertyName } = ${ this.format( `${prefix}(${ snippet })${channel}`, texelType, elementType ) }`, storageArrayElementNode );
564
608
 
565
609
  elementNodeData.propertyName = propertyName;
566
610
 
@@ -680,6 +724,18 @@ ${ flowData.code }
680
724
 
681
725
  if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
682
726
 
727
+ if ( texture.isDepthTexture ) {
728
+
729
+ if ( offsetSnippet ) {
730
+
731
+ return `textureLodOffset( ${ textureProperty }, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } ).x`;
732
+
733
+ }
734
+
735
+ return `textureLod( ${ textureProperty }, ${ uvSnippet }, ${ levelSnippet } ).x`;
736
+
737
+ }
738
+
683
739
  if ( offsetSnippet ) {
684
740
 
685
741
  return `textureLodOffset( ${ textureProperty }, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;
@@ -858,6 +914,41 @@ ${ flowData.code }
858
914
 
859
915
  }
860
916
 
917
+ /**
918
+ * Returns the uniform block name of the given buffer uniform.
919
+ *
920
+ * @param {NodeUniform} uniform - The buffer uniform.
921
+ * @param {string} shaderStage - The shader stage.
922
+ * @return {string} The uniform block name.
923
+ */
924
+ getUniformBufferName( uniform, shaderStage ) {
925
+
926
+ return this.getDataFromNode( uniform.node, shaderStage, this.globalCache ).uniformGPU.name;
927
+
928
+ }
929
+
930
+ /**
931
+ * Returns a bind group for the given group name and bindings. Uniform blocks are
932
+ * named after their position in the group since shared bind groups are created
933
+ * by one build but looked up by name in the programs of every build sharing them.
934
+ *
935
+ * @private
936
+ * @param {string} groupName - The group name.
937
+ * @param {Array<NodeUniformsGroup>} bindings - List of bindings.
938
+ * @return {BindGroup} The bind group
939
+ */
940
+ _getBindGroup( groupName, bindings ) {
941
+
942
+ for ( let i = 0; i < bindings.length; i ++ ) {
943
+
944
+ if ( bindings[ i ].isNodeUniformBuffer === true ) bindings[ i ].name = 'NodeBuffer_' + groupName + '_' + i;
945
+
946
+ }
947
+
948
+ return super._getBindGroup( groupName, bindings );
949
+
950
+ }
951
+
861
952
  /**
862
953
  * Returns the uniforms of the given shader stage as a GLSL string.
863
954
  *
@@ -935,7 +1026,7 @@ ${ flowData.code }
935
1026
  const bufferCount = bufferNode.bufferCount;
936
1027
 
937
1028
  const bufferCountSnippet = bufferCount > 0 ? bufferCount : '';
938
- snippet = `${bufferNode.name} {\n\t${ bufferType } ${ uniform.name }[${ bufferCountSnippet }];\n};\n`;
1029
+ snippet = `${ this.getUniformBufferName( uniform, shaderStage ) } {\n\t${ bufferType } ${ uniform.name }[${ bufferCountSnippet }];\n};\n`;
939
1030
 
940
1031
  } else {
941
1032
 
@@ -1137,6 +1228,34 @@ ${ flowData.code }
1137
1228
 
1138
1229
  }
1139
1230
 
1231
+ /**
1232
+ * Returns a single const variable statement as a GLSL string for the given variable type and name.
1233
+ *
1234
+ * @param {string} type - The variable's type.
1235
+ * @param {string} name - The variable's name.
1236
+ * @param {?number} [count=null] - The array length.
1237
+ * @return {string} The GLSL snippet that defines a const variable.
1238
+ */
1239
+ generateConstStatement( type, name, count = null ) {
1240
+
1241
+ return `const ${ this.getVar( type, name, count ) }`;
1242
+
1243
+ }
1244
+
1245
+ /**
1246
+ * Returns a single variable statement as a GLSL string for the given variable type and name.
1247
+ *
1248
+ * @param {string} type - The variable's type.
1249
+ * @param {string} name - The variable's name.
1250
+ * @param {?number} [count=null] - The array length.
1251
+ * @return {string} The GLSL snippet that defines a variable.
1252
+ */
1253
+ generateVarStatement( type, name, count = null ) {
1254
+
1255
+ return this.getVar( type, name, count );
1256
+
1257
+ }
1258
+
1140
1259
  /**
1141
1260
  * Returns the varyings of the given shader stage as a GLSL string.
1142
1261
  *
@@ -1145,7 +1264,7 @@ ${ flowData.code }
1145
1264
  */
1146
1265
  getVaryings( shaderStage ) {
1147
1266
 
1148
- let snippet = '';
1267
+ let snippet = shaderStage === 'vertex' && this.context.invariant === true ? 'invariant gl_Position;\n' : '';
1149
1268
 
1150
1269
  const varyings = this.varyings;
1151
1270
 
@@ -1287,6 +1406,36 @@ ${ flowData.code }
1287
1406
 
1288
1407
  }
1289
1408
 
1409
+ /**
1410
+ * Enables subgroups.
1411
+ */
1412
+ enableSubGroups() {
1413
+
1414
+ error( 'GLSLNodeBuilder: WebGLBackend does not support subgroup operations' );
1415
+
1416
+ }
1417
+
1418
+ /**
1419
+ * Enables 16 bit floats.
1420
+ */
1421
+ enableShaderF16() {
1422
+
1423
+ error( 'GLSLNodeBuilder: WebGLBackend does not support 16 bit floats' );
1424
+
1425
+ }
1426
+
1427
+ /**
1428
+ * Enables dual source blending.
1429
+ *
1430
+ * WebGL 2 can express this through the `WEBGL_blend_func_extended` extension,
1431
+ * but WebGLBackend does not implement it.
1432
+ */
1433
+ enableDualSourceBlending() {
1434
+
1435
+ error( 'GLSLNodeBuilder: WebGLBackend does not support dual source blending' );
1436
+
1437
+ }
1438
+
1290
1439
  /**
1291
1440
  * Returns the draw index builtin.
1292
1441
  *
@@ -1760,7 +1909,7 @@ void main() {
1760
1909
  */
1761
1910
  getUniformFromNode( node, type, shaderStage, name = null ) {
1762
1911
 
1763
- const uniformNode = super.getUniformFromNode( node, type, shaderStage, name );
1912
+ const uniformNode = super.getUniformFromNode( node, type, shaderStage, type === 'buffer' ? null : name );
1764
1913
  const nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );
1765
1914
 
1766
1915
  let uniformGPU = nodeData.uniformGPU;
@@ -1789,22 +1938,7 @@ void main() {
1789
1938
 
1790
1939
  } else if ( type === 'buffer' ) {
1791
1940
 
1792
- uniformNode.name = `buffer${ node.id }`;
1793
-
1794
- const sharedData = this.getSharedDataFromNode( node );
1795
-
1796
- let buffer = sharedData.buffer;
1797
-
1798
- if ( buffer === undefined ) {
1799
-
1800
- node.name = `NodeBuffer_${ node.id }`;
1801
-
1802
- buffer = new NodeUniformBuffer( node, group );
1803
- buffer.name = node.name;
1804
-
1805
- sharedData.buffer = buffer;
1806
-
1807
- }
1941
+ const buffer = new NodeUniformBuffer( node, group );
1808
1942
 
1809
1943
  bindings.push( buffer );
1810
1944
 
@@ -23,14 +23,7 @@ class DualAttributeData {
23
23
  this.version = attributeData.version;
24
24
  this.isInteger = attributeData.isInteger;
25
25
  this.activeBufferIndex = 0;
26
- this.baseId = attributeData.id;
27
-
28
- }
29
-
30
-
31
- get id() {
32
-
33
- return `${ this.baseId }|${ this.activeBufferIndex }`;
26
+ this.id = attributeData.id;
34
27
 
35
28
  }
36
29
 
@@ -88,23 +81,14 @@ class WebGLAttributeUtils {
88
81
  const backend = this.backend;
89
82
  const { gl } = backend;
90
83
 
91
- const array = attribute.array;
92
- const usage = attribute.usage || gl.STATIC_DRAW;
93
-
94
- const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
95
- const bufferData = backend.get( bufferAttribute );
96
-
97
- let bufferGPU = bufferData.bufferGPU;
98
-
99
- if ( bufferGPU === undefined ) {
84
+ const bufferAttribute = backend.getBufferAttribute( attribute );
100
85
 
101
- bufferGPU = this._createBuffer( gl, bufferType, array, usage );
86
+ if ( backend.get( bufferAttribute ).bufferGPU !== undefined ) return;
102
87
 
103
- bufferData.bufferGPU = bufferGPU;
104
- bufferData.bufferType = bufferType;
105
- bufferData.version = bufferAttribute.version;
88
+ const array = attribute.array;
89
+ const usage = attribute.usage || gl.STATIC_DRAW;
106
90
 
107
- }
91
+ const bufferGPU = this._createBuffer( gl, bufferType, array, usage );
108
92
 
109
93
  //attribute.onUploadCallback();
110
94
 
@@ -166,7 +150,7 @@ class WebGLAttributeUtils {
166
150
  type,
167
151
  byteLength: array.byteLength,
168
152
  bytesPerElement: array.BYTES_PER_ELEMENT,
169
- version: attribute.version,
153
+ version: bufferAttribute.version,
170
154
  pbo: attribute.pbo,
171
155
  isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType,
172
156
  id: _id ++
@@ -180,7 +164,7 @@ class WebGLAttributeUtils {
180
164
 
181
165
  }
182
166
 
183
- backend.set( attribute, attributeData );
167
+ backend.set( bufferAttribute, attributeData );
184
168
 
185
169
  }
186
170
 
@@ -195,25 +179,29 @@ class WebGLAttributeUtils {
195
179
  const { gl } = backend;
196
180
 
197
181
  const array = attribute.array;
198
- const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
182
+ const bufferAttribute = backend.getBufferAttribute( attribute );
199
183
  const bufferData = backend.get( bufferAttribute );
200
- const bufferType = bufferData.bufferType;
201
- const updateRanges = attribute.isInterleavedBufferAttribute ? attribute.data.updateRanges : attribute.updateRanges;
184
+ const updateRanges = bufferAttribute.updateRanges;
202
185
 
203
- gl.bindBuffer( bufferType, bufferData.bufferGPU );
186
+ // the element buffer binding is part of the VAO state, so index buffers are updated
187
+ // via the copy target to keep the bound VAO intact
188
+
189
+ const target = bufferData.bufferType === gl.ELEMENT_ARRAY_BUFFER ? gl.COPY_WRITE_BUFFER : bufferData.bufferType;
190
+
191
+ gl.bindBuffer( target, bufferData.bufferGPU );
204
192
 
205
193
  if ( updateRanges.length === 0 ) {
206
194
 
207
195
  // Not using update ranges
208
196
 
209
- gl.bufferSubData( bufferType, 0, array );
197
+ gl.bufferSubData( target, 0, array );
210
198
 
211
199
  } else {
212
200
 
213
201
  for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
214
202
 
215
203
  const range = updateRanges[ i ];
216
- gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
204
+ gl.bufferSubData( target, range.start * array.BYTES_PER_ELEMENT,
217
205
  array, range.start, range.count );
218
206
 
219
207
  }
@@ -222,7 +210,7 @@ class WebGLAttributeUtils {
222
210
 
223
211
  }
224
212
 
225
- gl.bindBuffer( bufferType, null );
213
+ gl.bindBuffer( target, null );
226
214
 
227
215
  bufferData.version = bufferAttribute.version;
228
216
 
@@ -238,17 +226,25 @@ class WebGLAttributeUtils {
238
226
  const backend = this.backend;
239
227
  const { gl } = backend;
240
228
 
241
- if ( attribute.isInterleavedBufferAttribute ) {
229
+ const bufferAttribute = backend.getBufferAttribute( attribute );
230
+ const attributeData = backend.get( bufferAttribute );
242
231
 
243
- backend.delete( attribute.data );
232
+ if ( attributeData.buffers !== undefined ) {
244
233
 
245
- }
234
+ // storage attributes hold a second buffer for transform feedback
235
+ for ( const buffer of attributeData.buffers ) {
246
236
 
247
- const attributeData = backend.get( attribute );
237
+ gl.deleteBuffer( buffer );
248
238
 
249
- gl.deleteBuffer( attributeData.bufferGPU );
239
+ }
240
+
241
+ } else {
250
242
 
251
- backend.delete( attribute );
243
+ gl.deleteBuffer( attributeData.bufferGPU );
244
+
245
+ }
246
+
247
+ backend.delete( bufferAttribute );
252
248
 
253
249
  }
254
250
 
@@ -259,10 +255,10 @@ class WebGLAttributeUtils {
259
255
  * new allocation.
260
256
  *
261
257
  * @async
262
- * @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
263
- * @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
264
- * @param {number} offset - The storage buffer attribute.
265
- * @param {number} count - The offset from which to start reading the
258
+ * @param {BufferAttribute} attribute - The storage buffer attribute to read from.
259
+ * @param {?(ReadbackBuffer|ArrayBuffer)} [target=null] - The readback buffer or array buffer that receives the data. If `null`, a new array buffer is returned.
260
+ * @param {number} [offset=0] - The byte offset to start reading from. Must be a multiple of 4.
261
+ * @param {number} [count=-1] - The number of bytes to read. Must be a multiple of 4, or `-1` to read to the end of the buffer.
266
262
  * @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
267
263
  */
268
264
  async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
@@ -270,7 +266,7 @@ class WebGLAttributeUtils {
270
266
  const backend = this.backend;
271
267
  const { gl } = backend;
272
268
 
273
- const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
269
+ const bufferAttribute = backend.getBufferAttribute( attribute );
274
270
  const attributeInfo = backend.get( bufferAttribute );
275
271
  const { bufferGPU } = attributeInfo;
276
272
 
@@ -346,6 +342,13 @@ class WebGLAttributeUtils {
346
342
 
347
343
  const bufferGPU = gl.createBuffer();
348
344
 
345
+ // the element buffer binding is part of the VAO state, so the bound VAO must not be affected.
346
+ // the first binding defines the buffer type so the copy target can not be used here
347
+
348
+ const state = this.backend.state;
349
+
350
+ if ( bufferType === gl.ELEMENT_ARRAY_BUFFER && state.currentVAO !== null ) state.resetVertexState();
351
+
349
352
  gl.bindBuffer( bufferType, bufferGPU );
350
353
  gl.bufferData( bufferType, array, usage );
351
354
  gl.bindBuffer( bufferType, null );
@@ -285,6 +285,13 @@ class WebGLState {
285
285
 
286
286
  }
287
287
 
288
+ /**
289
+ * Defines the blending for each draw buffer of a MRT-configured render target.
290
+ *
291
+ * @param {Array<Texture>} textures - The textures of the render target.
292
+ * @param {?MRTNode} mrt - The MRT configuration.
293
+ * @param {Material} material - The material whose blending is used for outputs with `MaterialBlending`.
294
+ */
288
295
  setMRTBlending( textures, mrt, material ) {
289
296
 
290
297
  const gl = this.gl;
@@ -339,6 +346,17 @@ class WebGLState {
339
346
 
340
347
  }
341
348
 
349
+ // invalidate cache
350
+
351
+ this.currentBlending = null;
352
+ this.currentBlendEquation = null;
353
+ this.currentBlendEquationAlpha = null;
354
+ this.currentBlendSrc = null;
355
+ this.currentBlendDst = null;
356
+ this.currentBlendSrcAlpha = null;
357
+ this.currentBlendDstAlpha = null;
358
+ this.currentPremultipledAlpha = null;
359
+
342
360
  }
343
361
 
344
362
  /**
@@ -1004,11 +1022,18 @@ class WebGLState {
1004
1022
 
1005
1023
  if ( this.currentPolygonOffsetFactor !== factor || this.currentPolygonOffsetUnits !== units ) {
1006
1024
 
1007
- gl.polygonOffset( factor, units );
1008
-
1009
1025
  this.currentPolygonOffsetFactor = factor;
1010
1026
  this.currentPolygonOffsetUnits = units;
1011
1027
 
1028
+ if ( this.currentDepthReversed ) {
1029
+
1030
+ factor = - factor;
1031
+ units = - units;
1032
+
1033
+ }
1034
+
1035
+ gl.polygonOffset( factor, units );
1036
+
1012
1037
  }
1013
1038
 
1014
1039
  } else {
@@ -1160,7 +1185,7 @@ class WebGLState {
1160
1185
 
1161
1186
  if ( drawBuffers === undefined ) {
1162
1187
 
1163
- drawBuffers = [];
1188
+ drawBuffers = [ gl.COLOR_ATTACHMENT0 ];
1164
1189
  this.currentDrawbuffers.set( framebuffer, drawBuffers );
1165
1190
 
1166
1191
  }
@@ -1168,7 +1193,7 @@ class WebGLState {
1168
1193
 
1169
1194
  const textures = renderContext.textures;
1170
1195
 
1171
- if ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {
1196
+ if ( drawBuffers.length !== textures.length ) {
1172
1197
 
1173
1198
  for ( let i = 0, il = textures.length; i < il; i ++ ) {
1174
1199