super-three 0.133.4 → 0.136.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.js +2285 -1983
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +5983 -5358
  5. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff +0 -0
  6. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  7. package/examples/fonts/open-sans/open-sans.css +9 -0
  8. package/examples/fonts/tabler-icons/fonts/tabler-icons.eot +0 -0
  9. package/examples/fonts/tabler-icons/fonts/tabler-icons.svg +3966 -0
  10. package/examples/fonts/tabler-icons/fonts/tabler-icons.ttf +0 -0
  11. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff +0 -0
  12. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff2 +0 -0
  13. package/examples/fonts/tabler-icons/tabler-icons.min.css +4 -0
  14. package/examples/js/animation/CCDIKSolver.js +0 -1
  15. package/examples/js/animation/MMDPhysics.js +2 -4
  16. package/examples/js/cameras/CinematicCamera.js +2 -7
  17. package/examples/js/controls/ArcballControls.js +99 -72
  18. package/examples/js/controls/DragControls.js +7 -0
  19. package/examples/js/controls/OrbitControls.js +5 -36
  20. package/examples/js/controls/TrackballControls.js +3 -2
  21. package/examples/js/controls/TransformControls.js +24 -1
  22. package/examples/js/csm/CSM.js +2 -2
  23. package/examples/js/csm/CSMFrustum.js +133 -0
  24. package/examples/js/curves/CurveExtras.js +0 -2
  25. package/examples/js/effects/AsciiEffect.js +2 -9
  26. package/examples/js/exporters/GLTFExporter.js +148 -64
  27. package/examples/js/exporters/MMDExporter.js +1 -1
  28. package/examples/js/exporters/USDZExporter.js +45 -26
  29. package/examples/js/geometries/ConvexGeometry.js +1 -1
  30. package/examples/js/geometries/TeapotGeometry.js +0 -1
  31. package/examples/js/interactive/SelectionBox.js +2 -0
  32. package/examples/js/interactive/SelectionHelper.js +22 -7
  33. package/examples/js/lights/RectAreaLightUniformsLib.js +4 -0
  34. package/examples/js/lines/LineMaterial.js +58 -20
  35. package/examples/js/lines/LineSegments2.js +29 -24
  36. package/examples/js/loaders/3DMLoader.js +24 -11
  37. package/examples/js/loaders/3MFLoader.js +2 -2
  38. package/examples/js/loaders/AMFLoader.js +0 -2
  39. package/examples/js/loaders/BasisTextureLoader.js +1 -0
  40. package/examples/js/loaders/ColladaLoader.js +61 -4
  41. package/examples/js/loaders/EXRLoader.js +201 -272
  42. package/examples/js/loaders/FBXLoader.js +4 -5
  43. package/examples/js/loaders/GLTFLoader.js +98 -35
  44. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -10
  45. package/examples/js/loaders/KTX2Loader.js +23 -2
  46. package/examples/js/loaders/KTXLoader.js +1 -1
  47. package/examples/js/loaders/LDrawLoader.js +1169 -901
  48. package/examples/js/loaders/LUT3dlLoader.js +19 -10
  49. package/examples/js/loaders/LUTCubeLoader.js +5 -4
  50. package/examples/js/loaders/LWOLoader.js +8 -6
  51. package/examples/js/loaders/LogLuvLoader.js +766 -0
  52. package/examples/js/loaders/MMDLoader.js +0 -1
  53. package/examples/js/loaders/NRRDLoader.js +9 -2
  54. package/examples/js/loaders/OBJLoader.js +0 -2
  55. package/examples/js/loaders/PLYLoader.js +33 -8
  56. package/examples/js/loaders/RGBELoader.js +8 -22
  57. package/examples/js/loaders/RGBMLoader.js +56 -6
  58. package/examples/js/loaders/SVGLoader.js +12 -6
  59. package/examples/js/loaders/TDSLoader.js +237 -271
  60. package/examples/js/loaders/VOXLoader.js +1 -0
  61. package/examples/js/loaders/VRMLLoader.js +11 -22
  62. package/examples/js/loaders/lwo/LWO2Parser.js +1 -0
  63. package/examples/js/loaders/lwo/LWO3Parser.js +4 -2
  64. package/examples/js/math/ConvexHull.js +7 -13
  65. package/examples/js/math/ImprovedNoise.js +1 -1
  66. package/examples/js/misc/GPUComputationRenderer.js +3 -1
  67. package/examples/js/misc/Volume.js +2 -2
  68. package/examples/js/modifiers/CurveModifier.js +8 -7
  69. package/examples/js/modifiers/EdgeSplitModifier.js +1 -1
  70. package/examples/js/modifiers/SimplifyModifier.js +1 -1
  71. package/examples/js/objects/Lensflare.js +2 -10
  72. package/examples/js/objects/MarchingCubes.js +42 -128
  73. package/examples/js/objects/Reflector.js +8 -13
  74. package/examples/js/objects/ReflectorForSSRPass.js +0 -10
  75. package/examples/js/objects/Refractor.js +8 -13
  76. package/examples/js/objects/Sky.js +1 -1
  77. package/examples/js/objects/Water.js +3 -15
  78. package/examples/js/objects/Water2.js +4 -7
  79. package/examples/js/postprocessing/GlitchPass.js +6 -5
  80. package/examples/js/postprocessing/SMAAPass.js +2 -9
  81. package/examples/js/postprocessing/SSAOPass.js +10 -21
  82. package/examples/js/postprocessing/SavePass.js +1 -5
  83. package/examples/js/renderers/CSS2DRenderer.js +4 -4
  84. package/examples/js/renderers/CSS3DRenderer.js +4 -4
  85. package/examples/js/shaders/ConvolutionShader.js +0 -1
  86. package/examples/js/shaders/DigitalGlitch.js +3 -3
  87. package/examples/js/shaders/FXAAShader.js +1 -1
  88. package/examples/js/shaders/FilmShader.js +1 -1
  89. package/examples/js/shaders/GammaCorrectionShader.js +1 -1
  90. package/examples/js/shaders/HorizontalBlurShader.js +1 -2
  91. package/examples/js/shaders/MMDToonShader.js +0 -1
  92. package/examples/js/shaders/SSAOShader.js +1 -1
  93. package/examples/js/shaders/SSRShader.js +1 -1
  94. package/examples/js/shaders/SSRrShader.js +1 -1
  95. package/examples/js/shaders/VerticalBlurShader.js +1 -2
  96. package/examples/js/utils/GeometryUtils.js +1 -1
  97. package/examples/jsm/animation/CCDIKSolver.js +0 -1
  98. package/examples/jsm/animation/MMDPhysics.js +1 -3
  99. package/examples/jsm/cameras/CinematicCamera.js +2 -5
  100. package/examples/jsm/{WebGL.js → capabilities/WebGL.js} +2 -2
  101. package/examples/jsm/{renderers/webgpu → capabilities}/WebGPU.js +1 -1
  102. package/examples/jsm/controls/ArcballControls.js +80 -77
  103. package/examples/jsm/controls/DragControls.js +7 -0
  104. package/examples/jsm/controls/OrbitControls.js +9 -51
  105. package/examples/jsm/controls/TrackballControls.js +1 -1
  106. package/examples/jsm/controls/TransformControls.js +24 -1
  107. package/examples/jsm/csm/CSM.js +3 -3
  108. package/examples/jsm/csm/{Frustum.js → CSMFrustum.js} +3 -3
  109. package/examples/jsm/curves/CurveExtras.js +0 -2
  110. package/examples/jsm/effects/AsciiEffect.js +2 -9
  111. package/examples/jsm/exporters/GLTFExporter.js +169 -99
  112. package/examples/jsm/exporters/MMDExporter.js +1 -1
  113. package/examples/jsm/exporters/USDZExporter.js +47 -26
  114. package/examples/jsm/geometries/ConvexGeometry.js +1 -1
  115. package/examples/jsm/geometries/TeapotGeometry.js +0 -1
  116. package/examples/jsm/interactive/SelectionBox.js +1 -0
  117. package/examples/jsm/interactive/SelectionHelper.js +19 -7
  118. package/examples/jsm/libs/flow.module.js +3338 -0
  119. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  120. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  121. package/examples/jsm/lights/RectAreaLightUniformsLib.js +7 -0
  122. package/examples/jsm/lines/LineMaterial.js +59 -23
  123. package/examples/jsm/lines/LineSegments2.js +22 -18
  124. package/examples/jsm/loaders/3DMLoader.js +18 -12
  125. package/examples/jsm/loaders/3MFLoader.js +2 -2
  126. package/examples/jsm/loaders/AMFLoader.js +0 -2
  127. package/examples/jsm/loaders/BasisTextureLoader.js +7 -0
  128. package/examples/jsm/loaders/ColladaLoader.js +61 -4
  129. package/examples/jsm/loaders/EXRLoader.js +200 -306
  130. package/examples/jsm/loaders/FBXLoader.js +4 -5
  131. package/examples/jsm/loaders/GLTFLoader.js +102 -40
  132. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -17
  133. package/examples/jsm/loaders/KTX2Loader.js +30 -2
  134. package/examples/jsm/loaders/KTXLoader.js +1 -1
  135. package/examples/jsm/loaders/LDrawLoader.js +1159 -898
  136. package/examples/jsm/loaders/LUT3dlLoader.js +19 -12
  137. package/examples/jsm/loaders/LUTCubeLoader.js +5 -5
  138. package/examples/jsm/loaders/LWOLoader.js +8 -6
  139. package/examples/jsm/loaders/LogLuvLoader.js +606 -0
  140. package/examples/jsm/loaders/MMDLoader.js +0 -1
  141. package/examples/jsm/loaders/NRRDLoader.js +10 -2
  142. package/examples/jsm/loaders/OBJLoader.js +0 -2
  143. package/examples/jsm/loaders/PLYLoader.js +34 -8
  144. package/examples/jsm/loaders/RGBELoader.js +7 -28
  145. package/examples/jsm/loaders/RGBMLoader.js +62 -8
  146. package/examples/jsm/loaders/SVGLoader.js +15 -7
  147. package/examples/jsm/loaders/TDSLoader.js +236 -275
  148. package/examples/jsm/loaders/VOXLoader.js +1 -0
  149. package/examples/jsm/loaders/VRMLLoader.js +11 -23
  150. package/examples/jsm/loaders/lwo/LWO2Parser.js +1 -0
  151. package/examples/jsm/loaders/lwo/LWO3Parser.js +2 -2
  152. package/examples/jsm/math/ConvexHull.js +7 -13
  153. package/examples/jsm/math/ImprovedNoise.js +1 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +3 -1
  155. package/examples/jsm/misc/Volume.js +2 -2
  156. package/examples/jsm/modifiers/CurveModifier.js +9 -8
  157. package/examples/jsm/modifiers/EdgeSplitModifier.js +1 -1
  158. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  159. package/examples/jsm/node-editor/NodeEditor.js +455 -0
  160. package/examples/jsm/node-editor/accessors/NormalEditor.js +30 -0
  161. package/examples/jsm/node-editor/accessors/PositionEditor.js +30 -0
  162. package/examples/jsm/node-editor/accessors/UVEditor.js +26 -0
  163. package/examples/jsm/node-editor/display/BlendEditor.js +43 -0
  164. package/examples/jsm/node-editor/examples/animate-uv.json +1 -0
  165. package/examples/jsm/node-editor/examples/fake-top-light.json +1 -0
  166. package/examples/jsm/node-editor/examples/oscillator-color.json +1 -0
  167. package/examples/jsm/node-editor/examples/rim.json +1 -0
  168. package/examples/jsm/node-editor/inputs/ColorEditor.js +91 -0
  169. package/examples/jsm/node-editor/inputs/FloatEditor.js +24 -0
  170. package/examples/jsm/node-editor/inputs/SliderEditor.js +68 -0
  171. package/examples/jsm/node-editor/inputs/Vector2Editor.js +28 -0
  172. package/examples/jsm/node-editor/inputs/Vector3Editor.js +30 -0
  173. package/examples/jsm/node-editor/inputs/Vector4Editor.js +37 -0
  174. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +108 -0
  175. package/examples/jsm/node-editor/math/DotEditor.js +36 -0
  176. package/examples/jsm/node-editor/math/InvertEditor.js +38 -0
  177. package/examples/jsm/node-editor/math/LimiterEditor.js +48 -0
  178. package/examples/jsm/node-editor/math/NormalizeEditor.js +26 -0
  179. package/examples/jsm/node-editor/math/OperatorEditor.js +50 -0
  180. package/examples/jsm/node-editor/math/PowerEditor.js +34 -0
  181. package/examples/jsm/node-editor/math/TrigonometryEditor.js +39 -0
  182. package/examples/jsm/node-editor/procedural/CheckerEditor.js +26 -0
  183. package/examples/jsm/node-editor/utils/OscillatorEditor.js +42 -0
  184. package/examples/jsm/node-editor/utils/TimerEditor.js +57 -0
  185. package/examples/jsm/nodes/core/NodeBuilder.js +2 -2
  186. package/examples/jsm/nodes/materials/StandardNodeMaterial.js +1 -1
  187. package/examples/jsm/nodes/materials/nodes/StandardNode.js +7 -6
  188. package/examples/jsm/nodes/math/MathNode.js +12 -0
  189. package/examples/jsm/nodes/misc/BumpMapNode.js +1 -1
  190. package/examples/jsm/nodes/misc/TextureCubeUVNode.js +1 -4
  191. package/examples/jsm/nodes/utils/ColorSpaceNode.js +5 -177
  192. package/examples/jsm/objects/Lensflare.js +5 -16
  193. package/examples/jsm/objects/MarchingCubes.js +46 -152
  194. package/examples/jsm/objects/Reflector.js +8 -16
  195. package/examples/jsm/objects/ReflectorForSSRPass.js +0 -12
  196. package/examples/jsm/objects/Refractor.js +8 -16
  197. package/examples/jsm/objects/Sky.js +1 -1
  198. package/examples/jsm/objects/Water.js +3 -18
  199. package/examples/jsm/objects/Water2.js +4 -8
  200. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +1 -1
  201. package/examples/jsm/postprocessing/AfterimagePass.js +1 -1
  202. package/examples/jsm/postprocessing/BloomPass.js +1 -1
  203. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  204. package/examples/jsm/postprocessing/ClearPass.js +1 -1
  205. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -1
  206. package/examples/jsm/postprocessing/DotScreenPass.js +1 -1
  207. package/examples/jsm/postprocessing/EffectComposer.js +3 -3
  208. package/examples/jsm/postprocessing/FilmPass.js +1 -1
  209. package/examples/jsm/postprocessing/GlitchPass.js +10 -7
  210. package/examples/jsm/postprocessing/HalftonePass.js +1 -1
  211. package/examples/jsm/postprocessing/MaskPass.js +1 -1
  212. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  213. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  214. package/examples/jsm/postprocessing/SAOPass.js +2 -2
  215. package/examples/jsm/postprocessing/SMAAPass.js +3 -12
  216. package/examples/jsm/postprocessing/SSAARenderPass.js +1 -1
  217. package/examples/jsm/postprocessing/SSAOPass.js +15 -26
  218. package/examples/jsm/postprocessing/SSRPass.js +1 -1
  219. package/examples/jsm/postprocessing/SSRrPass.js +1 -1
  220. package/examples/jsm/postprocessing/SavePass.js +2 -4
  221. package/examples/jsm/postprocessing/ShaderPass.js +1 -1
  222. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  223. package/examples/jsm/postprocessing/TexturePass.js +1 -1
  224. package/examples/jsm/postprocessing/UnrealBloomPass.js +1 -1
  225. package/examples/jsm/renderers/CSS2DRenderer.js +5 -4
  226. package/examples/jsm/renderers/CSS3DRenderer.js +5 -4
  227. package/examples/jsm/renderers/nodes/Nodes.js +17 -13
  228. package/examples/jsm/renderers/nodes/ShaderNode.js +229 -49
  229. package/examples/jsm/renderers/nodes/accessors/MaterialNode.js +6 -6
  230. package/examples/jsm/renderers/nodes/accessors/ModelViewProjectionNode.js +5 -5
  231. package/examples/jsm/renderers/nodes/accessors/NormalNode.js +14 -3
  232. package/examples/jsm/renderers/nodes/accessors/PointUVNode.js +3 -3
  233. package/examples/jsm/renderers/nodes/accessors/PositionNode.js +15 -5
  234. package/examples/jsm/renderers/nodes/accessors/SkinningNode.js +107 -0
  235. package/examples/jsm/renderers/nodes/accessors/UVNode.js +7 -5
  236. package/examples/jsm/renderers/nodes/core/ArrayInputNode.js +3 -3
  237. package/examples/jsm/renderers/nodes/core/AttributeNode.js +6 -0
  238. package/examples/jsm/renderers/nodes/core/BypassNode.js +38 -0
  239. package/examples/jsm/renderers/nodes/core/CodeNode.js +3 -3
  240. package/examples/jsm/renderers/nodes/core/ContextNode.js +4 -19
  241. package/examples/jsm/renderers/nodes/core/ExpressionNode.js +13 -2
  242. package/examples/jsm/renderers/nodes/core/FunctionNode.js +19 -132
  243. package/examples/jsm/renderers/nodes/core/InputNode.js +13 -3
  244. package/examples/jsm/renderers/nodes/core/Node.js +32 -10
  245. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +146 -128
  246. package/examples/jsm/renderers/nodes/core/NodeFunction.js +22 -0
  247. package/examples/jsm/renderers/nodes/core/NodeFunctionInput.js +4 -4
  248. package/examples/jsm/renderers/nodes/core/NodeKeywords.js +18 -179
  249. package/examples/jsm/renderers/nodes/core/NodeParser.js +11 -0
  250. package/examples/jsm/renderers/nodes/core/NodeVar.js +2 -2
  251. package/examples/jsm/renderers/nodes/core/PropertyNode.js +14 -2
  252. package/examples/jsm/renderers/nodes/core/TempNode.js +10 -13
  253. package/examples/jsm/renderers/nodes/core/VarNode.js +12 -7
  254. package/examples/jsm/renderers/nodes/core/VaryNode.js +23 -8
  255. package/examples/jsm/renderers/nodes/core/constants.js +2 -0
  256. package/examples/jsm/renderers/nodes/display/ColorSpaceNode.js +43 -63
  257. package/examples/jsm/renderers/nodes/display/NormalMapNode.js +21 -22
  258. package/examples/jsm/renderers/nodes/functions/BSDFs.js +64 -101
  259. package/examples/jsm/renderers/nodes/functions/PhysicalMaterialFunctions.js +27 -0
  260. package/examples/jsm/renderers/nodes/inputs/BufferNode.js +25 -0
  261. package/examples/jsm/renderers/nodes/inputs/IntNode.js +17 -0
  262. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +13 -10
  263. package/examples/jsm/renderers/nodes/lights/LightContextNode.js +20 -14
  264. package/examples/jsm/renderers/nodes/lights/LightNode.js +32 -36
  265. package/examples/jsm/renderers/nodes/math/CondNode.js +60 -0
  266. package/examples/jsm/renderers/nodes/math/MathNode.js +91 -37
  267. package/examples/jsm/renderers/nodes/math/OperatorNode.js +124 -31
  268. package/examples/jsm/renderers/nodes/parsers/GLSLNodeFunction.js +137 -0
  269. package/examples/jsm/renderers/nodes/parsers/GLSLNodeParser.js +14 -0
  270. package/examples/jsm/renderers/nodes/parsers/WGSLNodeFunction.js +89 -0
  271. package/examples/jsm/renderers/nodes/parsers/WGSLNodeParser.js +14 -0
  272. package/examples/jsm/renderers/nodes/procedural/CheckerNode.js +7 -9
  273. package/examples/jsm/renderers/nodes/utils/ArrayElementNode.js +31 -0
  274. package/examples/jsm/renderers/nodes/utils/ConvertNode.js +33 -0
  275. package/examples/jsm/renderers/nodes/utils/JoinNode.js +7 -7
  276. package/examples/jsm/renderers/nodes/utils/OscNode.js +58 -0
  277. package/examples/jsm/renderers/nodes/utils/SplitNode.js +18 -8
  278. package/examples/jsm/renderers/nodes/utils/SpriteSheetUVNode.js +7 -7
  279. package/examples/jsm/renderers/nodes/utils/TimerNode.js +1 -1
  280. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +22 -0
  281. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +192 -95
  282. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +2 -2
  283. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +2 -2
  284. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +1 -1
  285. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +10 -9
  286. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +2 -4
  287. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +1 -1
  288. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +2 -4
  289. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +15 -23
  290. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +44 -65
  291. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +13 -31
  292. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +61 -28
  293. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +35 -29
  294. package/examples/jsm/renderers/webgpu/constants.js +2 -2
  295. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +459 -95
  296. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  297. package/examples/jsm/shaders/ConvolutionShader.js +0 -1
  298. package/examples/jsm/shaders/DigitalGlitch.js +3 -3
  299. package/examples/jsm/shaders/FXAAShader.js +1 -1
  300. package/examples/jsm/shaders/FilmShader.js +1 -1
  301. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  302. package/examples/jsm/shaders/HorizontalBlurShader.js +1 -2
  303. package/examples/jsm/shaders/MMDToonShader.js +0 -1
  304. package/examples/jsm/shaders/SSAOShader.js +1 -1
  305. package/examples/jsm/shaders/SSRShader.js +1 -1
  306. package/examples/jsm/shaders/SSRrShader.js +1 -1
  307. package/examples/jsm/shaders/VerticalBlurShader.js +1 -2
  308. package/examples/jsm/utils/GeometryUtils.js +1 -1
  309. package/examples/jsm/utils/LDrawUtils.js +195 -0
  310. package/examples/jsm/utils/WorkerPool.js +11 -11
  311. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -6
  312. package/examples/jsm/webxr/VRButton.js +24 -0
  313. package/examples/jsm/webxr/XREstimatedLight.js +2 -0
  314. package/package.json +27 -18
  315. package/src/Three.Legacy.js +18 -0
  316. package/src/Three.js +1 -3
  317. package/src/animation/AnimationMixer.js +1 -0
  318. package/src/cameras/CubeCamera.js +2 -0
  319. package/src/cameras/StereoCamera.js +8 -7
  320. package/src/constants.js +3 -23
  321. package/src/core/Layers.js +7 -1
  322. package/src/core/Object3D.js +3 -1
  323. package/src/extras/ImageUtils.js +63 -0
  324. package/src/extras/PMREMGenerator.js +49 -185
  325. package/src/extras/core/Interpolations.js +1 -1
  326. package/src/geometries/LatheGeometry.js +70 -47
  327. package/src/helpers/CameraHelper.js +1 -1
  328. package/src/loaders/FileLoader.js +98 -144
  329. package/src/loaders/ImageLoader.js +9 -4
  330. package/src/loaders/LoaderUtils.js +26 -0
  331. package/src/loaders/MaterialLoader.js +8 -5
  332. package/src/loaders/ObjectLoader.js +2 -0
  333. package/src/materials/Material.js +8 -8
  334. package/src/materials/MeshPhysicalMaterial.js +20 -14
  335. package/src/math/Color.js +1 -39
  336. package/src/math/MathUtils.js +5 -16
  337. package/src/math/Quaternion.js +1 -1
  338. package/src/math/Ray.js +2 -2
  339. package/src/math/Sphere.js +10 -1
  340. package/src/objects/Skeleton.js +1 -0
  341. package/src/renderers/WebGLCubeRenderTarget.js +0 -2
  342. package/src/renderers/WebGLMultisampleRenderTarget.js +7 -1
  343. package/src/renderers/WebGLRenderer.js +106 -199
  344. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +2 -2
  345. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +1 -1
  346. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +2 -24
  347. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +0 -2
  348. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +0 -78
  349. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  350. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -2
  351. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +1 -1
  352. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +1 -1
  353. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  354. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +19 -6
  355. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +28 -2
  356. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +10 -3
  357. package/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js +1 -2
  358. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  359. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  360. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +9 -8
  361. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -3
  362. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -3
  363. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -1
  364. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -2
  365. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +23 -5
  366. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +2 -1
  367. package/src/renderers/shaders/ShaderLib.js +8 -6
  368. package/src/renderers/shaders/UniformsLib.js +1 -2
  369. package/src/renderers/webgl/WebGLCapabilities.js +0 -2
  370. package/src/renderers/webgl/WebGLCubeMaps.js +0 -4
  371. package/src/renderers/webgl/WebGLCubeUVMaps.js +29 -16
  372. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  373. package/src/renderers/webgl/WebGLMaterials.js +27 -15
  374. package/src/renderers/webgl/WebGLMorphtargets.js +13 -0
  375. package/src/renderers/webgl/WebGLProgram.js +12 -37
  376. package/src/renderers/webgl/WebGLPrograms.js +192 -70
  377. package/src/renderers/webgl/WebGLRenderLists.js +4 -14
  378. package/src/renderers/webgl/WebGLShaderCache.js +120 -0
  379. package/src/renderers/webgl/WebGLShadowMap.js +14 -5
  380. package/src/renderers/webgl/WebGLState.js +157 -17
  381. package/src/renderers/webgl/WebGLTextures.js +442 -83
  382. package/src/renderers/webgl/WebGLUniforms.js +45 -1
  383. package/src/renderers/webgl/WebGLUtils.js +86 -28
  384. package/src/renderers/webxr/WebXRManager.js +77 -109
  385. package/src/scenes/Scene.js +1 -1
  386. package/src/textures/DataTexture.js +0 -2
  387. package/src/textures/DataTexture2DArray.js +0 -2
  388. package/src/textures/DataTexture3D.js +0 -2
  389. package/src/textures/FramebufferTexture.js +25 -0
  390. package/src/textures/Texture.js +8 -1
  391. package/src/textures/VideoTexture.js +1 -3
  392. package/examples/js/WebGL.js +0 -90
  393. package/examples/js/controls/DeviceOrientationControls.js +0 -147
  394. package/examples/js/libs/dat.gui.min.js +0 -14
  395. package/examples/js/utils/RoughnessMipmapper.js +0 -278
  396. package/examples/jsm/controls/DeviceOrientationControls.js +0 -153
  397. package/examples/jsm/libs/dat.gui.module.js +0 -3575
  398. package/examples/jsm/libs/glslang.js +0 -78
  399. package/examples/jsm/libs/glslang.wasm +0 -0
  400. package/examples/jsm/renderers/nodes/consts/MathConsts.js +0 -7
  401. package/examples/jsm/renderers/nodes/core/ConstNode.js +0 -39
  402. package/examples/jsm/renderers/nodes/core/NodeSlot.js +0 -13
  403. package/examples/jsm/renderers/nodes/core/StructNode.js +0 -80
  404. package/examples/jsm/renderers/nodes/core/StructVarNode.js +0 -75
  405. package/examples/jsm/renderers/nodes/functions/EncodingFunctions.js +0 -99
  406. package/examples/jsm/renderers/nodes/functions/MathFunctions.js +0 -47
  407. package/examples/jsm/renderers/webgpu/nodes/ShaderLib.js +0 -152
  408. package/examples/jsm/utils/RoughnessMipmapper.js +0 -300
  409. package/src/extras/objects/ImmediateRenderObject.js +0 -31
@@ -1,5 +1,6 @@
1
- import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBFormat, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, sRGBEncoding } from '../../constants.js';
1
+ import { LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, RGBAFormat, DepthFormat, DepthStencilFormat, UnsignedShortType, UnsignedIntType, UnsignedInt248Type, FloatType, HalfFloatType, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, sRGBEncoding, LinearEncoding, UnsignedByteType, _SRGBAFormat } from '../../constants.js';
2
2
  import * as MathUtils from '../../math/MathUtils.js';
3
+ import { ImageUtils } from '../../extras/ImageUtils.js';
3
4
  import { createElementNS } from '../../utils.js';
4
5
 
5
6
  function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {
@@ -9,6 +10,8 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
9
10
  const maxCubemapSize = capabilities.maxCubemapSize;
10
11
  const maxTextureSize = capabilities.maxTextureSize;
11
12
  const maxSamples = capabilities.maxSamples;
13
+ const hasMultisampledRenderToTexture = extensions.has( 'WEBGL_multisampled_render_to_texture' );
14
+ const MultisampledRenderToTextureExtension = hasMultisampledRenderToTexture ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : undefined;
12
15
 
13
16
  const _videoTextures = new WeakMap();
14
17
  let _canvas;
@@ -122,17 +125,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
122
125
 
123
126
  }
124
127
 
125
- function generateMipmap( target, texture, width, height, depth = 1 ) {
128
+ function generateMipmap( target ) {
126
129
 
127
130
  _gl.generateMipmap( target );
128
131
 
129
- const textureProperties = properties.get( texture );
130
-
131
- textureProperties.__maxMipLevel = Math.log2( Math.max( width, height, depth ) );
132
-
133
132
  }
134
133
 
135
- function getInternalFormat( internalFormatName, glFormat, glType, encoding ) {
134
+ function getInternalFormat( internalFormatName, glFormat, glType, encoding, isVideoTexture = false ) {
136
135
 
137
136
  if ( isWebGL2 === false ) return glFormat;
138
137
 
@@ -166,7 +165,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
166
165
 
167
166
  if ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;
168
167
  if ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;
169
- if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( encoding === sRGBEncoding ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;
168
+ if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( encoding === sRGBEncoding && isVideoTexture === false ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;
170
169
 
171
170
  }
172
171
 
@@ -181,6 +180,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
181
180
 
182
181
  }
183
182
 
183
+ function getMipLevels( texture, image, supportsMips ) {
184
+
185
+ if ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {
186
+
187
+ return Math.log2( Math.max( image.width, image.height ) ) + 1;
188
+
189
+ } else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {
190
+
191
+ // user-defined mipmaps
192
+
193
+ return texture.mipmaps.length;
194
+
195
+ } else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {
196
+
197
+ return image.mipmaps.length;
198
+
199
+ } else {
200
+
201
+ // texture without mipmaps (only base level)
202
+
203
+ return 1;
204
+
205
+ }
206
+
207
+ }
208
+
184
209
  // Fallback filters for non-power-of-2 textures
185
210
 
186
211
  function filterFallback( f ) {
@@ -526,19 +551,24 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
526
551
  _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );
527
552
 
528
553
  const needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;
529
- const image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );
554
+ let image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );
555
+ image = verifyColorSpace( texture, image );
530
556
 
531
557
  const supportsMips = isPowerOfTwo( image ) || isWebGL2,
532
- glFormat = utils.convert( texture.format );
558
+ glFormat = utils.convert( texture.format, texture.encoding );
533
559
 
534
560
  let glType = utils.convert( texture.type ),
535
- glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
561
+ glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );
536
562
 
537
563
  setTextureParameters( textureType, texture, supportsMips );
538
564
 
539
565
  let mipmap;
540
566
  const mipmaps = texture.mipmaps;
541
567
 
568
+ const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
569
+ const allocateMemory = ( textureProperties.__version === undefined );
570
+ const levels = getMipLevels( texture, image, supportsMips );
571
+
542
572
  if ( texture.isDepthTexture ) {
543
573
 
544
574
  // populate depth texture with dummy data
@@ -615,7 +645,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
615
645
 
616
646
  //
617
647
 
618
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
648
+ if ( useTexStorage && allocateMemory ) {
649
+
650
+ state.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );
651
+
652
+ } else {
653
+
654
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
655
+
656
+ }
619
657
 
620
658
  } else if ( texture.isDataTexture ) {
621
659
 
@@ -625,34 +663,75 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
625
663
 
626
664
  if ( mipmaps.length > 0 && supportsMips ) {
627
665
 
666
+ if ( useTexStorage && allocateMemory ) {
667
+
668
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
669
+
670
+ }
671
+
628
672
  for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
629
673
 
630
674
  mipmap = mipmaps[ i ];
631
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
675
+
676
+ if ( useTexStorage ) {
677
+
678
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
679
+
680
+ } else {
681
+
682
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
683
+
684
+ }
632
685
 
633
686
  }
634
687
 
635
688
  texture.generateMipmaps = false;
636
- textureProperties.__maxMipLevel = mipmaps.length - 1;
637
689
 
638
690
  } else {
639
691
 
640
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
641
- textureProperties.__maxMipLevel = 0;
692
+ if ( useTexStorage ) {
693
+
694
+ if ( allocateMemory ) {
695
+
696
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
697
+
698
+ }
699
+
700
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );
701
+
702
+ } else {
703
+
704
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
705
+
706
+ }
642
707
 
643
708
  }
644
709
 
645
710
  } else if ( texture.isCompressedTexture ) {
646
711
 
712
+ if ( useTexStorage && allocateMemory ) {
713
+
714
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
715
+
716
+ }
717
+
647
718
  for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
648
719
 
649
720
  mipmap = mipmaps[ i ];
650
721
 
651
- if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {
722
+ if ( texture.format !== RGBAFormat ) {
652
723
 
653
724
  if ( glFormat !== null ) {
654
725
 
655
- state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
726
+ if ( useTexStorage ) {
727
+
728
+ state.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
729
+
730
+ } else {
731
+
732
+ state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
733
+
734
+ }
656
735
 
657
736
  } else {
658
737
 
@@ -662,23 +741,67 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
662
741
 
663
742
  } else {
664
743
 
665
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
744
+ if ( useTexStorage ) {
745
+
746
+ state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
747
+
748
+ } else {
749
+
750
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
751
+
752
+ }
666
753
 
667
754
  }
668
755
 
669
756
  }
670
757
 
671
- textureProperties.__maxMipLevel = mipmaps.length - 1;
672
-
673
758
  } else if ( texture.isDataTexture2DArray ) {
674
759
 
675
- state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
676
- textureProperties.__maxMipLevel = 0;
760
+ if ( useTexStorage ) {
761
+
762
+ if ( allocateMemory ) {
763
+
764
+ state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );
765
+
766
+ }
767
+
768
+ state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
769
+
770
+ } else {
771
+
772
+ state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
773
+
774
+ }
677
775
 
678
776
  } else if ( texture.isDataTexture3D ) {
679
777
 
680
- state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
681
- textureProperties.__maxMipLevel = 0;
778
+ if ( useTexStorage ) {
779
+
780
+ if ( allocateMemory ) {
781
+
782
+ state.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );
783
+
784
+ }
785
+
786
+ state.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
787
+
788
+ } else {
789
+
790
+ state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
791
+
792
+ }
793
+
794
+ } else if ( texture.isFramebufferTexture ) {
795
+
796
+ if ( useTexStorage && allocateMemory ) {
797
+
798
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
799
+
800
+ } else {
801
+
802
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
803
+
804
+ }
682
805
 
683
806
  } else {
684
807
 
@@ -690,20 +813,47 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
690
813
 
691
814
  if ( mipmaps.length > 0 && supportsMips ) {
692
815
 
816
+ if ( useTexStorage && allocateMemory ) {
817
+
818
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
819
+
820
+ }
821
+
693
822
  for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
694
823
 
695
824
  mipmap = mipmaps[ i ];
696
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
825
+
826
+ if ( useTexStorage ) {
827
+
828
+ state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );
829
+
830
+ } else {
831
+
832
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
833
+
834
+ }
697
835
 
698
836
  }
699
837
 
700
838
  texture.generateMipmaps = false;
701
- textureProperties.__maxMipLevel = mipmaps.length - 1;
702
839
 
703
840
  } else {
704
841
 
705
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
706
- textureProperties.__maxMipLevel = 0;
842
+ if ( useTexStorage ) {
843
+
844
+ if ( allocateMemory ) {
845
+
846
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
847
+
848
+ }
849
+
850
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );
851
+
852
+ } else {
853
+
854
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
855
+
856
+ }
707
857
 
708
858
  }
709
859
 
@@ -711,7 +861,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
711
861
 
712
862
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
713
863
 
714
- generateMipmap( textureType, texture, image.width, image.height );
864
+ generateMipmap( textureType );
715
865
 
716
866
  }
717
867
 
@@ -752,20 +902,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
752
902
 
753
903
  }
754
904
 
905
+ cubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );
906
+
755
907
  }
756
908
 
757
909
  const image = cubeImage[ 0 ],
758
910
  supportsMips = isPowerOfTwo( image ) || isWebGL2,
759
- glFormat = utils.convert( texture.format ),
911
+ glFormat = utils.convert( texture.format, texture.encoding ),
760
912
  glType = utils.convert( texture.type ),
761
913
  glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
762
914
 
915
+ const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
916
+ const allocateMemory = ( textureProperties.__version === undefined );
917
+ let levels = getMipLevels( texture, image, supportsMips );
918
+
763
919
  setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );
764
920
 
765
921
  let mipmaps;
766
922
 
767
923
  if ( isCompressed ) {
768
924
 
925
+ if ( useTexStorage && allocateMemory ) {
926
+
927
+ state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );
928
+
929
+ }
930
+
769
931
  for ( let i = 0; i < 6; i ++ ) {
770
932
 
771
933
  mipmaps = cubeImage[ i ].mipmaps;
@@ -774,11 +936,19 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
774
936
 
775
937
  const mipmap = mipmaps[ j ];
776
938
 
777
- if ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {
939
+ if ( texture.format !== RGBAFormat ) {
778
940
 
779
941
  if ( glFormat !== null ) {
780
942
 
781
- state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
943
+ if ( useTexStorage ) {
944
+
945
+ state.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
946
+
947
+ } else {
948
+
949
+ state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
950
+
951
+ }
782
952
 
783
953
  } else {
784
954
 
@@ -788,7 +958,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
788
958
 
789
959
  } else {
790
960
 
791
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
961
+ if ( useTexStorage ) {
962
+
963
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
964
+
965
+ } else {
966
+
967
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
968
+
969
+ }
792
970
 
793
971
  }
794
972
 
@@ -796,36 +974,78 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
796
974
 
797
975
  }
798
976
 
799
- textureProperties.__maxMipLevel = mipmaps.length - 1;
800
-
801
977
  } else {
802
978
 
803
979
  mipmaps = texture.mipmaps;
804
980
 
981
+ if ( useTexStorage && allocateMemory ) {
982
+
983
+ // TODO: Uniformly handle mipmap definitions
984
+ // Normal textures and compressed cube textures define base level + mips with their mipmap array
985
+ // Uncompressed cube textures use their mipmap array only for mips (no base level)
986
+
987
+ if ( mipmaps.length > 0 ) levels ++;
988
+
989
+ state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );
990
+
991
+ }
992
+
805
993
  for ( let i = 0; i < 6; i ++ ) {
806
994
 
807
995
  if ( isDataTexture ) {
808
996
 
809
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
997
+ if ( useTexStorage ) {
998
+
999
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );
1000
+
1001
+ } else {
1002
+
1003
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
1004
+
1005
+ }
810
1006
 
811
1007
  for ( let j = 0; j < mipmaps.length; j ++ ) {
812
1008
 
813
1009
  const mipmap = mipmaps[ j ];
814
1010
  const mipmapImage = mipmap.image[ i ].image;
815
1011
 
816
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );
1012
+ if ( useTexStorage ) {
1013
+
1014
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );
1015
+
1016
+ } else {
1017
+
1018
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );
1019
+
1020
+ }
817
1021
 
818
1022
  }
819
1023
 
820
1024
  } else {
821
1025
 
822
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );
1026
+ if ( useTexStorage ) {
1027
+
1028
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );
1029
+
1030
+ } else {
1031
+
1032
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );
1033
+
1034
+ }
823
1035
 
824
1036
  for ( let j = 0; j < mipmaps.length; j ++ ) {
825
1037
 
826
1038
  const mipmap = mipmaps[ j ];
827
1039
 
828
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );
1040
+ if ( useTexStorage ) {
1041
+
1042
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );
1043
+
1044
+ } else {
1045
+
1046
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );
1047
+
1048
+ }
829
1049
 
830
1050
  }
831
1051
 
@@ -833,14 +1053,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
833
1053
 
834
1054
  }
835
1055
 
836
- textureProperties.__maxMipLevel = mipmaps.length;
837
-
838
1056
  }
839
1057
 
840
1058
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
841
1059
 
842
1060
  // We assume images for cube map have the same size.
843
- generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height );
1061
+ generateMipmap( _gl.TEXTURE_CUBE_MAP );
844
1062
 
845
1063
  }
846
1064
 
@@ -855,26 +1073,41 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
855
1073
  // Setup storage for target texture and bind it to correct framebuffer
856
1074
  function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {
857
1075
 
858
- const glFormat = utils.convert( texture.format );
1076
+ const glFormat = utils.convert( texture.format, texture.encoding );
859
1077
  const glType = utils.convert( texture.type );
860
1078
  const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1079
+ const renderTargetProperties = properties.get( renderTarget );
861
1080
 
862
- if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
1081
+ if ( ! renderTargetProperties.__hasExternalTextures ) {
863
1082
 
864
- state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
1083
+ if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
865
1084
 
866
- } else {
1085
+ state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
1086
+
1087
+ } else {
867
1088
 
868
- state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
1089
+ state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
1090
+
1091
+ }
869
1092
 
870
1093
  }
871
1094
 
872
1095
  state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
873
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
1096
+ if ( renderTarget.useRenderToTexture ) {
1097
+
1098
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );
1099
+
1100
+ } else {
1101
+
1102
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
1103
+
1104
+ }
1105
+
874
1106
  state.bindFramebuffer( _gl.FRAMEBUFFER, null );
875
1107
 
876
1108
  }
877
1109
 
1110
+
878
1111
  // Setup storage for internal depth/stencil buffers and bind to correct framebuffer
879
1112
  function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {
880
1113
 
@@ -884,7 +1117,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
884
1117
 
885
1118
  let glInternalFormat = _gl.DEPTH_COMPONENT16;
886
1119
 
887
- if ( isMultisample ) {
1120
+ if ( isMultisample || renderTarget.useRenderToTexture ) {
888
1121
 
889
1122
  const depthTexture = renderTarget.depthTexture;
890
1123
 
@@ -904,7 +1137,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
904
1137
 
905
1138
  const samples = getRenderTargetSamples( renderTarget );
906
1139
 
907
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1140
+ if ( renderTarget.useRenderToTexture ) {
1141
+
1142
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1143
+
1144
+ } else {
1145
+
1146
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1147
+
1148
+ }
908
1149
 
909
1150
  } else {
910
1151
 
@@ -916,12 +1157,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
916
1157
 
917
1158
  } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
918
1159
 
919
- if ( isMultisample ) {
1160
+ const samples = getRenderTargetSamples( renderTarget );
920
1161
 
921
- const samples = getRenderTargetSamples( renderTarget );
1162
+ if ( isMultisample && renderTarget.useRenderbuffer ) {
922
1163
 
923
1164
  _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
924
1165
 
1166
+ } else if ( renderTarget.useRenderToTexture ) {
1167
+
1168
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
1169
+
925
1170
  } else {
926
1171
 
927
1172
  _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
@@ -936,16 +1181,19 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
936
1181
  // Use the first texture for MRT so far
937
1182
  const texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;
938
1183
 
939
- const glFormat = utils.convert( texture.format );
1184
+ const glFormat = utils.convert( texture.format, texture.encoding );
940
1185
  const glType = utils.convert( texture.type );
941
1186
  const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1187
+ const samples = getRenderTargetSamples( renderTarget );
942
1188
 
943
- if ( isMultisample ) {
944
-
945
- const samples = getRenderTargetSamples( renderTarget );
1189
+ if ( isMultisample && renderTarget.useRenderbuffer ) {
946
1190
 
947
1191
  _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
948
1192
 
1193
+ } else if ( renderTarget.useRenderToTexture ) {
1194
+
1195
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1196
+
949
1197
  } else {
950
1198
 
951
1199
  _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
@@ -986,14 +1234,31 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
986
1234
  setTexture2D( renderTarget.depthTexture, 0 );
987
1235
 
988
1236
  const webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;
1237
+ const samples = getRenderTargetSamples( renderTarget );
989
1238
 
990
1239
  if ( renderTarget.depthTexture.format === DepthFormat ) {
991
1240
 
992
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1241
+ if ( renderTarget.useRenderToTexture ) {
1242
+
1243
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1244
+
1245
+ } else {
1246
+
1247
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1248
+
1249
+ }
993
1250
 
994
1251
  } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
995
1252
 
996
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1253
+ if ( renderTarget.useRenderToTexture ) {
1254
+
1255
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1256
+
1257
+ } else {
1258
+
1259
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1260
+
1261
+ }
997
1262
 
998
1263
  } else {
999
1264
 
@@ -1007,10 +1272,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1007
1272
  function setupDepthRenderbuffer( renderTarget ) {
1008
1273
 
1009
1274
  const renderTargetProperties = properties.get( renderTarget );
1010
-
1011
1275
  const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
1012
1276
 
1013
- if ( renderTarget.depthTexture ) {
1277
+ if ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {
1014
1278
 
1015
1279
  if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );
1016
1280
 
@@ -1044,6 +1308,25 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1044
1308
 
1045
1309
  }
1046
1310
 
1311
+ // rebind framebuffer with external textures
1312
+ function rebindTextures( renderTarget, colorTexture, depthTexture ) {
1313
+
1314
+ const renderTargetProperties = properties.get( renderTarget );
1315
+
1316
+ if ( colorTexture !== undefined ) {
1317
+
1318
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
1319
+
1320
+ }
1321
+
1322
+ if ( depthTexture !== undefined ) {
1323
+
1324
+ setupDepthRenderbuffer( renderTarget );
1325
+
1326
+ }
1327
+
1328
+ }
1329
+
1047
1330
  // Set up GL resources for the render target
1048
1331
  function setupRenderTarget( renderTarget ) {
1049
1332
 
@@ -1056,7 +1339,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1056
1339
 
1057
1340
  if ( renderTarget.isWebGLMultipleRenderTargets !== true ) {
1058
1341
 
1059
- textureProperties.__webglTexture = _gl.createTexture();
1342
+ if ( textureProperties.__webglTexture === undefined ) {
1343
+
1344
+ textureProperties.__webglTexture = _gl.createTexture();
1345
+
1346
+ }
1347
+
1060
1348
  textureProperties.__version = texture.version;
1061
1349
  info.memory.textures ++;
1062
1350
 
@@ -1064,20 +1352,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1064
1352
 
1065
1353
  const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
1066
1354
  const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
1067
- const isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true );
1068
1355
  const isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;
1069
1356
  const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
1070
1357
 
1071
- // Handles WebGL2 RGBFormat fallback - #18858
1072
-
1073
- if ( isWebGL2 && texture.format === RGBFormat && ( texture.type === FloatType || texture.type === HalfFloatType ) ) {
1074
-
1075
- texture.format = RGBAFormat;
1076
-
1077
- console.warn( 'THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.' );
1078
-
1079
- }
1080
-
1081
1358
  // Setup framebuffer
1082
1359
 
1083
1360
  if ( isCube ) {
@@ -1120,7 +1397,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1120
1397
 
1121
1398
  }
1122
1399
 
1123
- } else if ( isMultisample ) {
1400
+ } else if ( renderTarget.useRenderbuffer ) {
1124
1401
 
1125
1402
  if ( isWebGL2 ) {
1126
1403
 
@@ -1129,7 +1406,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1129
1406
 
1130
1407
  _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
1131
1408
 
1132
- const glFormat = utils.convert( texture.format );
1409
+ const glFormat = utils.convert( texture.format, texture.encoding );
1133
1410
  const glType = utils.convert( texture.type );
1134
1411
  const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1135
1412
  const samples = getRenderTargetSamples( renderTarget );
@@ -1174,7 +1451,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1174
1451
 
1175
1452
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1176
1453
 
1177
- generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, renderTarget.width, renderTarget.height );
1454
+ generateMipmap( _gl.TEXTURE_CUBE_MAP );
1178
1455
 
1179
1456
  }
1180
1457
 
@@ -1195,7 +1472,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1195
1472
 
1196
1473
  if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {
1197
1474
 
1198
- generateMipmap( _gl.TEXTURE_2D, attachment, renderTarget.width, renderTarget.height );
1475
+ generateMipmap( _gl.TEXTURE_2D );
1199
1476
 
1200
1477
  }
1201
1478
 
@@ -1230,7 +1507,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1230
1507
 
1231
1508
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1232
1509
 
1233
- generateMipmap( glTextureType, texture, renderTarget.width, renderTarget.height, renderTarget.depth );
1510
+ generateMipmap( glTextureType );
1234
1511
 
1235
1512
  }
1236
1513
 
@@ -1264,7 +1541,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1264
1541
  const webglTexture = properties.get( texture ).__webglTexture;
1265
1542
 
1266
1543
  state.bindTexture( target, webglTexture );
1267
- generateMipmap( target, texture, renderTarget.width, renderTarget.height );
1544
+ generateMipmap( target );
1268
1545
  state.unbindTexture();
1269
1546
 
1270
1547
  }
@@ -1275,23 +1552,43 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1275
1552
 
1276
1553
  function updateMultisampleRenderTarget( renderTarget ) {
1277
1554
 
1278
- if ( renderTarget.isWebGLMultisampleRenderTarget ) {
1555
+ if ( renderTarget.useRenderbuffer ) {
1279
1556
 
1280
1557
  if ( isWebGL2 ) {
1281
1558
 
1282
1559
  const width = renderTarget.width;
1283
1560
  const height = renderTarget.height;
1284
1561
  let mask = _gl.COLOR_BUFFER_BIT;
1562
+ const invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];
1563
+ const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
1564
+
1565
+ if ( renderTarget.depthBuffer ) {
1285
1566
 
1286
- if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
1287
- if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
1567
+ invalidationArray.push( depthStyle );
1568
+
1569
+ }
1570
+
1571
+ if ( ! renderTarget.ignoreDepthForMultisampleCopy ) {
1572
+
1573
+ if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
1574
+ if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
1575
+
1576
+ }
1288
1577
 
1289
1578
  const renderTargetProperties = properties.get( renderTarget );
1290
1579
 
1291
1580
  state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1292
1581
  state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
1293
1582
 
1583
+ if ( renderTarget.ignoreDepthForMultisampleCopy ) {
1584
+
1585
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
1586
+ _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
1587
+
1588
+ }
1589
+
1294
1590
  _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
1591
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
1295
1592
 
1296
1593
  state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
1297
1594
  state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
@@ -1308,7 +1605,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1308
1605
 
1309
1606
  function getRenderTargetSamples( renderTarget ) {
1310
1607
 
1311
- return ( isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget ) ?
1608
+ return ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?
1312
1609
  Math.min( maxSamples, renderTarget.samples ) : 0;
1313
1610
 
1314
1611
  }
@@ -1328,6 +1625,65 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1328
1625
 
1329
1626
  }
1330
1627
 
1628
+ function verifyColorSpace( texture, image ) {
1629
+
1630
+ const encoding = texture.encoding;
1631
+ const format = texture.format;
1632
+ const type = texture.type;
1633
+
1634
+ if ( texture.isCompressedTexture === true || texture.format === _SRGBAFormat ) return image;
1635
+
1636
+ if ( encoding !== LinearEncoding ) {
1637
+
1638
+ // sRGB
1639
+
1640
+ if ( encoding === sRGBEncoding && texture.isVideoTexture !== true ) {
1641
+
1642
+ if ( isWebGL2 === false ) {
1643
+
1644
+ // in WebGL 1, try to use EXT_sRGB extension and unsized formats
1645
+
1646
+ if ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {
1647
+
1648
+ texture.format = _SRGBAFormat;
1649
+
1650
+ // it's not possible to generate mips in WebGL 1 with this extension
1651
+
1652
+ texture.minFilter = LinearFilter;
1653
+ texture.generateMipmaps = false;
1654
+
1655
+ } else {
1656
+
1657
+ // slow fallback (CPU decode)
1658
+
1659
+ image = ImageUtils.sRGBToLinear( image );
1660
+
1661
+ }
1662
+
1663
+ } else {
1664
+
1665
+ // in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format
1666
+
1667
+ if ( format !== RGBAFormat || type !== UnsignedByteType ) {
1668
+
1669
+ console.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );
1670
+
1671
+ }
1672
+
1673
+ }
1674
+
1675
+ } else {
1676
+
1677
+ console.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );
1678
+
1679
+ }
1680
+
1681
+ }
1682
+
1683
+ return image;
1684
+
1685
+ }
1686
+
1331
1687
  // backwards compatibility
1332
1688
 
1333
1689
  let warnedTexture2D = false;
@@ -1381,9 +1737,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1381
1737
  this.setTexture2DArray = setTexture2DArray;
1382
1738
  this.setTexture3D = setTexture3D;
1383
1739
  this.setTextureCube = setTextureCube;
1740
+ this.rebindTextures = rebindTextures;
1384
1741
  this.setupRenderTarget = setupRenderTarget;
1385
1742
  this.updateRenderTargetMipmap = updateRenderTargetMipmap;
1386
1743
  this.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
1744
+ this.setupDepthRenderbuffer = setupDepthRenderbuffer;
1745
+ this.setupFrameBufferTexture = setupFrameBufferTexture;
1387
1746
 
1388
1747
  this.safeSetTexture2D = safeSetTexture2D;
1389
1748
  this.safeSetTextureCube = safeSetTextureCube;