super-three 0.157.1 → 0.160.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 (303) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +3100 -1537
  3. package/build/three.js +3100 -1537
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +3093 -1538
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +291 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +62 -41
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +53 -48
  12. package/examples/jsm/exporters/GLTFExporter.js +151 -3
  13. package/examples/jsm/exporters/USDZExporter.js +27 -19
  14. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  15. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  16. package/examples/jsm/helpers/TextureHelper.js +237 -0
  17. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  18. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  19. package/examples/jsm/libs/opentype.module.js +13 -75
  20. package/examples/jsm/libs/surfaceNet.js +201 -0
  21. package/examples/jsm/lines/LineMaterial.js +16 -33
  22. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  23. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  24. package/examples/jsm/loaders/FBXLoader.js +294 -124
  25. package/examples/jsm/loaders/GLTFLoader.js +83 -6
  26. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  27. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  28. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  29. package/examples/jsm/loaders/SVGLoader.js +4 -4
  30. package/examples/jsm/loaders/USDZLoader.js +3 -17
  31. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  32. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  33. package/examples/jsm/math/Capsule.js +0 -55
  34. package/examples/jsm/math/Octree.js +85 -7
  35. package/examples/jsm/misc/Timer.js +119 -0
  36. package/examples/jsm/misc/TubePainter.js +3 -6
  37. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  38. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  39. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  40. package/examples/jsm/nodes/Nodes.js +16 -12
  41. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  42. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  43. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  44. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  45. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  46. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  47. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  48. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  49. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  50. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  51. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  52. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  53. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  54. package/examples/jsm/nodes/accessors/TextureNode.js +123 -37
  55. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  56. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  57. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  58. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  59. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  60. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  61. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  62. package/examples/jsm/nodes/core/Node.js +13 -15
  63. package/examples/jsm/nodes/core/NodeBuilder.js +209 -42
  64. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  65. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  66. package/examples/jsm/nodes/core/NodeUtils.js +7 -9
  67. package/examples/jsm/nodes/core/OutputStructNode.js +4 -4
  68. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  69. package/examples/jsm/nodes/core/PropertyNode.js +15 -6
  70. package/examples/jsm/nodes/core/StackNode.js +7 -17
  71. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  72. package/examples/jsm/nodes/core/TempNode.js +1 -1
  73. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  74. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  75. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  76. package/examples/jsm/nodes/core/VarNode.js +7 -34
  77. package/examples/jsm/nodes/core/VaryingNode.js +3 -7
  78. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  79. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  80. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  81. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  82. package/examples/jsm/nodes/display/PassNode.js +182 -0
  83. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  84. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  85. package/examples/jsm/nodes/display/ViewportNode.js +17 -10
  86. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  87. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  88. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  89. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  90. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  91. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  92. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  93. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  94. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +55 -6
  95. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  96. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -18
  97. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  98. package/examples/jsm/nodes/lighting/LightsNode.js +80 -20
  99. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  100. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  101. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  102. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +76 -77
  103. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  104. package/examples/jsm/nodes/materials/Materials.js +1 -0
  105. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  106. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +3 -3
  107. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  108. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  109. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  110. package/examples/jsm/nodes/materials/NodeMaterial.js +82 -60
  111. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  112. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  113. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  114. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  115. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  116. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  117. package/examples/jsm/nodes/math/MathNode.js +2 -0
  118. package/examples/jsm/nodes/math/OperatorNode.js +24 -27
  119. package/examples/jsm/nodes/shadernode/ShaderNode.js +158 -10
  120. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  121. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  122. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  123. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  124. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  125. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  126. package/examples/jsm/nodes/utils/SplitNode.js +10 -2
  127. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  128. package/examples/jsm/objects/InstancedPoints.js +21 -0
  129. package/examples/jsm/objects/Lensflare.js +20 -0
  130. package/examples/jsm/objects/QuadMesh.js +60 -0
  131. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  132. package/examples/jsm/objects/Refractor.js +3 -0
  133. package/examples/jsm/objects/Sky.js +5 -3
  134. package/examples/jsm/objects/Water.js +5 -2
  135. package/examples/jsm/objects/Water2.js +3 -0
  136. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  137. package/examples/jsm/physics/RapierPhysics.js +21 -0
  138. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  139. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  140. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  141. package/examples/jsm/postprocessing/OutputPass.js +3 -0
  142. package/examples/jsm/postprocessing/Pass.js +14 -3
  143. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  144. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  145. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  146. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  147. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  148. package/examples/jsm/renderers/common/Animation.js +10 -21
  149. package/examples/jsm/renderers/common/Backend.js +19 -3
  150. package/examples/jsm/renderers/common/Background.js +20 -22
  151. package/examples/jsm/renderers/common/Bindings.js +31 -22
  152. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  153. package/examples/jsm/renderers/common/Color4.js +37 -0
  154. package/examples/jsm/renderers/common/Geometries.js +4 -4
  155. package/examples/jsm/renderers/common/Info.js +12 -2
  156. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  157. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  158. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  159. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  160. package/examples/jsm/renderers/common/RenderObject.js +21 -2
  161. package/examples/jsm/renderers/common/RenderObjects.js +5 -3
  162. package/examples/jsm/renderers/common/Renderer.js +137 -37
  163. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  164. package/examples/jsm/renderers/common/Textures.js +8 -37
  165. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  166. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  167. package/examples/jsm/renderers/common/nodes/Nodes.js +121 -19
  168. package/examples/jsm/renderers/webgl/WebGLBackend.js +366 -67
  169. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +183 -38
  170. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +92 -5
  171. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  172. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  173. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  174. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  175. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  176. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  177. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  178. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  179. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +188 -137
  180. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  181. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +241 -90
  182. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  183. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  184. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  185. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  186. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  187. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  188. package/examples/jsm/shaders/BasicShader.js +2 -0
  189. package/examples/jsm/shaders/BlendShader.js +2 -0
  190. package/examples/jsm/shaders/BokehShader.js +2 -0
  191. package/examples/jsm/shaders/BokehShader2.js +4 -0
  192. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  193. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  194. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  195. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  196. package/examples/jsm/shaders/FXAAShader.js +135 -133
  197. package/examples/jsm/shaders/FilmShader.js +1 -1
  198. package/examples/jsm/shaders/FocusShader.js +2 -0
  199. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  200. package/examples/jsm/shaders/GTAOShader.js +424 -0
  201. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  202. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  203. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  204. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  205. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  206. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  207. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  208. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  209. package/examples/jsm/shaders/MirrorShader.js +2 -0
  210. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  211. package/examples/jsm/shaders/OutputShader.js +8 -5
  212. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  213. package/examples/jsm/shaders/SAOShader.js +7 -3
  214. package/examples/jsm/shaders/SMAAShader.js +6 -0
  215. package/examples/jsm/shaders/SSAOShader.js +8 -3
  216. package/examples/jsm/shaders/SSRShader.js +6 -0
  217. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  218. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  219. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  220. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  221. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  222. package/examples/jsm/shaders/VelocityShader.js +2 -0
  223. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  224. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  225. package/examples/jsm/transpiler/AST.js +270 -0
  226. package/examples/jsm/transpiler/GLSLDecoder.js +941 -0
  227. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  228. package/examples/jsm/transpiler/TSLEncoder.js +715 -0
  229. package/examples/jsm/transpiler/Transpiler.js +18 -0
  230. package/examples/jsm/utils/SortUtils.js +158 -0
  231. package/examples/jsm/utils/TextureUtils.js +33 -21
  232. package/examples/jsm/webxr/ARButton.js +14 -0
  233. package/examples/jsm/webxr/VRButton.js +24 -9
  234. package/examples/jsm/webxr/XRButton.js +27 -11
  235. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  236. package/package.json +8 -6
  237. package/src/Three.js +1 -0
  238. package/src/constants.js +8 -1
  239. package/src/core/BufferAttribute.js +21 -2
  240. package/src/core/InterleavedBuffer.js +21 -1
  241. package/src/core/Object3D.js +60 -12
  242. package/src/core/UniformsGroup.js +7 -1
  243. package/src/extras/PMREMGenerator.js +7 -1
  244. package/src/extras/curves/LineCurve3.js +4 -0
  245. package/src/loaders/AudioLoader.js +1 -1
  246. package/src/loaders/BufferGeometryLoader.js +0 -7
  247. package/src/loaders/ImageBitmapLoader.js +25 -1
  248. package/src/loaders/MaterialLoader.js +10 -2
  249. package/src/loaders/ObjectLoader.js +49 -0
  250. package/src/materials/Material.js +27 -13
  251. package/src/materials/ShaderMaterial.js +2 -1
  252. package/src/math/Box3.js +35 -18
  253. package/src/math/ColorManagement.js +0 -16
  254. package/src/math/Quaternion.js +5 -4
  255. package/src/math/Sphere.js +2 -0
  256. package/src/math/Triangle.js +17 -5
  257. package/src/math/Vector3.js +11 -12
  258. package/src/objects/BatchedMesh.js +1020 -0
  259. package/src/objects/Skeleton.js +1 -3
  260. package/src/objects/SkinnedMesh.js +6 -7
  261. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  262. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  263. package/src/renderers/WebGLRenderer.js +165 -43
  264. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  265. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  266. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  267. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  268. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  269. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  270. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  271. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  272. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  273. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  274. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  275. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  276. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  277. package/src/renderers/shaders/ShaderChunk.js +4 -0
  278. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  279. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  280. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  281. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  282. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  283. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  284. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  285. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -2
  286. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  287. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  288. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  289. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  290. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  291. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  292. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  293. package/src/renderers/webgl/WebGLLights.js +11 -2
  294. package/src/renderers/webgl/WebGLProgram.js +100 -51
  295. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  296. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  297. package/src/renderers/webgl/WebGLState.js +25 -4
  298. package/src/renderers/webgl/WebGLTextures.js +7 -11
  299. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  300. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  301. package/src/renderers/webxr/WebXRManager.js +16 -0
  302. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  303. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -8,6 +8,7 @@ import WebGLState from './utils/WebGLState.js';
8
8
  import WebGLUtils from './utils/WebGLUtils.js';
9
9
  import WebGLTextureUtils from './utils/WebGLTextureUtils.js';
10
10
  import WebGLExtensions from './utils/WebGLExtensions.js';
11
+ import WebGLCapabilities from './utils/WebGLCapabilities.js';
11
12
 
12
13
  //
13
14
 
@@ -17,6 +18,8 @@ class WebGLBackend extends Backend {
17
18
 
18
19
  super( parameters );
19
20
 
21
+ this.isWebGLBackend = true;
22
+
20
23
  }
21
24
 
22
25
  async init( renderer ) {
@@ -32,6 +35,7 @@ class WebGLBackend extends Backend {
32
35
  this.gl = glContext;
33
36
 
34
37
  this.extensions = new WebGLExtensions( this );
38
+ this.capabilities = new WebGLCapabilities( this );
35
39
  this.attributeUtils = new WebGLAttributeUtils( this );
36
40
  this.textureUtils = new WebGLTextureUtils( this );
37
41
  this.state = new WebGLState( this );
@@ -39,6 +43,7 @@ class WebGLBackend extends Backend {
39
43
  this.defaultTextures = {};
40
44
 
41
45
  this.extensions.get( 'EXT_color_buffer_float' );
46
+ this._currentContext = null;
42
47
 
43
48
  }
44
49
 
@@ -48,60 +53,164 @@ class WebGLBackend extends Backend {
48
53
 
49
54
  }
50
55
 
56
+ async getArrayBufferAsync( attribute ) {
57
+
58
+ return await this.attributeUtils.getArrayBufferAsync( attribute );
59
+
60
+ }
61
+
51
62
  beginRender( renderContext ) {
52
63
 
53
64
  const { gl } = this;
65
+ const renderContextData = this.get( renderContext );
54
66
 
55
67
  //
56
68
 
69
+ renderContextData.previousContext = this._currentContext;
70
+ this._currentContext = renderContext;
71
+
57
72
  this._setFramebuffer( renderContext );
58
73
 
59
- let clear = 0;
74
+ this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext );
60
75
 
61
- if ( renderContext.clearColor ) clear |= gl.COLOR_BUFFER_BIT;
62
- if ( renderContext.clearDepth ) clear |= gl.DEPTH_BUFFER_BIT;
63
- if ( renderContext.clearStencil ) clear |= gl.STENCIL_BUFFER_BIT;
76
+ //
64
77
 
65
- const clearColor = renderContext.clearColorValue;
78
+ if ( renderContext.viewport ) {
66
79
 
67
- if ( clear !== 0 ) {
80
+ this.updateViewport( renderContext );
68
81
 
69
- if ( renderContext.textures === null ) {
82
+ } else {
70
83
 
71
- gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a );
72
- gl.clear( clear );
84
+ gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
85
+
86
+ }
87
+
88
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
89
+
90
+ if ( occlusionQueryCount > 0 ) {
91
+
92
+ // Get a reference to the array of objects with queries. The renderContextData property
93
+ // can be changed by another render pass before the async reading of all previous queries complete
94
+ renderContextData.currentOcclusionQueries = renderContextData.occlusionQueries;
95
+ renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
96
+
97
+ renderContextData.lastOcclusionObject = null;
98
+ renderContextData.occlusionQueries = new Array( occlusionQueryCount );
99
+ renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
100
+ renderContextData.occlusionQueryIndex = 0;
101
+
102
+ }
103
+
104
+ }
105
+
106
+ finishRender( renderContext ) {
107
+
108
+ const renderContextData = this.get( renderContext );
109
+ const previousContext = renderContextData.previousContext;
110
+
111
+ this._currentContext = previousContext;
112
+
113
+ if ( previousContext !== null ) {
114
+
115
+ this._setFramebuffer( previousContext );
116
+
117
+ if ( previousContext.viewport ) {
118
+
119
+ this.updateViewport( previousContext );
73
120
 
74
121
  } else {
75
122
 
76
- for ( let i = 0; i < renderContext.textures.length; i ++ ) {
123
+ const gl = this.gl;
77
124
 
78
- gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
125
+ gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
79
126
 
80
- }
127
+ }
128
+
129
+ }
130
+
131
+ const occlusionQueryCount = renderContext.occlusionQueryCount;
132
+
133
+ if ( occlusionQueryCount > 0 ) {
134
+
135
+ const renderContextData = this.get( renderContext );
136
+
137
+ if ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {
138
+
139
+ const { gl } = this;
81
140
 
82
- gl.clearBufferfi( gl.DEPTH_STENCIL, 0, 1, 1 );
141
+ gl.endQuery( gl.ANY_SAMPLES_PASSED );
83
142
 
84
143
  }
85
144
 
145
+ this.resolveOccludedAsync( renderContext );
146
+
86
147
  }
87
148
 
88
- //
149
+ }
89
150
 
90
- if ( renderContext.viewport ) {
151
+ resolveOccludedAsync( renderContext ) {
91
152
 
92
- this.updateViewport( renderContext );
153
+ const renderContextData = this.get( renderContext );
93
154
 
94
- } else {
155
+ // handle occlusion query results
95
156
 
96
- gl.viewport( 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight );
157
+ const { currentOcclusionQueries, currentOcclusionQueryObjects } = renderContextData;
158
+
159
+ if ( currentOcclusionQueries && currentOcclusionQueryObjects ) {
160
+
161
+ const occluded = new WeakSet();
162
+ const { gl } = this;
163
+
164
+ renderContextData.currentOcclusionQueryObjects = null;
165
+ renderContextData.currentOcclusionQueries = null;
166
+
167
+ const check = () => {
168
+
169
+ let completed = 0;
170
+
171
+ // check all queries and requeue as appropriate
172
+ for ( let i = 0; i < currentOcclusionQueries.length; i ++ ) {
173
+
174
+ const query = currentOcclusionQueries[ i ];
175
+
176
+ if ( query === null ) continue;
177
+
178
+ if ( gl.getQueryParameter( query, gl.QUERY_RESULT_AVAILABLE ) ) {
179
+
180
+ if ( gl.getQueryParameter( query, gl.QUERY_RESULT ) > 0 ) occluded.add( currentOcclusionQueryObjects[ i ] );
181
+
182
+ currentOcclusionQueries[ i ] = null;
183
+ gl.deleteQuery( query );
184
+
185
+ completed ++;
186
+
187
+ }
188
+
189
+ }
190
+
191
+ if ( completed < currentOcclusionQueries.length ) {
192
+
193
+ requestAnimationFrame( check );
194
+
195
+ } else {
196
+
197
+ renderContextData.occluded = occluded;
198
+
199
+ }
200
+
201
+ };
202
+
203
+ check();
97
204
 
98
205
  }
99
206
 
100
207
  }
101
208
 
102
- finishRender( /*renderContext*/ ) {
209
+ isOccluded( renderContext, object ) {
103
210
 
104
- //console.warn( 'Abstract class.' );
211
+ const renderContextData = this.get( renderContext );
212
+
213
+ return renderContextData.occluded && renderContextData.occluded.has( object );
105
214
 
106
215
  }
107
216
 
@@ -114,9 +223,67 @@ class WebGLBackend extends Backend {
114
223
 
115
224
  }
116
225
 
117
- clear( /*renderContext, color, depth, stencil*/ ) {
226
+ clear( color, depth, stencil, descriptor = null ) {
118
227
 
119
- console.warn( 'Abstract class.' );
228
+ const { gl } = this;
229
+
230
+ if ( descriptor === null ) {
231
+
232
+ descriptor = {
233
+ textures: null,
234
+ clearColorValue: this.getClearColor()
235
+ };
236
+
237
+ }
238
+
239
+ //
240
+
241
+ let clear = 0;
242
+
243
+ if ( color ) clear |= gl.COLOR_BUFFER_BIT;
244
+ if ( depth ) clear |= gl.DEPTH_BUFFER_BIT;
245
+ if ( stencil ) clear |= gl.STENCIL_BUFFER_BIT;
246
+
247
+ if ( clear !== 0 ) {
248
+
249
+ const clearColor = descriptor.clearColorValue;
250
+
251
+ if ( depth ) this.state.setDepthMask( true );
252
+
253
+ if ( descriptor.textures === null ) {
254
+
255
+ gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a );
256
+ gl.clear( clear );
257
+
258
+ } else {
259
+
260
+ if ( color ) {
261
+
262
+ for ( let i = 0; i < descriptor.textures.length; i ++ ) {
263
+
264
+ gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
265
+
266
+ }
267
+
268
+ }
269
+
270
+ if ( depth && stencil ) {
271
+
272
+ gl.clearBufferfi( gl.DEPTH_STENCIL, 0, 1, 0 );
273
+
274
+ } else if ( depth ) {
275
+
276
+ gl.clearBufferfv( gl.DEPTH, 0, [ 1.0 ] );
277
+
278
+ } else if ( stencil ) {
279
+
280
+ gl.clearBufferiv( gl.STENCIL, 0, [ 0 ] );
281
+
282
+ }
283
+
284
+ }
285
+
286
+ }
120
287
 
121
288
  }
122
289
 
@@ -140,11 +307,13 @@ class WebGLBackend extends Backend {
140
307
 
141
308
  draw( renderObject, info ) {
142
309
 
143
- const { pipeline, material } = renderObject;
310
+ const { pipeline, material, context } = renderObject;
144
311
  const { programGPU, vaoGPU } = this.get( pipeline );
145
312
 
146
313
  const { gl, state } = this;
147
314
 
315
+ const contextData = this.get( context );
316
+
148
317
  //
149
318
 
150
319
  const bindings = renderObject.getBindings();
@@ -154,7 +323,7 @@ class WebGLBackend extends Backend {
154
323
  const bindingData = this.get( binding );
155
324
  const index = bindingData.index;
156
325
 
157
- if ( binding.isUniformsGroup ) {
326
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
158
327
 
159
328
  gl.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );
160
329
 
@@ -183,23 +352,61 @@ class WebGLBackend extends Backend {
183
352
 
184
353
  //
185
354
 
355
+ const lastObject = contextData.lastOcclusionObject;
356
+
357
+ if ( lastObject !== object && lastObject !== undefined ) {
358
+
359
+ if ( lastObject !== null && lastObject.occlusionTest === true ) {
360
+
361
+ gl.endQuery( gl.ANY_SAMPLES_PASSED );
362
+
363
+ contextData.occlusionQueryIndex ++;
364
+
365
+ }
366
+
367
+ if ( object.occlusionTest === true ) {
368
+
369
+ const query = gl.createQuery();
370
+
371
+ gl.beginQuery( gl.ANY_SAMPLES_PASSED, query );
372
+
373
+ contextData.occlusionQueries[ contextData.occlusionQueryIndex ] = query;
374
+ contextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;
375
+
376
+ }
377
+
378
+ contextData.lastOcclusionObject = object;
379
+
380
+ }
381
+
382
+ //
383
+
186
384
  let mode;
187
385
  if ( object.isPoints ) mode = gl.POINTS;
188
- else if ( object.isLine ) mode = gl.LINES;
189
- else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
190
386
  else if ( object.isLineSegments ) mode = gl.LINES;
387
+ else if ( object.isLine ) mode = gl.LINE_STRIP;
388
+ else if ( object.isLineLoop ) mode = gl.LINE_LOOP;
191
389
  else mode = gl.TRIANGLES;
192
390
 
193
391
  //
194
392
 
393
+ const instanceCount = this.getInstanceCount( renderObject );
195
394
 
196
395
  if ( index !== null ) {
197
396
 
198
397
  const indexData = this.get( index );
199
-
200
398
  const indexCount = ( drawRange.count !== Infinity ) ? drawRange.count : index.count;
201
399
 
202
- gl.drawElements( mode, index.count, indexData.type, firstVertex );
400
+ if ( instanceCount > 1 ) {
401
+
402
+ gl.drawElementsInstanced( mode, index.count, indexData.type, firstVertex, instanceCount );
403
+
404
+ } else {
405
+
406
+ gl.drawElements( mode, index.count, indexData.type, firstVertex );
407
+
408
+ }
409
+
203
410
 
204
411
  info.update( object, indexCount, 1 );
205
412
 
@@ -208,8 +415,16 @@ class WebGLBackend extends Backend {
208
415
  const positionAttribute = geometry.attributes.position;
209
416
  const vertexCount = ( drawRange.count !== Infinity ) ? drawRange.count : positionAttribute.count;
210
417
 
418
+ if ( instanceCount > 1 ) {
419
+
420
+ gl.drawArraysInstanced( mode, 0, vertexCount, instanceCount );
421
+
422
+ } else {
423
+
424
+ gl.drawArrays( mode, 0, vertexCount );
425
+
426
+ }
211
427
 
212
- gl.drawArrays( mode, 0, vertexCount );
213
428
  //gl.drawArrays( mode, vertexCount, gl.UNSIGNED_SHORT, firstVertex );
214
429
 
215
430
  info.update( object, vertexCount, 1 );
@@ -224,15 +439,15 @@ class WebGLBackend extends Backend {
224
439
 
225
440
  }
226
441
 
227
- needsUpdate( renderObject ) {
442
+ needsRenderUpdate( renderObject ) {
228
443
 
229
444
  return false;
230
445
 
231
446
  }
232
447
 
233
- getCacheKey( renderObject ) {
448
+ getRenderCacheKey( renderObject ) {
234
449
 
235
- return '';
450
+ return renderObject.id;
236
451
 
237
452
  }
238
453
 
@@ -244,12 +459,6 @@ class WebGLBackend extends Backend {
244
459
 
245
460
  }
246
461
 
247
- destroySampler( /*texture*/ ) {
248
-
249
- console.warn( 'Abstract class.' );
250
-
251
- }
252
-
253
462
  createDefaultTexture( texture ) {
254
463
 
255
464
  const { gl, textureUtils, defaultTextures } = this;
@@ -283,7 +492,7 @@ class WebGLBackend extends Backend {
283
492
  createTexture( texture, options ) {
284
493
 
285
494
  const { gl, utils, textureUtils } = this;
286
- const { levels, width, height } = options;
495
+ const { levels, width, height, depth } = options;
287
496
 
288
497
  const glFormat = utils.convert( texture.format, texture.colorSpace );
289
498
  const glType = utils.convert( texture.type );
@@ -303,7 +512,11 @@ class WebGLBackend extends Backend {
303
512
 
304
513
  gl.bindTexture( glTextureType, textureGPU );
305
514
 
306
- if ( ! texture.isVideoTexture ) {
515
+ if ( texture.isDataArrayTexture ) {
516
+
517
+ gl.texStorage3D( gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, width, height, depth );
518
+
519
+ } else if ( ! texture.isVideoTexture ) {
307
520
 
308
521
  gl.texStorage2D( glTextureType, levels, glInternalFormat, width, height );
309
522
 
@@ -331,7 +544,7 @@ class WebGLBackend extends Backend {
331
544
 
332
545
  return source.image.data;
333
546
 
334
- } else if ( source instanceof ImageBitmap || source instanceof OffscreenCanvas ) {
547
+ } else if ( source instanceof ImageBitmap || source instanceof OffscreenCanvas || source instanceof HTMLImageElement || source instanceof HTMLCanvasElement ) {
335
548
 
336
549
  return source;
337
550
 
@@ -355,6 +568,12 @@ class WebGLBackend extends Backend {
355
568
 
356
569
  }
357
570
 
571
+ } else if ( texture.isDataArrayTexture ) {
572
+
573
+ const image = options.image;
574
+
575
+ gl.texSubImage3D( gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
576
+
358
577
  } else if ( texture.isVideoTexture ) {
359
578
 
360
579
  texture.update();
@@ -382,15 +601,22 @@ class WebGLBackend extends Backend {
382
601
 
383
602
  }
384
603
 
385
- destroyTexture( /*texture*/ ) {
604
+ destroyTexture( texture ) {
386
605
 
387
- console.warn( 'Abstract class.' );
606
+ const { gl } = this;
607
+ const { textureGPU } = this.get( texture );
608
+
609
+ gl.deleteTexture( textureGPU );
610
+
611
+ this.delete( texture );
388
612
 
389
613
  }
390
614
 
391
- copyTextureToBuffer( /*texture, x, y, width, height*/ ) {
615
+ destroySampler() {}
392
616
 
393
- console.warn( 'Abstract class.' );
617
+ copyTextureToBuffer( texture, x, y, width, height ) {
618
+
619
+ return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height );
394
620
 
395
621
  }
396
622
 
@@ -414,12 +640,6 @@ class WebGLBackend extends Backend {
414
640
  gl.shaderSource( shader, code );
415
641
  gl.compileShader( shader );
416
642
 
417
- if ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {
418
-
419
- console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( shader ) );
420
-
421
- }
422
-
423
643
  this.set( program, {
424
644
  shaderGPU: shader
425
645
  } );
@@ -442,14 +662,21 @@ class WebGLBackend extends Backend {
442
662
  const { fragmentProgram, vertexProgram } = pipeline;
443
663
 
444
664
  const programGPU = gl.createProgram();
445
- gl.attachShader( programGPU, this.get( fragmentProgram ).shaderGPU );
446
- gl.attachShader( programGPU, this.get( vertexProgram ).shaderGPU );
665
+
666
+ const fragmentShader = this.get( fragmentProgram ).shaderGPU;
667
+ const vertexShader = this.get( vertexProgram ).shaderGPU;
668
+
669
+ gl.attachShader( programGPU, fragmentShader );
670
+ gl.attachShader( programGPU, vertexShader );
447
671
  gl.linkProgram( programGPU );
448
672
 
449
673
  if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
450
674
 
451
675
  console.error( 'THREE.WebGLBackend:', gl.getProgramInfoLog( programGPU ) );
452
676
 
677
+ console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( fragmentShader ) );
678
+ console.error( 'THREE.WebGLBackend:', gl.getShaderInfoLog( vertexShader ) );
679
+
453
680
  }
454
681
 
455
682
  gl.useProgram( programGPU );
@@ -463,7 +690,7 @@ class WebGLBackend extends Backend {
463
690
  const bindingData = this.get( binding );
464
691
  const index = bindingData.index;
465
692
 
466
- if ( binding.isUniformsGroup ) {
693
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
467
694
 
468
695
  const location = gl.getUniformBlockIndex( programGPU, binding.name );
469
696
  gl.uniformBlockBinding( programGPU, location, index );
@@ -482,7 +709,7 @@ class WebGLBackend extends Backend {
482
709
  const vaoGPU = gl.createVertexArray();
483
710
 
484
711
  const index = renderObject.getIndex();
485
- const vertexBuffers = renderObject.getVertexBuffers();
712
+ const attributes = renderObject.getAttributes();
486
713
 
487
714
  gl.bindVertexArray( vaoGPU );
488
715
 
@@ -494,14 +721,47 @@ class WebGLBackend extends Backend {
494
721
 
495
722
  }
496
723
 
497
- for ( let i = 0; i < vertexBuffers.length; i ++ ) {
724
+ for ( let i = 0; i < attributes.length; i ++ ) {
498
725
 
499
- const attribute = vertexBuffers[ i ];
726
+ const attribute = attributes[ i ];
500
727
  const attributeData = this.get( attribute );
501
728
 
502
729
  gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
503
730
  gl.enableVertexAttribArray( i );
504
- gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, false, 0, 0 );
731
+
732
+ let stride, offset;
733
+
734
+ if ( attribute.isInterleavedBufferAttribute === true ) {
735
+
736
+ stride = attribute.data.stride * attributeData.bytesPerElement;
737
+ offset = attribute.offset * attributeData.bytesPerElement;
738
+
739
+ } else {
740
+
741
+ stride = 0;
742
+ offset = 0;
743
+
744
+ }
745
+
746
+ if ( attributeData.isInteger ) {
747
+
748
+ gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
749
+
750
+ } else {
751
+
752
+ gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );
753
+
754
+ }
755
+
756
+ if ( attribute.isInstancedBufferAttribute && ! attribute.isInterleavedBufferAttribute ) {
757
+
758
+ gl.vertexAttribDivisor( i, attribute.meshPerAttribute );
759
+
760
+ } else if ( attribute.isInterleavedBufferAttribute && attribute.data.isInstancedInterleavedBuffer ) {
761
+
762
+ gl.vertexAttribDivisor( i, attribute.data.meshPerAttribute );
763
+
764
+ }
505
765
 
506
766
  }
507
767
 
@@ -537,7 +797,7 @@ class WebGLBackend extends Backend {
537
797
 
538
798
  for ( const binding of bindings ) {
539
799
 
540
- if ( binding.isUniformsGroup ) {
800
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
541
801
 
542
802
  const bufferGPU = gl.createBuffer();
543
803
  const data = binding.buffer;
@@ -571,7 +831,7 @@ class WebGLBackend extends Backend {
571
831
 
572
832
  const gl = this.gl;
573
833
 
574
- if ( binding.isUniformsGroup ) {
834
+ if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
575
835
 
576
836
  const bindingData = this.get( binding );
577
837
  const bufferGPU = bindingData.bufferGPU;
@@ -608,9 +868,9 @@ class WebGLBackend extends Backend {
608
868
 
609
869
  }
610
870
 
611
- updateAttribute( /*attribute*/ ) {
871
+ updateAttribute( attribute ) {
612
872
 
613
- console.warn( 'Abstract class.' );
873
+ this.attributeUtils.updateAttribute( attribute );
614
874
 
615
875
  }
616
876
 
@@ -626,15 +886,54 @@ class WebGLBackend extends Backend {
626
886
 
627
887
  }
628
888
 
629
- hasFeature( name ) {
889
+ hasFeature( /*name*/ ) {
630
890
 
631
891
  return true;
632
892
 
633
893
  }
634
894
 
635
- copyFramebufferToTexture( /*texture, renderContext*/ ) {
895
+ getMaxAnisotropy() {
636
896
 
637
- console.warn( 'Abstract class.' );
897
+ return this.capabilities.getMaxAnisotropy();
898
+
899
+ }
900
+
901
+ copyFramebufferToTexture( texture, renderContext ) {
902
+
903
+ const { gl } = this;
904
+
905
+ const { textureGPU } = this.get( texture );
906
+
907
+ const width = texture.image.width;
908
+ const height = texture.image.height;
909
+
910
+ gl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );
911
+
912
+ if ( texture.isDepthTexture ) {
913
+
914
+ const fb = gl.createFramebuffer();
915
+
916
+ gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
917
+
918
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, textureGPU, 0 );
919
+
920
+ gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, gl.DEPTH_BUFFER_BIT, gl.NEAREST );
921
+
922
+ gl.deleteFramebuffer( fb );
923
+
924
+
925
+ } else {
926
+
927
+ gl.bindTexture( gl.TEXTURE_2D, textureGPU );
928
+ gl.copyTexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, 0, 0, width, height );
929
+
930
+ gl.bindTexture( gl.TEXTURE_2D, null );
931
+
932
+ }
933
+
934
+ if ( texture.generateMipmaps ) this.generateMipmaps( texture );
935
+
936
+ this._setFramebuffer( renderContext );
638
937
 
639
938
  }
640
939
 
@@ -644,7 +943,7 @@ class WebGLBackend extends Backend {
644
943
 
645
944
  if ( renderContext.textures !== null ) {
646
945
 
647
- const renderContextData = this.get( renderContext );
946
+ const renderContextData = this.get( renderContext.renderTarget );
648
947
 
649
948
  let fb = renderContextData.framebuffer;
650
949
 
@@ -658,7 +957,7 @@ class WebGLBackend extends Backend {
658
957
 
659
958
  const drawBuffers = [];
660
959
 
661
- for ( let i = 0; i < textures.length; i++ ) {
960
+ for ( let i = 0; i < textures.length; i ++ ) {
662
961
 
663
962
  const texture = textures[ i ];
664
963
  const { textureGPU } = this.get( texture );