super-three 0.167.0 → 0.169.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/build/three.cjs +532 -173
  2. package/build/three.module.js +532 -174
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +18173 -14266
  5. package/build/three.webgpu.min.js +1 -1
  6. package/build/three.webgpu.nodes.js +79941 -0
  7. package/build/three.webgpu.nodes.min.js +6 -0
  8. package/examples/jsm/Addons.js +0 -4
  9. package/examples/jsm/animation/AnimationClipCreator.js +1 -1
  10. package/examples/jsm/capabilities/WebGL.js +27 -21
  11. package/examples/jsm/controls/ArcballControls.js +174 -158
  12. package/examples/jsm/controls/DragControls.js +260 -132
  13. package/examples/jsm/controls/FirstPersonControls.js +175 -163
  14. package/examples/jsm/controls/FlyControls.js +194 -188
  15. package/examples/jsm/controls/OrbitControls.js +777 -786
  16. package/examples/jsm/controls/PointerLockControls.js +24 -15
  17. package/examples/jsm/controls/TrackballControls.js +469 -448
  18. package/examples/jsm/controls/TransformControls.js +97 -62
  19. package/examples/jsm/effects/AnaglyphEffect.js +6 -13
  20. package/examples/jsm/effects/ParallaxBarrierEffect.js +17 -11
  21. package/examples/jsm/effects/StereoEffect.js +6 -1
  22. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  23. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  24. package/examples/jsm/exporters/EXRExporter.js +19 -11
  25. package/examples/jsm/exporters/GLTFExporter.js +6 -1
  26. package/examples/jsm/exporters/KTX2Exporter.js +21 -13
  27. package/examples/jsm/exporters/OBJExporter.js +5 -1
  28. package/examples/jsm/exporters/PLYExporter.js +9 -7
  29. package/examples/jsm/exporters/USDZExporter.js +29 -8
  30. package/examples/jsm/geometries/DecalGeometry.js +4 -1
  31. package/examples/jsm/geometries/InstancedPointsGeometry.js +1 -1
  32. package/examples/jsm/helpers/LightProbeHelper.js +43 -44
  33. package/examples/jsm/helpers/LightProbeHelperGPU.js +65 -0
  34. package/examples/jsm/libs/basis/basis_transcoder.js +8 -10
  35. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  36. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  37. package/examples/jsm/lights/LightProbeGenerator.js +24 -10
  38. package/examples/jsm/loaders/ColladaLoader.js +9 -6
  39. package/examples/jsm/loaders/DRACOLoader.js +3 -1
  40. package/examples/jsm/loaders/FBXLoader.js +30 -20
  41. package/examples/jsm/loaders/GLTFLoader.js +5 -10
  42. package/examples/jsm/loaders/KTX2Loader.js +27 -12
  43. package/examples/jsm/loaders/MTLLoader.js +4 -3
  44. package/examples/jsm/loaders/MaterialXLoader.js +40 -14
  45. package/examples/jsm/loaders/OBJLoader.js +5 -3
  46. package/examples/jsm/loaders/PCDLoader.js +14 -13
  47. package/examples/jsm/loaders/PDBLoader.js +3 -2
  48. package/examples/jsm/loaders/PLYLoader.js +8 -5
  49. package/examples/jsm/loaders/STLLoader.js +3 -2
  50. package/examples/jsm/loaders/VRMLLoader.js +10 -10
  51. package/examples/jsm/loaders/VTKLoader.js +4 -3
  52. package/examples/jsm/loaders/XYZLoader.js +3 -2
  53. package/examples/jsm/misc/Timer.js +1 -1
  54. package/examples/jsm/modifiers/CurveModifierGPU.js +233 -0
  55. package/examples/jsm/objects/LensflareMesh.js +322 -0
  56. package/examples/jsm/objects/SkyMesh.js +187 -0
  57. package/examples/jsm/objects/Water2Mesh.js +158 -0
  58. package/examples/jsm/objects/WaterMesh.js +101 -0
  59. package/examples/jsm/physics/JoltPhysics.js +1 -1
  60. package/examples/jsm/physics/RapierPhysics.js +21 -1
  61. package/examples/jsm/postprocessing/OutlinePass.js +31 -46
  62. package/examples/jsm/postprocessing/SSAARenderPass.js +3 -1
  63. package/examples/jsm/shaders/BleachBypassShader.js +1 -2
  64. package/examples/jsm/shaders/OutputShader.js +1 -1
  65. package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
  66. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -2
  67. package/examples/jsm/transpiler/TSLEncoder.js +8 -8
  68. package/examples/jsm/utils/GeometryCompressionUtils.js +37 -122
  69. package/examples/jsm/utils/ShadowMapViewer.js +3 -8
  70. package/examples/jsm/utils/ShadowMapViewerGPU.js +201 -0
  71. package/examples/jsm/utils/SkeletonUtils.js +84 -66
  72. package/examples/jsm/utils/TextureUtils.js +2 -1
  73. package/examples/jsm/utils/TextureUtilsGPU.js +63 -0
  74. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  75. package/package.json +3 -2
  76. package/src/Three.WebGPU.Nodes.js +200 -0
  77. package/src/Three.WebGPU.js +7 -0
  78. package/src/Three.js +1 -0
  79. package/src/audio/Audio.js +2 -2
  80. package/src/constants.js +1 -1
  81. package/src/core/BufferAttribute.js +0 -9
  82. package/src/core/Clock.js +1 -1
  83. package/src/core/InterleavedBuffer.js +0 -9
  84. package/src/extras/Controls.js +32 -0
  85. package/src/geometries/CylinderGeometry.js +11 -4
  86. package/src/loaders/MaterialLoader.js +7 -1
  87. package/src/loaders/ObjectLoader.js +3 -3
  88. package/src/{nodes/loaders → loaders/nodes}/NodeLoader.js +25 -5
  89. package/src/{nodes/loaders → loaders/nodes}/NodeMaterialLoader.js +21 -18
  90. package/src/{nodes/loaders → loaders/nodes}/NodeObjectLoader.js +19 -0
  91. package/src/materials/Material.js +4 -7
  92. package/src/materials/nodes/InstancedPointsNodeMaterial.js +156 -0
  93. package/src/{nodes/materials → materials/nodes}/Line2NodeMaterial.js +56 -59
  94. package/src/{nodes/materials → materials/nodes}/LineBasicNodeMaterial.js +8 -5
  95. package/src/{nodes/materials → materials/nodes}/LineDashedNodeMaterial.js +12 -10
  96. package/src/{nodes/materials → materials/nodes}/MeshBasicNodeMaterial.js +16 -12
  97. package/src/{nodes/materials → materials/nodes}/MeshLambertNodeMaterial.js +10 -6
  98. package/src/{nodes/materials → materials/nodes}/MeshMatcapNodeMaterial.js +13 -9
  99. package/src/{nodes/materials → materials/nodes}/MeshNormalNodeMaterial.js +13 -9
  100. package/src/{nodes/materials → materials/nodes}/MeshPhongNodeMaterial.js +14 -9
  101. package/src/{nodes/materials → materials/nodes}/MeshPhysicalNodeMaterial.js +22 -18
  102. package/src/{nodes/materials → materials/nodes}/MeshSSSNodeMaterial.js +10 -7
  103. package/src/{nodes/materials → materials/nodes}/MeshStandardNodeMaterial.js +22 -12
  104. package/src/{nodes/materials → materials/nodes}/MeshToonNodeMaterial.js +9 -5
  105. package/src/{nodes/materials → materials/nodes}/NodeMaterial.js +71 -115
  106. package/src/{nodes/materials/Materials.js → materials/nodes/NodeMaterials.js} +3 -1
  107. package/src/{nodes/materials → materials/nodes}/PointsNodeMaterial.js +8 -5
  108. package/src/{nodes/materials → materials/nodes}/ShadowNodeMaterial.js +9 -5
  109. package/src/{nodes/materials → materials/nodes}/SpriteNodeMaterial.js +47 -14
  110. package/src/{nodes/materials → materials/nodes}/VolumeNodeMaterial.js +24 -22
  111. package/src/materials/nodes/manager/NodeMaterialObserver.js +302 -0
  112. package/src/math/Triangle.js +24 -0
  113. package/src/nodes/Nodes.js +103 -159
  114. package/src/nodes/TSL.js +179 -0
  115. package/src/nodes/accessors/AccessorsUtils.js +8 -8
  116. package/src/nodes/accessors/BatchNode.js +53 -21
  117. package/src/nodes/accessors/{BitangentNode.js → Bitangent.js} +9 -9
  118. package/src/nodes/accessors/BufferAttributeNode.js +8 -5
  119. package/src/nodes/accessors/BufferNode.js +7 -4
  120. package/src/nodes/accessors/Camera.js +13 -0
  121. package/src/nodes/accessors/ClippingNode.js +19 -13
  122. package/src/nodes/accessors/CubeTextureNode.js +9 -8
  123. package/src/nodes/accessors/InstanceNode.js +19 -15
  124. package/src/nodes/accessors/InstancedPointsMaterialNode.js +8 -5
  125. package/src/nodes/accessors/Lights.js +51 -0
  126. package/src/nodes/accessors/MaterialNode.js +56 -55
  127. package/src/nodes/accessors/MaterialProperties.js +3 -0
  128. package/src/nodes/accessors/MaterialReferenceNode.js +9 -4
  129. package/src/nodes/accessors/ModelNode.js +47 -12
  130. package/src/nodes/accessors/ModelViewProjectionNode.js +12 -9
  131. package/src/nodes/accessors/MorphNode.js +17 -13
  132. package/src/nodes/accessors/Normal.js +88 -0
  133. package/src/nodes/accessors/Object3DNode.js +17 -33
  134. package/src/nodes/accessors/PointUVNode.js +9 -5
  135. package/src/nodes/accessors/Position.js +10 -0
  136. package/src/nodes/accessors/ReferenceBaseNode.js +171 -0
  137. package/src/nodes/accessors/ReferenceNode.js +50 -7
  138. package/src/nodes/accessors/ReflectVector.js +10 -0
  139. package/src/nodes/accessors/RendererReferenceNode.js +12 -6
  140. package/src/nodes/accessors/SceneNode.js +9 -6
  141. package/src/nodes/accessors/SkinningNode.js +88 -21
  142. package/src/nodes/accessors/StorageBufferNode.js +22 -5
  143. package/src/nodes/accessors/StorageTextureNode.js +9 -6
  144. package/src/nodes/accessors/Tangent.js +22 -0
  145. package/src/nodes/accessors/Texture3DNode.js +16 -13
  146. package/src/nodes/accessors/{TextureBicubicNode.js → TextureBicubic.js} +3 -32
  147. package/src/nodes/accessors/TextureNode.js +29 -23
  148. package/src/nodes/accessors/TextureSizeNode.js +10 -9
  149. package/src/nodes/accessors/{UniformsNode.js → UniformArrayNode.js} +26 -14
  150. package/src/nodes/accessors/UserDataNode.js +10 -7
  151. package/src/nodes/accessors/VelocityNode.js +134 -0
  152. package/src/nodes/accessors/VertexColorNode.js +7 -4
  153. package/src/nodes/code/CodeNode.js +9 -5
  154. package/src/nodes/code/ExpressionNode.js +10 -6
  155. package/src/nodes/code/FunctionCallNode.js +8 -5
  156. package/src/nodes/code/FunctionNode.js +8 -23
  157. package/src/nodes/code/ScriptableNode.js +13 -10
  158. package/src/nodes/code/ScriptableValueNode.js +9 -7
  159. package/src/nodes/core/AssignNode.js +12 -9
  160. package/src/nodes/core/AttributeNode.js +12 -21
  161. package/src/nodes/core/BypassNode.js +11 -7
  162. package/src/nodes/core/CacheNode.js +10 -6
  163. package/src/nodes/core/ConstNode.js +6 -3
  164. package/src/nodes/core/ContextNode.js +21 -11
  165. package/src/nodes/core/IndexNode.js +35 -8
  166. package/src/nodes/core/InputNode.js +7 -3
  167. package/src/nodes/core/MRTNode.js +16 -7
  168. package/src/nodes/core/Node.js +19 -40
  169. package/src/nodes/core/NodeBuilder.js +117 -38
  170. package/src/nodes/core/NodeUtils.js +49 -6
  171. package/src/nodes/core/OutputStructNode.js +10 -6
  172. package/src/nodes/core/ParameterNode.js +7 -4
  173. package/src/nodes/core/PropertyNode.js +36 -32
  174. package/src/nodes/core/StackNode.js +31 -11
  175. package/src/nodes/core/StructTypeNode.js +7 -3
  176. package/src/nodes/core/TempNode.js +8 -4
  177. package/src/nodes/core/UniformGroupNode.js +14 -11
  178. package/src/nodes/core/UniformNode.js +7 -4
  179. package/src/nodes/core/VarNode.js +12 -8
  180. package/src/nodes/core/VaryingNode.js +10 -6
  181. package/src/nodes/display/AfterImageNode.js +15 -9
  182. package/src/nodes/display/AnaglyphPassNode.js +67 -0
  183. package/src/nodes/display/AnamorphicNode.js +17 -11
  184. package/src/nodes/display/BleachBypass.js +26 -0
  185. package/src/nodes/display/BlendMode.js +54 -0
  186. package/src/nodes/display/BloomNode.js +27 -19
  187. package/src/nodes/display/BumpMapNode.js +13 -12
  188. package/src/nodes/display/ColorAdjustment.js +46 -0
  189. package/src/nodes/display/ColorSpaceFunctions.js +38 -0
  190. package/src/nodes/display/ColorSpaceNode.js +67 -61
  191. package/src/nodes/display/DenoiseNode.js +23 -17
  192. package/src/nodes/display/DepthOfFieldNode.js +12 -7
  193. package/src/nodes/display/DotScreenNode.js +13 -22
  194. package/src/nodes/display/FXAANode.js +21 -16
  195. package/src/nodes/display/FilmNode.js +11 -7
  196. package/src/nodes/display/FrontFacingNode.js +10 -6
  197. package/src/nodes/display/GTAONode.js +22 -15
  198. package/src/nodes/display/GaussianBlurNode.js +14 -8
  199. package/src/nodes/display/Lut3DNode.js +10 -6
  200. package/src/nodes/display/MotionBlur.js +25 -0
  201. package/src/nodes/display/NormalMapNode.js +13 -13
  202. package/src/nodes/display/ParallaxBarrierPassNode.js +58 -0
  203. package/src/nodes/display/PassNode.js +95 -8
  204. package/src/nodes/display/PixelationPassNode.js +20 -8
  205. package/src/nodes/display/PosterizeNode.js +8 -7
  206. package/src/nodes/display/RGBShiftNode.js +11 -7
  207. package/src/nodes/display/RenderOutputNode.js +15 -11
  208. package/src/nodes/display/SSAAPassNode.js +287 -0
  209. package/src/nodes/display/ScreenNode.js +181 -0
  210. package/src/nodes/display/Sepia.js +17 -0
  211. package/src/nodes/display/SobelOperatorNode.js +13 -8
  212. package/src/nodes/display/StereoCompositePassNode.js +110 -0
  213. package/src/nodes/display/StereoPassNode.js +83 -0
  214. package/src/nodes/display/ToneMappingFunctions.js +190 -0
  215. package/src/nodes/display/ToneMappingNode.js +15 -175
  216. package/src/nodes/display/ToonOutlinePassNode.js +111 -0
  217. package/src/nodes/display/TransitionNode.js +12 -8
  218. package/src/nodes/display/ViewportDepthNode.js +34 -29
  219. package/src/nodes/display/ViewportDepthTextureNode.js +10 -9
  220. package/src/nodes/display/ViewportSharedTextureNode.js +10 -9
  221. package/src/nodes/display/ViewportTextureNode.js +11 -11
  222. package/src/nodes/fog/FogExp2Node.js +8 -7
  223. package/src/nodes/fog/FogNode.js +10 -8
  224. package/src/nodes/fog/FogRangeNode.js +8 -7
  225. package/src/nodes/functions/BSDF/BRDF_GGX.js +4 -4
  226. package/src/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  227. package/src/nodes/functions/BSDF/BRDF_Sheen.js +6 -6
  228. package/src/nodes/functions/BSDF/DFGApprox.js +2 -2
  229. package/src/nodes/functions/BSDF/D_GGX.js +2 -2
  230. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +3 -3
  231. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  232. package/src/nodes/functions/BSDF/F_Schlick.js +2 -2
  233. package/src/nodes/functions/BSDF/LTC.js +6 -6
  234. package/src/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
  235. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  236. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  237. package/src/nodes/functions/BasicLightingModel.js +1 -1
  238. package/src/nodes/functions/PhongLightingModel.js +5 -5
  239. package/src/nodes/functions/PhysicalLightingModel.js +34 -33
  240. package/src/nodes/functions/ShadowMaskModel.js +1 -1
  241. package/src/nodes/functions/ToonLightingModel.js +3 -3
  242. package/src/nodes/functions/material/getGeometryRoughness.js +4 -4
  243. package/src/nodes/functions/material/getRoughness.js +2 -2
  244. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  245. package/src/nodes/geometry/RangeNode.js +9 -5
  246. package/src/nodes/gpgpu/AtomicFunctionNode.js +99 -0
  247. package/src/nodes/gpgpu/BarrierNode.js +40 -0
  248. package/src/nodes/gpgpu/ComputeBuiltinNode.js +98 -0
  249. package/src/nodes/gpgpu/ComputeNode.js +10 -6
  250. package/src/nodes/gpgpu/WorkgroupInfoNode.js +100 -0
  251. package/src/nodes/lighting/AONode.js +6 -3
  252. package/src/nodes/lighting/AmbientLightNode.js +6 -8
  253. package/src/nodes/lighting/AnalyticLightNode.js +225 -36
  254. package/src/nodes/lighting/BasicEnvironmentNode.js +8 -4
  255. package/src/nodes/lighting/BasicLightMapNode.js +7 -4
  256. package/src/nodes/lighting/DirectionalLightNode.js +7 -9
  257. package/src/nodes/lighting/EnvironmentNode.js +23 -19
  258. package/src/nodes/lighting/HemisphereLightNode.js +11 -11
  259. package/src/nodes/lighting/IESSpotLightNode.js +7 -9
  260. package/src/nodes/lighting/IrradianceNode.js +6 -3
  261. package/src/nodes/lighting/LightProbeNode.js +53 -0
  262. package/src/nodes/lighting/LightUtils.js +3 -3
  263. package/src/nodes/lighting/LightingContextNode.js +19 -18
  264. package/src/nodes/lighting/LightingNode.js +7 -3
  265. package/src/nodes/lighting/LightsNode.js +112 -75
  266. package/src/nodes/lighting/PointLightNode.js +12 -13
  267. package/src/nodes/lighting/RectAreaLightNode.js +11 -11
  268. package/src/nodes/lighting/SpotLightNode.js +14 -16
  269. package/src/nodes/materialx/MaterialXNodes.js +2 -2
  270. package/src/nodes/materialx/lib/mx_hsv.js +36 -31
  271. package/src/nodes/materialx/lib/mx_noise.js +96 -96
  272. package/src/nodes/materialx/lib/mx_transform_color.js +2 -2
  273. package/src/nodes/math/{CondNode.js → ConditionalNode.js} +38 -10
  274. package/src/nodes/math/Hash.js +13 -0
  275. package/src/nodes/math/MathNode.js +127 -124
  276. package/src/nodes/math/MathUtils.js +0 -7
  277. package/src/nodes/math/OperatorNode.js +97 -52
  278. package/src/nodes/math/TriNoise3D.js +19 -29
  279. package/src/nodes/pmrem/PMREMNode.js +61 -15
  280. package/src/nodes/pmrem/PMREMUtils.js +46 -46
  281. package/src/nodes/procedural/Checker.js +14 -0
  282. package/src/nodes/tsl/TSLBase.js +30 -0
  283. package/src/nodes/{shadernode/ShaderNode.js → tsl/TSLCore.js} +105 -97
  284. package/src/nodes/utils/ArrayElementNode.js +8 -4
  285. package/src/nodes/utils/ConvertNode.js +7 -3
  286. package/src/nodes/utils/CubeMapNode.js +160 -0
  287. package/src/nodes/utils/Discard.js +8 -0
  288. package/src/nodes/utils/EquirectUVNode.js +9 -6
  289. package/src/nodes/utils/FlipNode.js +68 -0
  290. package/src/nodes/utils/FunctionOverloadingNode.js +9 -5
  291. package/src/nodes/utils/JoinNode.js +6 -3
  292. package/src/nodes/utils/LoopNode.js +16 -6
  293. package/src/nodes/utils/MatcapUVNode.js +10 -7
  294. package/src/nodes/utils/MaxMipLevelNode.js +8 -5
  295. package/src/nodes/utils/OscNode.js +12 -8
  296. package/src/nodes/utils/Packing.js +4 -0
  297. package/src/nodes/utils/RTTNode.js +11 -8
  298. package/src/nodes/utils/ReflectorNode.js +12 -4
  299. package/src/nodes/utils/RemapNode.js +12 -8
  300. package/src/nodes/utils/RotateNode.js +8 -13
  301. package/src/nodes/utils/SetNode.js +7 -4
  302. package/src/nodes/utils/SplitNode.js +7 -3
  303. package/src/nodes/utils/SpriteSheetUVNode.js +10 -6
  304. package/src/nodes/utils/SpriteUtils.js +47 -0
  305. package/src/nodes/utils/StorageArrayElementNode.js +11 -12
  306. package/src/nodes/utils/TimerNode.js +8 -5
  307. package/src/nodes/utils/TriplanarTexturesNode.js +11 -9
  308. package/src/nodes/utils/UVUtils.js +19 -0
  309. package/src/nodes/utils/ViewportUtils.js +14 -0
  310. package/src/objects/BatchedMesh.js +78 -13
  311. package/src/objects/LOD.js +21 -0
  312. package/src/objects/Line.js +1 -0
  313. package/src/objects/Mesh.js +7 -23
  314. package/src/objects/Points.js +2 -0
  315. package/src/renderers/WebGLRenderer.js +88 -41
  316. package/src/renderers/common/Backend.js +2 -2
  317. package/src/renderers/common/Background.js +3 -1
  318. package/src/renderers/common/BindGroup.js +3 -1
  319. package/src/renderers/common/Bindings.js +13 -15
  320. package/src/renderers/common/BundleGroup.js +26 -0
  321. package/src/renderers/common/ClippingContext.js +15 -5
  322. package/src/renderers/common/CubeRenderTarget.js +9 -3
  323. package/src/renderers/common/PostProcessing.js +4 -1
  324. package/src/renderers/common/QuadMesh.js +2 -0
  325. package/src/renderers/common/RenderContext.js +23 -0
  326. package/src/renderers/common/RenderList.js +1 -1
  327. package/src/renderers/common/RenderObject.js +117 -6
  328. package/src/renderers/common/RenderObjects.js +8 -1
  329. package/src/renderers/common/Renderer.js +128 -94
  330. package/src/renderers/common/SampledTexture.js +12 -3
  331. package/src/renderers/common/Textures.js +8 -12
  332. package/src/renderers/common/extras/PMREMGenerator.js +19 -22
  333. package/src/renderers/common/nodes/NodeBuilderState.js +4 -4
  334. package/src/renderers/common/nodes/NodeLibrary.js +118 -0
  335. package/src/renderers/common/nodes/NodeSampledTexture.js +2 -2
  336. package/src/renderers/common/nodes/Nodes.js +65 -19
  337. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +2 -2
  338. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +2 -4
  339. package/src/renderers/webgl/WebGLAttributes.js +45 -14
  340. package/src/renderers/webgl/WebGLCapabilities.js +9 -0
  341. package/src/renderers/webgl/WebGLProgram.js +3 -1
  342. package/src/renderers/webgl/WebGLPrograms.js +21 -17
  343. package/src/renderers/webgl/WebGLProperties.js +7 -0
  344. package/src/renderers/webgl/WebGLState.js +21 -0
  345. package/src/renderers/webgl/WebGLTextures.js +83 -4
  346. package/src/renderers/webgl-fallback/WebGLBackend.js +135 -110
  347. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +60 -12
  348. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +6 -0
  349. package/src/renderers/webgl-fallback/utils/WebGLState.js +20 -2
  350. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +89 -37
  351. package/src/renderers/webgpu/WebGPUBackend.js +112 -86
  352. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +42 -0
  353. package/src/renderers/webgpu/WebGPURenderer.js +9 -6
  354. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +59 -0
  355. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +105 -0
  356. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +189 -73
  357. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +6 -16
  358. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +45 -21
  359. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -1
  360. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +7 -16
  361. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +62 -5
  362. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +43 -26
  363. package/src/renderers/webgpu/utils/WebGPUUtils.js +19 -2
  364. package/src/renderers/webxr/WebXRManager.js +32 -25
  365. package/src/utils.js +33 -1
  366. package/examples/jsm/geometries/SDFGeometryGenerator.js +0 -144
  367. package/examples/jsm/loaders/LogLuvLoader.js +0 -606
  368. package/examples/jsm/loaders/TiltLoader.js +0 -520
  369. package/examples/jsm/utils/GPUStatsPanel.js +0 -95
  370. package/examples/jsm/utils/PackedPhongMaterial.js +0 -178
  371. package/src/nodes/accessors/CameraNode.js +0 -19
  372. package/src/nodes/accessors/NormalNode.js +0 -14
  373. package/src/nodes/accessors/PositionNode.js +0 -10
  374. package/src/nodes/accessors/ReflectVectorNode.js +0 -10
  375. package/src/nodes/accessors/TangentNode.js +0 -23
  376. package/src/nodes/core/NodeKeywords.js +0 -80
  377. package/src/nodes/display/BlendModeNode.js +0 -128
  378. package/src/nodes/display/ColorAdjustmentNode.js +0 -104
  379. package/src/nodes/display/ViewportNode.js +0 -137
  380. package/src/nodes/lighting/LightNode.js +0 -57
  381. package/src/nodes/materials/InstancedPointsNodeMaterial.js +0 -162
  382. package/src/nodes/math/HashNode.js +0 -34
  383. package/src/nodes/procedural/CheckerNode.js +0 -42
  384. package/src/nodes/utils/DiscardNode.js +0 -28
  385. package/src/nodes/utils/PackingNode.js +0 -55
  386. package/src/nodes/utils/RotateUVNode.js +0 -35
  387. /package/src/nodes/accessors/{UVNode.js → UV.js} +0 -0
@@ -171,6 +171,28 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
171
171
 
172
172
  }
173
173
 
174
+ if ( glFormat === _gl.RGB_INTEGER ) {
175
+
176
+ if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;
177
+ if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;
178
+ if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;
179
+ if ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;
180
+ if ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;
181
+ if ( glType === _gl.INT ) internalFormat = _gl.RGB32I;
182
+
183
+ }
184
+
185
+ if ( glFormat === _gl.RGBA_INTEGER ) {
186
+
187
+ if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;
188
+ if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;
189
+ if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;
190
+ if ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;
191
+ if ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;
192
+ if ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;
193
+
194
+ }
195
+
174
196
  if ( glFormat === _gl.RGB ) {
175
197
 
176
198
  if ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;
@@ -1722,6 +1744,37 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1722
1744
  const renderTargetProperties = properties.get( renderTarget );
1723
1745
  const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
1724
1746
 
1747
+ // if the bound depth texture has changed
1748
+ if ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {
1749
+
1750
+ // fire the dispose event to get rid of stored state associated with the previously bound depth buffer
1751
+ const depthTexture = renderTarget.depthTexture;
1752
+ if ( renderTargetProperties.__depthDisposeCallback ) {
1753
+
1754
+ renderTargetProperties.__depthDisposeCallback();
1755
+
1756
+ }
1757
+
1758
+ // set up dispose listeners to track when the currently attached buffer is implicitly unbound
1759
+ if ( depthTexture ) {
1760
+
1761
+ const disposeEvent = () => {
1762
+
1763
+ delete renderTargetProperties.__boundDepthTexture;
1764
+ delete renderTargetProperties.__depthDisposeCallback;
1765
+ depthTexture.removeEventListener( 'dispose', disposeEvent );
1766
+
1767
+ };
1768
+
1769
+ depthTexture.addEventListener( 'dispose', disposeEvent );
1770
+ renderTargetProperties.__depthDisposeCallback = disposeEvent;
1771
+
1772
+ }
1773
+
1774
+ renderTargetProperties.__boundDepthTexture = depthTexture;
1775
+
1776
+ }
1777
+
1725
1778
  if ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {
1726
1779
 
1727
1780
  if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );
@@ -1737,16 +1790,42 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1737
1790
  for ( let i = 0; i < 6; i ++ ) {
1738
1791
 
1739
1792
  state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );
1740
- renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
1741
- setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );
1793
+
1794
+ if ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {
1795
+
1796
+ renderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();
1797
+ setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );
1798
+
1799
+ } else {
1800
+
1801
+ // attach buffer if it's been created already
1802
+ const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
1803
+ const renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];
1804
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
1805
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );
1806
+
1807
+ }
1742
1808
 
1743
1809
  }
1744
1810
 
1745
1811
  } else {
1746
1812
 
1747
1813
  state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
1748
- renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
1749
- setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );
1814
+
1815
+ if ( renderTargetProperties.__webglDepthbuffer === undefined ) {
1816
+
1817
+ renderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();
1818
+ setupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );
1819
+
1820
+ } else {
1821
+
1822
+ // attach buffer if it's been created already
1823
+ const glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
1824
+ const renderbuffer = renderTargetProperties.__webglDepthbuffer;
1825
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );
1826
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );
1827
+
1828
+ }
1750
1829
 
1751
1830
  }
1752
1831
 
@@ -1,5 +1,6 @@
1
1
  import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
2
2
  import Backend from '../common/Backend.js';
3
+ import { getCacheKey } from '../common/RenderContext.js';
3
4
 
4
5
  import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
5
6
  import WebGLState from './utils/WebGLState.js';
@@ -52,10 +53,16 @@ class WebGLBackend extends Backend {
52
53
  this.trackTimestamp = ( parameters.trackTimestamp === true );
53
54
 
54
55
  this.extensions.get( 'EXT_color_buffer_float' );
56
+ this.extensions.get( 'WEBGL_clip_cull_distance' );
57
+ this.extensions.get( 'OES_texture_float_linear' );
58
+ this.extensions.get( 'EXT_color_buffer_half_float' );
59
+ this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
60
+ this.extensions.get( 'WEBGL_render_shared_exponent' );
55
61
  this.extensions.get( 'WEBGL_multi_draw' );
56
62
 
57
63
  this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
58
64
  this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
65
+
59
66
  this._currentContext = null;
60
67
 
61
68
  }
@@ -201,7 +208,7 @@ class WebGLBackend extends Backend {
201
208
 
202
209
  const { x, y, width, height } = renderContext.scissorValue;
203
210
 
204
- gl.scissor( x, y, width, height );
211
+ gl.scissor( x, renderContext.height - height - y, width, height );
205
212
 
206
213
  }
207
214
 
@@ -229,6 +236,20 @@ class WebGLBackend extends Backend {
229
236
  const renderContextData = this.get( renderContext );
230
237
  const previousContext = renderContextData.previousContext;
231
238
 
239
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
240
+
241
+ if ( occlusionQueryCount > 0 ) {
242
+
243
+ if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
244
+
245
+ gl.endQuery( gl.ANY_SAMPLES_PASSED );
246
+
247
+ }
248
+
249
+ this.resolveOccludedAsync( renderContext );
250
+
251
+ }
252
+
232
253
  const textures = renderContext.textures;
233
254
 
234
255
  if ( textures !== null ) {
@@ -249,18 +270,18 @@ class WebGLBackend extends Backend {
249
270
 
250
271
  this._currentContext = previousContext;
251
272
 
252
-
253
273
  if ( renderContext.textures !== null && renderContext.renderTarget ) {
254
274
 
255
275
  const renderTargetContextData = this.get( renderContext.renderTarget );
256
276
 
257
277
  const { samples } = renderContext.renderTarget;
258
- const fb = renderTargetContextData.framebuffer;
259
-
260
- const mask = gl.COLOR_BUFFER_BIT;
261
278
 
262
279
  if ( samples > 0 ) {
263
280
 
281
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
282
+
283
+ const mask = gl.COLOR_BUFFER_BIT;
284
+
264
285
  const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
265
286
 
266
287
  const textures = renderContext.textures;
@@ -272,9 +293,21 @@ class WebGLBackend extends Backend {
272
293
 
273
294
  // TODO Add support for MRT
274
295
 
275
- gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
296
+ if ( renderContext.scissor ) {
297
+
298
+ const { x, y, width, height } = renderContext.scissorValue;
299
+
300
+ const viewY = renderContext.height - height - y;
301
+
302
+ gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
303
+ gl.invalidateSubFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray, x, viewY, width, height );
276
304
 
277
- gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
305
+ } else {
306
+
307
+ gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
308
+ gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
309
+
310
+ }
278
311
 
279
312
  }
280
313
 
@@ -293,32 +326,12 @@ class WebGLBackend extends Backend {
293
326
 
294
327
  } else {
295
328
 
296
- const gl = this.gl;
297
-
298
329
  gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
299
330
 
300
331
  }
301
332
 
302
333
  }
303
334
 
304
- const occlusionQueryCount = renderContext.occlusionQueryCount;
305
-
306
- if ( occlusionQueryCount > 0 ) {
307
-
308
- const renderContextData = this.get( renderContext );
309
-
310
- if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
311
-
312
- const { gl } = this;
313
-
314
- gl.endQuery( gl.ANY_SAMPLES_PASSED );
315
-
316
- }
317
-
318
- this.resolveOccludedAsync( renderContext );
319
-
320
- }
321
-
322
335
  this.prepareTimestampBuffer( renderContext );
323
336
 
324
337
  }
@@ -394,7 +407,7 @@ class WebGLBackend extends Backend {
394
407
  const gl = this.gl;
395
408
  const { x, y, width, height } = renderContext.viewportValue;
396
409
 
397
- gl.viewport( x, y, width, height );
410
+ gl.viewport( x, renderContext.height - height - y, width, height );
398
411
 
399
412
  }
400
413
 
@@ -439,6 +452,12 @@ class WebGLBackend extends Backend {
439
452
 
440
453
  const clearColor = descriptor.clearColorValue || this.getClearColor();
441
454
 
455
+ // premultiply alpha
456
+
457
+ clearColor.r *= clearColor.a;
458
+ clearColor.g *= clearColor.a;
459
+ clearColor.b *= clearColor.a;
460
+
442
461
  if ( depth ) this.state.setDepthMask( true );
443
462
 
444
463
  if ( descriptor.textures === null ) {
@@ -482,16 +501,16 @@ class WebGLBackend extends Backend {
482
501
 
483
502
  beginCompute( computeGroup ) {
484
503
 
485
- const gl = this.gl;
504
+ const { state, gl } = this;
486
505
 
487
- gl.bindFramebuffer( gl.FRAMEBUFFER, null );
506
+ state.bindFramebuffer( gl.FRAMEBUFFER, null );
488
507
  this.initTimestampQuery( computeGroup );
489
508
 
490
509
  }
491
510
 
492
511
  compute( computeGroup, computeNode, bindings, pipeline ) {
493
512
 
494
- const gl = this.gl;
513
+ const { state, gl } = this;
495
514
 
496
515
  if ( ! this.discard ) {
497
516
 
@@ -517,7 +536,7 @@ class WebGLBackend extends Backend {
517
536
 
518
537
  }
519
538
 
520
- gl.useProgram( programGPU );
539
+ state.useProgram( programGPU );
521
540
 
522
541
  this._bindUniforms( bindings );
523
542
 
@@ -579,6 +598,10 @@ class WebGLBackend extends Backend {
579
598
 
580
599
  const contextData = this.get( context );
581
600
 
601
+ const drawParms = renderObject.getDrawParameters();
602
+
603
+ if ( drawParms === null ) return;
604
+
582
605
  //
583
606
 
584
607
  this._bindUniforms( renderObject.getBindings() );
@@ -587,7 +610,7 @@ class WebGLBackend extends Backend {
587
610
 
588
611
  state.setMaterial( material, frontFaceCW );
589
612
 
590
- gl.useProgram( programGPU );
613
+ state.useProgram( programGPU );
591
614
 
592
615
  //
593
616
 
@@ -617,10 +640,6 @@ class WebGLBackend extends Backend {
617
640
 
618
641
  const index = renderObject.getIndex();
619
642
 
620
- const geometry = renderObject.geometry;
621
- const drawRange = renderObject.drawRange;
622
- const firstVertex = drawRange.start;
623
-
624
643
  //
625
644
 
626
645
  const lastObject = contextData.lastOcclusionObject;
@@ -651,7 +670,6 @@ class WebGLBackend extends Backend {
651
670
  }
652
671
 
653
672
  //
654
-
655
673
  const renderer = this.bufferRenderer;
656
674
 
657
675
  if ( object.isPoints ) renderer.mode = gl.POINTS;
@@ -675,33 +693,26 @@ class WebGLBackend extends Backend {
675
693
 
676
694
  //
677
695
 
678
-
679
- let count;
696
+ const { vertexCount, instanceCount } = drawParms;
697
+ let { firstVertex } = drawParms;
680
698
 
681
699
  renderer.object = object;
682
700
 
683
701
  if ( index !== null ) {
684
702
 
703
+ firstVertex *= index.array.BYTES_PER_ELEMENT;
704
+
685
705
  const indexData = this.get( index );
686
- const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
687
706
 
688
707
  renderer.index = index.count;
689
708
  renderer.type = indexData.type;
690
709
 
691
- count = indexCount;
692
-
693
710
  } else {
694
711
 
695
712
  renderer.index = 0;
696
713
 
697
- const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : geometry.attributes.position.count;
698
-
699
- count = vertexCount;
700
-
701
714
  }
702
715
 
703
- const instanceCount = this.getInstanceCount( renderObject );
704
-
705
716
  if ( object.isBatchedMesh ) {
706
717
 
707
718
  if ( object._multiDrawInstances !== null ) {
@@ -720,11 +731,11 @@ class WebGLBackend extends Backend {
720
731
 
721
732
  } else if ( instanceCount > 1 ) {
722
733
 
723
- renderer.renderInstances( firstVertex, count, instanceCount );
734
+ renderer.renderInstances( firstVertex, vertexCount, instanceCount );
724
735
 
725
736
  } else {
726
737
 
727
- renderer.render( firstVertex, count );
738
+ renderer.render( firstVertex, vertexCount );
728
739
 
729
740
  }
730
741
  //
@@ -739,9 +750,9 @@ class WebGLBackend extends Backend {
739
750
 
740
751
  }
741
752
 
742
- getRenderCacheKey( renderObject ) {
753
+ getRenderCacheKey( /*renderObject*/ ) {
743
754
 
744
- return renderObject.id;
755
+ return '';
745
756
 
746
757
  }
747
758
 
@@ -778,9 +789,9 @@ class WebGLBackend extends Backend {
778
789
 
779
790
  }
780
791
 
781
- copyTextureToBuffer( texture, x, y, width, height ) {
792
+ copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {
782
793
 
783
- return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height );
794
+ return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height, faceIndex );
784
795
 
785
796
  }
786
797
 
@@ -966,7 +977,7 @@ class WebGLBackend extends Backend {
966
977
 
967
978
  _completeCompile( renderObject, pipeline ) {
968
979
 
969
- const gl = this.gl;
980
+ const { state, gl } = this;
970
981
  const pipelineData = this.get( pipeline );
971
982
  const { programGPU, fragmentShader, vertexShader } = pipelineData;
972
983
 
@@ -976,7 +987,7 @@ class WebGLBackend extends Backend {
976
987
 
977
988
  }
978
989
 
979
- gl.useProgram( programGPU );
990
+ state.useProgram( programGPU );
980
991
 
981
992
  // Bindings
982
993
 
@@ -994,7 +1005,7 @@ class WebGLBackend extends Backend {
994
1005
 
995
1006
  createComputePipeline( computePipeline, bindings ) {
996
1007
 
997
- const gl = this.gl;
1008
+ const { state, gl } = this;
998
1009
 
999
1010
  // Program
1000
1011
 
@@ -1044,7 +1055,7 @@ class WebGLBackend extends Backend {
1044
1055
 
1045
1056
  }
1046
1057
 
1047
- gl.useProgram( programGPU );
1058
+ state.useProgram( programGPU );
1048
1059
 
1049
1060
  // Bindings
1050
1061
 
@@ -1096,40 +1107,52 @@ class WebGLBackend extends Backend {
1096
1107
 
1097
1108
  updateBindings( bindGroup, bindings ) {
1098
1109
 
1110
+ if ( ! bindGroup ) return;
1111
+
1099
1112
  const { gl } = this;
1100
1113
 
1101
- let groupIndex = 0;
1102
- let textureIndex = 0;
1114
+ const bindingsData = this.get( bindings );
1115
+ const bindGroupData = this.get( bindGroup );
1103
1116
 
1104
- for ( const bindGroup of bindings ) {
1117
+ if ( bindingsData.textureIndex === undefined ) bindingsData.textureIndex = 0;
1105
1118
 
1106
- for ( const binding of bindGroup.bindings ) {
1119
+ if ( bindGroupData.textureIndex === undefined ) {
1107
1120
 
1108
- if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1121
+ bindGroupData.textureIndex = bindingsData.textureIndex;
1109
1122
 
1110
- const bufferGPU = gl.createBuffer();
1111
- const data = binding.buffer;
1123
+ } else {
1112
1124
 
1113
- gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1114
- gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1115
- gl.bindBufferBase( gl.UNIFORM_BUFFER, groupIndex, bufferGPU );
1125
+ // reset textureIndex to match previous mappimgs when rebuilt
1126
+ bindingsData.textureIndex = bindGroupData.textureIndex;
1116
1127
 
1117
- this.set( binding, {
1118
- index: groupIndex ++,
1119
- bufferGPU
1120
- } );
1128
+ }
1121
1129
 
1122
- } else if ( binding.isSampledTexture ) {
1130
+ let i = 0;
1123
1131
 
1124
- const { textureGPU, glTextureType } = this.get( binding.texture );
1132
+ for ( const binding of bindGroup.bindings ) {
1125
1133
 
1126
- this.set( binding, {
1127
- index: textureIndex ++,
1128
- textureGPU,
1129
- glTextureType
1130
- } );
1134
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1131
1135
 
1132
- }
1136
+ const data = binding.buffer;
1137
+ const bufferGPU = gl.createBuffer();
1138
+
1139
+ gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
1140
+ gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
1141
+
1142
+ this.set( binding, {
1143
+ index: bindGroup.index * 2 + i ++,
1144
+ bufferGPU
1145
+ } );
1146
+
1147
+ } else if ( binding.isSampledTexture ) {
1148
+
1149
+ const { textureGPU, glTextureType } = this.get( binding.texture );
1150
+
1151
+ this.set( binding, {
1152
+ index: bindingsData.textureIndex ++,
1153
+ textureGPU,
1154
+ glTextureType
1155
+ } );
1133
1156
 
1134
1157
  }
1135
1158
 
@@ -1218,7 +1241,6 @@ class WebGLBackend extends Backend {
1218
1241
 
1219
1242
  }
1220
1243
 
1221
-
1222
1244
  getMaxAnisotropy() {
1223
1245
 
1224
1246
  return this.capabilities.getMaxAnisotropy();
@@ -1231,44 +1253,44 @@ class WebGLBackend extends Backend {
1231
1253
 
1232
1254
  }
1233
1255
 
1234
- copyFramebufferToTexture( texture, renderContext ) {
1256
+ copyFramebufferToTexture( texture, renderContext, rectangle ) {
1235
1257
 
1236
- this.textureUtils.copyFramebufferToTexture( texture, renderContext );
1258
+ this.textureUtils.copyFramebufferToTexture( texture, renderContext, rectangle );
1237
1259
 
1238
1260
  }
1239
1261
 
1240
- _setFramebuffer( renderContext ) {
1262
+ _setFramebuffer( descriptor ) {
1241
1263
 
1242
1264
  const { gl, state } = this;
1243
1265
 
1244
1266
  let currentFrameBuffer = null;
1245
1267
 
1246
- if ( renderContext.textures !== null ) {
1268
+ if ( descriptor.textures !== null ) {
1247
1269
 
1248
- const renderTarget = renderContext.renderTarget;
1270
+ const renderTarget = descriptor.renderTarget;
1249
1271
  const renderTargetContextData = this.get( renderTarget );
1250
1272
  const { samples, depthBuffer, stencilBuffer } = renderTarget;
1251
- const cubeFace = this.renderer._activeCubeFace;
1273
+
1252
1274
  const isCube = renderTarget.isWebGLCubeRenderTarget === true;
1253
1275
 
1254
1276
  let msaaFb = renderTargetContextData.msaaFrameBuffer;
1255
1277
  let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
1256
1278
 
1279
+ const cacheKey = getCacheKey( descriptor );
1280
+
1257
1281
  let fb;
1258
1282
 
1259
1283
  if ( isCube ) {
1260
1284
 
1261
- if ( renderTargetContextData.cubeFramebuffers === undefined ) {
1285
+ renderTargetContextData.cubeFramebuffers || ( renderTargetContextData.cubeFramebuffers = {} );
1262
1286
 
1263
- renderTargetContextData.cubeFramebuffers = [];
1264
-
1265
- }
1266
-
1267
- fb = renderTargetContextData.cubeFramebuffers[ cubeFace ];
1287
+ fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
1268
1288
 
1269
1289
  } else {
1270
1290
 
1271
- fb = renderTargetContextData.framebuffer;
1291
+ renderTargetContextData.framebuffers || ( renderTargetContextData.framebuffers = {} );
1292
+
1293
+ fb = renderTargetContextData.framebuffers[ cacheKey ];
1272
1294
 
1273
1295
  }
1274
1296
 
@@ -1278,22 +1300,27 @@ class WebGLBackend extends Backend {
1278
1300
 
1279
1301
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
1280
1302
 
1281
- const textures = renderContext.textures;
1303
+ const textures = descriptor.textures;
1282
1304
 
1283
1305
  if ( isCube ) {
1284
1306
 
1285
- renderTargetContextData.cubeFramebuffers[ cubeFace ] = fb;
1307
+ renderTargetContextData.cubeFramebuffers[ cacheKey ] = fb;
1308
+
1286
1309
  const { textureGPU } = this.get( textures[ 0 ] );
1287
1310
 
1311
+ const cubeFace = this.renderer._activeCubeFace;
1312
+
1288
1313
  gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
1289
1314
 
1290
1315
  } else {
1291
1316
 
1317
+ renderTargetContextData.framebuffers[ cacheKey ] = fb;
1318
+
1292
1319
  for ( let i = 0; i < textures.length; i ++ ) {
1293
1320
 
1294
1321
  const texture = textures[ i ];
1295
1322
  const textureData = this.get( texture );
1296
- textureData.renderTarget = renderContext.renderTarget;
1323
+ textureData.renderTarget = descriptor.renderTarget;
1297
1324
 
1298
1325
  const attachment = gl.COLOR_ATTACHMENT0 + i;
1299
1326
 
@@ -1301,15 +1328,13 @@ class WebGLBackend extends Backend {
1301
1328
 
1302
1329
  }
1303
1330
 
1304
- renderTargetContextData.framebuffer = fb;
1305
-
1306
- state.drawBuffers( renderContext, fb );
1331
+ state.drawBuffers( descriptor, fb );
1307
1332
 
1308
1333
  }
1309
1334
 
1310
- if ( renderContext.depthTexture !== null ) {
1335
+ if ( descriptor.depthTexture !== null ) {
1311
1336
 
1312
- const textureData = this.get( renderContext.depthTexture );
1337
+ const textureData = this.get( descriptor.depthTexture );
1313
1338
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
1314
1339
 
1315
1340
  gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
@@ -1330,11 +1355,10 @@ class WebGLBackend extends Backend {
1330
1355
 
1331
1356
  const msaaRenderbuffers = [];
1332
1357
 
1333
- const textures = renderContext.textures;
1358
+ const textures = descriptor.textures;
1334
1359
 
1335
1360
  for ( let i = 0; i < textures.length; i ++ ) {
1336
1361
 
1337
-
1338
1362
  msaaRenderbuffers[ i ] = gl.createRenderbuffer();
1339
1363
 
1340
1364
  gl.bindRenderbuffer( gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
@@ -1348,10 +1372,10 @@ class WebGLBackend extends Backend {
1348
1372
 
1349
1373
  }
1350
1374
 
1351
- const texture = renderContext.textures[ i ];
1375
+ const texture = descriptor.textures[ i ];
1352
1376
  const textureData = this.get( texture );
1353
1377
 
1354
- gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, renderContext.width, renderContext.height );
1378
+ gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, descriptor.width, descriptor.height );
1355
1379
  gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
1356
1380
 
1357
1381
 
@@ -1363,7 +1387,7 @@ class WebGLBackend extends Backend {
1363
1387
  if ( depthRenderbuffer === undefined ) {
1364
1388
 
1365
1389
  depthRenderbuffer = gl.createRenderbuffer();
1366
- this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, renderContext );
1390
+ this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor );
1367
1391
 
1368
1392
  renderTargetContextData.depthRenderbuffer = depthRenderbuffer;
1369
1393
 
@@ -1510,7 +1534,7 @@ class WebGLBackend extends Backend {
1510
1534
 
1511
1535
  }
1512
1536
 
1513
- const gl = this.gl;
1537
+ const { gl } = this;
1514
1538
 
1515
1539
  transformFeedbackGPU = gl.createTransformFeedback();
1516
1540
 
@@ -1575,7 +1599,8 @@ class WebGLBackend extends Backend {
1575
1599
 
1576
1600
  if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
1577
1601
 
1578
- gl.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );
1602
+ // TODO USE bindBufferRange to group multiple uniform buffers
1603
+ state.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );
1579
1604
 
1580
1605
  } else if ( binding.isSampledTexture ) {
1581
1606