super-three 0.133.3 → 0.136.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 (354) hide show
  1. package/build/three.js +1059 -783
  2. package/build/three.min.js +1 -1
  3. package/build/three.module.js +1424 -895
  4. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff +0 -0
  5. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  6. package/examples/fonts/open-sans/open-sans.css +9 -0
  7. package/examples/fonts/tabler-icons/fonts/tabler-icons.eot +0 -0
  8. package/examples/fonts/tabler-icons/fonts/tabler-icons.svg +3966 -0
  9. package/examples/fonts/tabler-icons/fonts/tabler-icons.ttf +0 -0
  10. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff +0 -0
  11. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff2 +0 -0
  12. package/examples/fonts/tabler-icons/tabler-icons.min.css +4 -0
  13. package/examples/js/animation/CCDIKSolver.js +0 -1
  14. package/examples/js/animation/MMDPhysics.js +1 -3
  15. package/examples/js/controls/ArcballControls.js +99 -72
  16. package/examples/js/controls/DragControls.js +7 -0
  17. package/examples/js/controls/OrbitControls.js +5 -36
  18. package/examples/js/controls/TrackballControls.js +3 -2
  19. package/examples/js/controls/TransformControls.js +24 -1
  20. package/examples/js/csm/CSM.js +2 -2
  21. package/examples/js/csm/CSMFrustum.js +133 -0
  22. package/examples/js/curves/CurveExtras.js +0 -2
  23. package/examples/js/effects/AsciiEffect.js +2 -9
  24. package/examples/js/exporters/GLTFExporter.js +148 -64
  25. package/examples/js/exporters/USDZExporter.js +45 -26
  26. package/examples/js/geometries/TeapotGeometry.js +0 -1
  27. package/examples/js/interactive/SelectionBox.js +2 -0
  28. package/examples/js/interactive/SelectionHelper.js +22 -7
  29. package/examples/js/lights/RectAreaLightUniformsLib.js +4 -0
  30. package/examples/js/lines/LineMaterial.js +58 -20
  31. package/examples/js/lines/LineSegments2.js +29 -24
  32. package/examples/js/loaders/3DMLoader.js +24 -11
  33. package/examples/js/loaders/3MFLoader.js +2 -2
  34. package/examples/js/loaders/AMFLoader.js +0 -2
  35. package/examples/js/loaders/ColladaLoader.js +61 -4
  36. package/examples/js/loaders/EXRLoader.js +185 -262
  37. package/examples/js/loaders/FBXLoader.js +4 -5
  38. package/examples/js/loaders/GLTFLoader.js +96 -33
  39. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -8
  40. package/examples/js/loaders/KTX2Loader.js +23 -2
  41. package/examples/js/loaders/KTXLoader.js +1 -1
  42. package/examples/js/loaders/LDrawLoader.js +26 -30
  43. package/examples/js/loaders/LUT3dlLoader.js +2 -0
  44. package/examples/js/loaders/LUTCubeLoader.js +2 -0
  45. package/examples/js/loaders/LWOLoader.js +8 -6
  46. package/examples/js/loaders/LogLuvLoader.js +766 -0
  47. package/examples/js/loaders/MMDLoader.js +0 -1
  48. package/examples/js/loaders/NRRDLoader.js +9 -2
  49. package/examples/js/loaders/OBJLoader.js +0 -2
  50. package/examples/js/loaders/PLYLoader.js +33 -8
  51. package/examples/js/loaders/RGBELoader.js +2 -16
  52. package/examples/js/loaders/RGBMLoader.js +55 -5
  53. package/examples/js/loaders/SVGLoader.js +9 -5
  54. package/examples/js/loaders/TDSLoader.js +237 -271
  55. package/examples/js/loaders/VOXLoader.js +1 -0
  56. package/examples/js/loaders/VRMLLoader.js +2 -1
  57. package/examples/js/loaders/lwo/LWO2Parser.js +1 -0
  58. package/examples/js/loaders/lwo/LWO3Parser.js +4 -2
  59. package/examples/js/math/ImprovedNoise.js +1 -1
  60. package/examples/js/misc/GPUComputationRenderer.js +3 -1
  61. package/examples/js/objects/Lensflare.js +2 -10
  62. package/examples/js/objects/MarchingCubes.js +42 -128
  63. package/examples/js/objects/Reflector.js +7 -0
  64. package/examples/js/objects/Refractor.js +7 -0
  65. package/examples/js/objects/Sky.js +1 -1
  66. package/examples/js/objects/Water.js +2 -2
  67. package/examples/js/objects/Water2.js +4 -7
  68. package/examples/js/postprocessing/GlitchPass.js +3 -1
  69. package/examples/js/postprocessing/SSAOPass.js +1 -0
  70. package/examples/js/renderers/CSS2DRenderer.js +4 -4
  71. package/examples/js/renderers/CSS3DRenderer.js +4 -4
  72. package/examples/js/shaders/ConvolutionShader.js +0 -1
  73. package/examples/js/shaders/FXAAShader.js +1 -1
  74. package/examples/js/shaders/FilmShader.js +1 -1
  75. package/examples/js/shaders/GammaCorrectionShader.js +1 -1
  76. package/examples/js/shaders/HorizontalBlurShader.js +1 -2
  77. package/examples/js/shaders/SSRShader.js +1 -1
  78. package/examples/js/shaders/SSRrShader.js +1 -1
  79. package/examples/js/shaders/VerticalBlurShader.js +1 -2
  80. package/examples/js/utils/GeometryUtils.js +1 -1
  81. package/examples/js/utils/RoughnessMipmapper.js +18 -28
  82. package/examples/jsm/animation/CCDIKSolver.js +0 -1
  83. package/examples/jsm/animation/MMDPhysics.js +0 -2
  84. package/examples/jsm/controls/ArcballControls.js +80 -77
  85. package/examples/jsm/controls/DragControls.js +7 -0
  86. package/examples/jsm/controls/OrbitControls.js +9 -51
  87. package/examples/jsm/controls/TrackballControls.js +1 -1
  88. package/examples/jsm/controls/TransformControls.js +24 -1
  89. package/examples/jsm/csm/CSM.js +3 -3
  90. package/examples/jsm/csm/{Frustum.js → CSMFrustum.js} +3 -3
  91. package/examples/jsm/curves/CurveExtras.js +0 -2
  92. package/examples/jsm/effects/AsciiEffect.js +2 -9
  93. package/examples/jsm/exporters/GLTFExporter.js +161 -75
  94. package/examples/jsm/exporters/USDZExporter.js +47 -26
  95. package/examples/jsm/geometries/TeapotGeometry.js +0 -1
  96. package/examples/jsm/interactive/SelectionBox.js +1 -0
  97. package/examples/jsm/interactive/SelectionHelper.js +19 -7
  98. package/examples/jsm/libs/flow.module.js +3338 -0
  99. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  100. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  101. package/examples/jsm/lights/RectAreaLightUniformsLib.js +7 -0
  102. package/examples/jsm/lines/LineMaterial.js +59 -23
  103. package/examples/jsm/lines/LineSegments2.js +22 -18
  104. package/examples/jsm/loaders/3DMLoader.js +18 -12
  105. package/examples/jsm/loaders/3MFLoader.js +2 -2
  106. package/examples/jsm/loaders/AMFLoader.js +0 -2
  107. package/examples/jsm/loaders/ColladaLoader.js +61 -4
  108. package/examples/jsm/loaders/EXRLoader.js +184 -293
  109. package/examples/jsm/loaders/FBXLoader.js +4 -5
  110. package/examples/jsm/loaders/GLTFLoader.js +101 -37
  111. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -14
  112. package/examples/jsm/loaders/KTX2Loader.js +30 -2
  113. package/examples/jsm/loaders/KTXLoader.js +1 -1
  114. package/examples/jsm/loaders/LDrawLoader.js +23 -24
  115. package/examples/jsm/loaders/LUT3dlLoader.js +2 -0
  116. package/examples/jsm/loaders/LUTCubeLoader.js +2 -0
  117. package/examples/jsm/loaders/LWOLoader.js +8 -6
  118. package/examples/jsm/loaders/LogLuvLoader.js +606 -0
  119. package/examples/jsm/loaders/MMDLoader.js +0 -1
  120. package/examples/jsm/loaders/NRRDLoader.js +10 -2
  121. package/examples/jsm/loaders/OBJLoader.js +0 -2
  122. package/examples/jsm/loaders/PLYLoader.js +34 -8
  123. package/examples/jsm/loaders/RGBELoader.js +0 -20
  124. package/examples/jsm/loaders/RGBMLoader.js +61 -7
  125. package/examples/jsm/loaders/SVGLoader.js +9 -6
  126. package/examples/jsm/loaders/TDSLoader.js +236 -275
  127. package/examples/jsm/loaders/VOXLoader.js +1 -0
  128. package/examples/jsm/loaders/VRMLLoader.js +2 -1
  129. package/examples/jsm/loaders/lwo/LWO2Parser.js +1 -0
  130. package/examples/jsm/loaders/lwo/LWO3Parser.js +2 -2
  131. package/examples/jsm/math/ImprovedNoise.js +1 -1
  132. package/examples/jsm/misc/GPUComputationRenderer.js +3 -1
  133. package/examples/jsm/node-editor/NodeEditor.js +456 -0
  134. package/examples/jsm/node-editor/accessors/NormalEditor.js +30 -0
  135. package/examples/jsm/node-editor/accessors/PositionEditor.js +30 -0
  136. package/examples/jsm/node-editor/accessors/UVEditor.js +26 -0
  137. package/examples/jsm/node-editor/display/BlendEditor.js +43 -0
  138. package/examples/jsm/node-editor/examples/animate-uv.json +1 -0
  139. package/examples/jsm/node-editor/examples/fake-top-light.json +1 -0
  140. package/examples/jsm/node-editor/examples/oscillator-color.json +1 -0
  141. package/examples/jsm/node-editor/examples/rim.json +1 -0
  142. package/examples/jsm/node-editor/inputs/ColorEditor.js +91 -0
  143. package/examples/jsm/node-editor/inputs/FloatEditor.js +24 -0
  144. package/examples/jsm/node-editor/inputs/SliderEditor.js +68 -0
  145. package/examples/jsm/node-editor/inputs/Vector2Editor.js +28 -0
  146. package/examples/jsm/node-editor/inputs/Vector3Editor.js +30 -0
  147. package/examples/jsm/node-editor/inputs/Vector4Editor.js +37 -0
  148. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +108 -0
  149. package/examples/jsm/node-editor/math/DotEditor.js +36 -0
  150. package/examples/jsm/node-editor/math/InvertEditor.js +38 -0
  151. package/examples/jsm/node-editor/math/LimiterEditor.js +48 -0
  152. package/examples/jsm/node-editor/math/NormalizeEditor.js +26 -0
  153. package/examples/jsm/node-editor/math/OperatorEditor.js +50 -0
  154. package/examples/jsm/node-editor/math/PowerEditor.js +34 -0
  155. package/examples/jsm/node-editor/math/TrigonometryEditor.js +39 -0
  156. package/examples/jsm/node-editor/procedural/CheckerEditor.js +26 -0
  157. package/examples/jsm/node-editor/utils/OscillatorEditor.js +42 -0
  158. package/examples/jsm/node-editor/utils/TimerEditor.js +57 -0
  159. package/examples/jsm/nodes/core/NodeBuilder.js +2 -2
  160. package/examples/jsm/nodes/materials/StandardNodeMaterial.js +1 -1
  161. package/examples/jsm/nodes/materials/nodes/StandardNode.js +7 -6
  162. package/examples/jsm/nodes/math/MathNode.js +12 -0
  163. package/examples/jsm/nodes/misc/BumpMapNode.js +1 -1
  164. package/examples/jsm/nodes/misc/TextureCubeUVNode.js +1 -4
  165. package/examples/jsm/nodes/utils/ColorSpaceNode.js +1 -164
  166. package/examples/jsm/objects/Lensflare.js +3 -14
  167. package/examples/jsm/objects/MarchingCubes.js +46 -152
  168. package/examples/jsm/objects/Reflector.js +7 -0
  169. package/examples/jsm/objects/Refractor.js +7 -0
  170. package/examples/jsm/objects/Sky.js +1 -1
  171. package/examples/jsm/objects/Water.js +2 -2
  172. package/examples/jsm/objects/Water2.js +4 -8
  173. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +1 -1
  174. package/examples/jsm/postprocessing/AfterimagePass.js +1 -1
  175. package/examples/jsm/postprocessing/BloomPass.js +1 -1
  176. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  177. package/examples/jsm/postprocessing/ClearPass.js +1 -1
  178. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -1
  179. package/examples/jsm/postprocessing/DotScreenPass.js +1 -1
  180. package/examples/jsm/postprocessing/EffectComposer.js +3 -3
  181. package/examples/jsm/postprocessing/FilmPass.js +1 -1
  182. package/examples/jsm/postprocessing/GlitchPass.js +4 -2
  183. package/examples/jsm/postprocessing/HalftonePass.js +1 -1
  184. package/examples/jsm/postprocessing/MaskPass.js +1 -1
  185. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  186. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  187. package/examples/jsm/postprocessing/SAOPass.js +2 -2
  188. package/examples/jsm/postprocessing/SMAAPass.js +1 -1
  189. package/examples/jsm/postprocessing/SSAARenderPass.js +1 -1
  190. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  191. package/examples/jsm/postprocessing/SSRPass.js +1 -1
  192. package/examples/jsm/postprocessing/SSRrPass.js +1 -1
  193. package/examples/jsm/postprocessing/SavePass.js +1 -1
  194. package/examples/jsm/postprocessing/ShaderPass.js +1 -1
  195. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  196. package/examples/jsm/postprocessing/TexturePass.js +1 -1
  197. package/examples/jsm/postprocessing/UnrealBloomPass.js +1 -1
  198. package/examples/jsm/renderers/CSS2DRenderer.js +5 -4
  199. package/examples/jsm/renderers/CSS3DRenderer.js +5 -4
  200. package/examples/jsm/renderers/nodes/Nodes.js +15 -13
  201. package/examples/jsm/renderers/nodes/ShaderNode.js +194 -41
  202. package/examples/jsm/renderers/nodes/accessors/MaterialNode.js +6 -6
  203. package/examples/jsm/renderers/nodes/accessors/ModelViewProjectionNode.js +5 -5
  204. package/examples/jsm/renderers/nodes/accessors/NormalNode.js +14 -3
  205. package/examples/jsm/renderers/nodes/accessors/PointUVNode.js +3 -3
  206. package/examples/jsm/renderers/nodes/accessors/PositionNode.js +15 -5
  207. package/examples/jsm/renderers/nodes/accessors/SkinningNode.js +107 -0
  208. package/examples/jsm/renderers/nodes/accessors/UVNode.js +7 -5
  209. package/examples/jsm/renderers/nodes/core/ArrayInputNode.js +3 -3
  210. package/examples/jsm/renderers/nodes/core/AttributeNode.js +6 -0
  211. package/examples/jsm/renderers/nodes/core/BypassNode.js +38 -0
  212. package/examples/jsm/renderers/nodes/core/CodeNode.js +3 -3
  213. package/examples/jsm/renderers/nodes/core/ContextNode.js +4 -19
  214. package/examples/jsm/renderers/nodes/core/ExpressionNode.js +13 -2
  215. package/examples/jsm/renderers/nodes/core/FunctionNode.js +19 -132
  216. package/examples/jsm/renderers/nodes/core/InputNode.js +13 -3
  217. package/examples/jsm/renderers/nodes/core/Node.js +32 -10
  218. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +146 -128
  219. package/examples/jsm/renderers/nodes/core/NodeFunction.js +22 -0
  220. package/examples/jsm/renderers/nodes/core/NodeFunctionInput.js +4 -4
  221. package/examples/jsm/renderers/nodes/core/NodeKeywords.js +18 -179
  222. package/examples/jsm/renderers/nodes/core/NodeParser.js +11 -0
  223. package/examples/jsm/renderers/nodes/core/NodeVar.js +2 -2
  224. package/examples/jsm/renderers/nodes/core/PropertyNode.js +14 -2
  225. package/examples/jsm/renderers/nodes/core/TempNode.js +10 -13
  226. package/examples/jsm/renderers/nodes/core/VarNode.js +12 -7
  227. package/examples/jsm/renderers/nodes/core/VaryNode.js +23 -8
  228. package/examples/jsm/renderers/nodes/core/constants.js +2 -0
  229. package/examples/jsm/renderers/nodes/display/ColorSpaceNode.js +60 -43
  230. package/examples/jsm/renderers/nodes/display/NormalMapNode.js +21 -22
  231. package/examples/jsm/renderers/nodes/functions/BSDFs.js +64 -101
  232. package/examples/jsm/renderers/nodes/functions/PhysicalMaterialFunctions.js +27 -0
  233. package/examples/jsm/renderers/nodes/inputs/BufferNode.js +25 -0
  234. package/examples/jsm/renderers/nodes/inputs/IntNode.js +17 -0
  235. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +10 -2
  236. package/examples/jsm/renderers/nodes/lights/LightContextNode.js +20 -14
  237. package/examples/jsm/renderers/nodes/lights/LightNode.js +32 -36
  238. package/examples/jsm/renderers/nodes/math/CondNode.js +60 -0
  239. package/examples/jsm/renderers/nodes/math/MathNode.js +90 -37
  240. package/examples/jsm/renderers/nodes/math/OperatorNode.js +124 -31
  241. package/examples/jsm/renderers/nodes/parsers/GLSLNodeFunction.js +137 -0
  242. package/examples/jsm/renderers/nodes/parsers/GLSLNodeParser.js +14 -0
  243. package/examples/jsm/renderers/nodes/parsers/WGSLNodeFunction.js +89 -0
  244. package/examples/jsm/renderers/nodes/parsers/WGSLNodeParser.js +14 -0
  245. package/examples/jsm/renderers/nodes/procedural/CheckerNode.js +7 -9
  246. package/examples/jsm/renderers/nodes/utils/ArrayElementNode.js +31 -0
  247. package/examples/jsm/renderers/nodes/utils/ConvertNode.js +33 -0
  248. package/examples/jsm/renderers/nodes/utils/JoinNode.js +7 -7
  249. package/examples/jsm/renderers/nodes/utils/OscNode.js +58 -0
  250. package/examples/jsm/renderers/nodes/utils/SplitNode.js +18 -8
  251. package/examples/jsm/renderers/nodes/utils/SpriteSheetUVNode.js +7 -7
  252. package/examples/jsm/renderers/nodes/utils/TimerNode.js +1 -1
  253. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +22 -0
  254. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +192 -95
  255. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +2 -2
  256. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +2 -2
  257. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +1 -1
  258. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +10 -9
  259. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +2 -4
  260. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +2 -4
  261. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +15 -23
  262. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +44 -65
  263. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +12 -28
  264. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +61 -28
  265. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +34 -27
  266. package/examples/jsm/renderers/webgpu/constants.js +2 -2
  267. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +453 -95
  268. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  269. package/examples/jsm/shaders/ConvolutionShader.js +0 -1
  270. package/examples/jsm/shaders/FXAAShader.js +1 -1
  271. package/examples/jsm/shaders/FilmShader.js +1 -1
  272. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  273. package/examples/jsm/shaders/HorizontalBlurShader.js +1 -2
  274. package/examples/jsm/shaders/SSRShader.js +1 -1
  275. package/examples/jsm/shaders/SSRrShader.js +1 -1
  276. package/examples/jsm/shaders/VerticalBlurShader.js +1 -2
  277. package/examples/jsm/utils/GeometryUtils.js +1 -1
  278. package/examples/jsm/utils/RoughnessMipmapper.js +19 -31
  279. package/examples/jsm/utils/WorkerPool.js +11 -11
  280. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -6
  281. package/package.json +24 -18
  282. package/src/Three.Legacy.js +18 -0
  283. package/src/Three.js +1 -3
  284. package/src/cameras/StereoCamera.js +8 -7
  285. package/src/constants.js +1 -8
  286. package/src/core/Layers.js +7 -1
  287. package/src/core/Object3D.js +3 -1
  288. package/src/extras/PMREMGenerator.js +23 -109
  289. package/src/extras/core/Interpolations.js +1 -1
  290. package/src/geometries/LatheGeometry.js +70 -47
  291. package/src/helpers/CameraHelper.js +1 -1
  292. package/src/loaders/FileLoader.js +98 -144
  293. package/src/loaders/ImageLoader.js +9 -4
  294. package/src/loaders/LoaderUtils.js +26 -0
  295. package/src/loaders/MaterialLoader.js +7 -4
  296. package/src/loaders/ObjectLoader.js +2 -0
  297. package/src/materials/Material.js +4 -4
  298. package/src/materials/MeshPhysicalMaterial.js +20 -14
  299. package/src/math/Color.js +0 -38
  300. package/src/math/MathUtils.js +5 -16
  301. package/src/math/Ray.js +2 -2
  302. package/src/math/Sphere.js +10 -1
  303. package/src/objects/Skeleton.js +1 -0
  304. package/src/renderers/WebGLMultisampleRenderTarget.js +7 -1
  305. package/src/renderers/WebGLRenderer.js +105 -132
  306. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +2 -2
  307. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +1 -1
  308. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +2 -24
  309. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +0 -74
  310. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  311. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +1 -1
  312. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +19 -6
  313. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +28 -2
  314. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  315. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  316. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +1 -1
  317. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +23 -5
  318. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +2 -1
  319. package/src/renderers/shaders/ShaderLib.js +6 -4
  320. package/src/renderers/shaders/UniformsLib.js +1 -2
  321. package/src/renderers/webgl/WebGLCapabilities.js +0 -2
  322. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  323. package/src/renderers/webgl/WebGLMaterials.js +27 -15
  324. package/src/renderers/webgl/WebGLMorphtargets.js +1 -0
  325. package/src/renderers/webgl/WebGLProgram.js +11 -24
  326. package/src/renderers/webgl/WebGLPrograms.js +194 -33
  327. package/src/renderers/webgl/WebGLRenderLists.js +4 -14
  328. package/src/renderers/webgl/WebGLShaderCache.js +120 -0
  329. package/src/renderers/webgl/WebGLShadowMap.js +14 -5
  330. package/src/renderers/webgl/WebGLState.js +76 -17
  331. package/src/renderers/webgl/WebGLTextures.js +367 -61
  332. package/src/renderers/webgl/WebGLUniforms.js +45 -1
  333. package/src/renderers/webxr/WebXRManager.js +77 -109
  334. package/src/scenes/Scene.js +1 -1
  335. package/src/textures/DataTexture.js +0 -2
  336. package/src/textures/DataTexture2DArray.js +0 -2
  337. package/src/textures/DataTexture3D.js +0 -2
  338. package/src/textures/FramebufferTexture.js +25 -0
  339. package/src/textures/Texture.js +6 -0
  340. package/examples/js/controls/DeviceOrientationControls.js +0 -147
  341. package/examples/js/libs/dat.gui.min.js +0 -14
  342. package/examples/jsm/controls/DeviceOrientationControls.js +0 -153
  343. package/examples/jsm/libs/dat.gui.module.js +0 -3575
  344. package/examples/jsm/libs/glslang.js +0 -78
  345. package/examples/jsm/libs/glslang.wasm +0 -0
  346. package/examples/jsm/renderers/nodes/consts/MathConsts.js +0 -7
  347. package/examples/jsm/renderers/nodes/core/ConstNode.js +0 -39
  348. package/examples/jsm/renderers/nodes/core/NodeSlot.js +0 -13
  349. package/examples/jsm/renderers/nodes/core/StructNode.js +0 -80
  350. package/examples/jsm/renderers/nodes/core/StructVarNode.js +0 -75
  351. package/examples/jsm/renderers/nodes/functions/EncodingFunctions.js +0 -99
  352. package/examples/jsm/renderers/nodes/functions/MathFunctions.js +0 -47
  353. package/examples/jsm/renderers/webgpu/nodes/ShaderLib.js +0 -152
  354. package/src/extras/objects/ImmediateRenderObject.js +0 -31
@@ -9,6 +9,8 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
9
9
  const maxCubemapSize = capabilities.maxCubemapSize;
10
10
  const maxTextureSize = capabilities.maxTextureSize;
11
11
  const maxSamples = capabilities.maxSamples;
12
+ const hasMultisampledRenderToTexture = extensions.has( 'WEBGL_multisampled_render_to_texture' );
13
+ const MultisampledRenderToTextureExtension = hasMultisampledRenderToTexture ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : undefined;
12
14
 
13
15
  const _videoTextures = new WeakMap();
14
16
  let _canvas;
@@ -122,14 +124,10 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
122
124
 
123
125
  }
124
126
 
125
- function generateMipmap( target, texture, width, height, depth = 1 ) {
127
+ function generateMipmap( target ) {
126
128
 
127
129
  _gl.generateMipmap( target );
128
130
 
129
- const textureProperties = properties.get( texture );
130
-
131
- textureProperties.__maxMipLevel = Math.log2( Math.max( width, height, depth ) );
132
-
133
131
  }
134
132
 
135
133
  function getInternalFormat( internalFormatName, glFormat, glType, encoding ) {
@@ -181,6 +179,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
181
179
 
182
180
  }
183
181
 
182
+ function getMipLevels( texture, image, supportsMips ) {
183
+
184
+ if ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {
185
+
186
+ return Math.log2( Math.max( image.width, image.height ) ) + 1;
187
+
188
+ } else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {
189
+
190
+ // user-defined mipmaps
191
+
192
+ return texture.mipmaps.length;
193
+
194
+ } else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {
195
+
196
+ return image.mipmaps.length;
197
+
198
+ } else {
199
+
200
+ // texture without mipmaps (only base level)
201
+
202
+ return 1;
203
+
204
+ }
205
+
206
+ }
207
+
184
208
  // Fallback filters for non-power-of-2 textures
185
209
 
186
210
  function filterFallback( f ) {
@@ -539,6 +563,10 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
539
563
  let mipmap;
540
564
  const mipmaps = texture.mipmaps;
541
565
 
566
+ const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
567
+ const allocateMemory = ( textureProperties.__version === undefined );
568
+ const levels = getMipLevels( texture, image, supportsMips );
569
+
542
570
  if ( texture.isDepthTexture ) {
543
571
 
544
572
  // populate depth texture with dummy data
@@ -615,7 +643,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
615
643
 
616
644
  //
617
645
 
618
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
646
+ if ( useTexStorage && allocateMemory ) {
647
+
648
+ state.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );
649
+
650
+ } else {
651
+
652
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
653
+
654
+ }
619
655
 
620
656
  } else if ( texture.isDataTexture ) {
621
657
 
@@ -625,25 +661,58 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
625
661
 
626
662
  if ( mipmaps.length > 0 && supportsMips ) {
627
663
 
664
+ if ( useTexStorage && allocateMemory ) {
665
+
666
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
667
+
668
+ }
669
+
628
670
  for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
629
671
 
630
672
  mipmap = mipmaps[ i ];
631
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
673
+
674
+ if ( useTexStorage ) {
675
+
676
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
677
+
678
+ } else {
679
+
680
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
681
+
682
+ }
632
683
 
633
684
  }
634
685
 
635
686
  texture.generateMipmaps = false;
636
- textureProperties.__maxMipLevel = mipmaps.length - 1;
637
687
 
638
688
  } else {
639
689
 
640
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
641
- textureProperties.__maxMipLevel = 0;
690
+ if ( useTexStorage ) {
691
+
692
+ if ( allocateMemory ) {
693
+
694
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
695
+
696
+ }
697
+
698
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );
699
+
700
+ } else {
701
+
702
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
703
+
704
+ }
642
705
 
643
706
  }
644
707
 
645
708
  } else if ( texture.isCompressedTexture ) {
646
709
 
710
+ if ( useTexStorage && allocateMemory ) {
711
+
712
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
713
+
714
+ }
715
+
647
716
  for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
648
717
 
649
718
  mipmap = mipmaps[ i ];
@@ -652,7 +721,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
652
721
 
653
722
  if ( glFormat !== null ) {
654
723
 
655
- state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
724
+ if ( useTexStorage ) {
725
+
726
+ state.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
727
+
728
+ } else {
729
+
730
+ state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
731
+
732
+ }
656
733
 
657
734
  } else {
658
735
 
@@ -662,23 +739,67 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
662
739
 
663
740
  } else {
664
741
 
665
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
742
+ if ( useTexStorage ) {
743
+
744
+ state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
745
+
746
+ } else {
747
+
748
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
749
+
750
+ }
666
751
 
667
752
  }
668
753
 
669
754
  }
670
755
 
671
- textureProperties.__maxMipLevel = mipmaps.length - 1;
672
-
673
756
  } else if ( texture.isDataTexture2DArray ) {
674
757
 
675
- state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
676
- textureProperties.__maxMipLevel = 0;
758
+ if ( useTexStorage ) {
759
+
760
+ if ( allocateMemory ) {
761
+
762
+ state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );
763
+
764
+ }
765
+
766
+ state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
767
+
768
+ } else {
769
+
770
+ state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
771
+
772
+ }
677
773
 
678
774
  } else if ( texture.isDataTexture3D ) {
679
775
 
680
- state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
681
- textureProperties.__maxMipLevel = 0;
776
+ if ( useTexStorage ) {
777
+
778
+ if ( allocateMemory ) {
779
+
780
+ state.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );
781
+
782
+ }
783
+
784
+ state.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
785
+
786
+ } else {
787
+
788
+ state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
789
+
790
+ }
791
+
792
+ } else if ( texture.isFramebufferTexture ) {
793
+
794
+ if ( useTexStorage && allocateMemory ) {
795
+
796
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
797
+
798
+ } else {
799
+
800
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
801
+
802
+ }
682
803
 
683
804
  } else {
684
805
 
@@ -690,20 +811,47 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
690
811
 
691
812
  if ( mipmaps.length > 0 && supportsMips ) {
692
813
 
814
+ if ( useTexStorage && allocateMemory ) {
815
+
816
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
817
+
818
+ }
819
+
693
820
  for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
694
821
 
695
822
  mipmap = mipmaps[ i ];
696
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
823
+
824
+ if ( useTexStorage ) {
825
+
826
+ state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );
827
+
828
+ } else {
829
+
830
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
831
+
832
+ }
697
833
 
698
834
  }
699
835
 
700
836
  texture.generateMipmaps = false;
701
- textureProperties.__maxMipLevel = mipmaps.length - 1;
702
837
 
703
838
  } else {
704
839
 
705
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
706
- textureProperties.__maxMipLevel = 0;
840
+ if ( useTexStorage ) {
841
+
842
+ if ( allocateMemory ) {
843
+
844
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
845
+
846
+ }
847
+
848
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );
849
+
850
+ } else {
851
+
852
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
853
+
854
+ }
707
855
 
708
856
  }
709
857
 
@@ -711,7 +859,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
711
859
 
712
860
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
713
861
 
714
- generateMipmap( textureType, texture, image.width, image.height );
862
+ generateMipmap( textureType );
715
863
 
716
864
  }
717
865
 
@@ -760,12 +908,22 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
760
908
  glType = utils.convert( texture.type ),
761
909
  glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
762
910
 
911
+ const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
912
+ const allocateMemory = ( textureProperties.__version === undefined );
913
+ let levels = getMipLevels( texture, image, supportsMips );
914
+
763
915
  setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );
764
916
 
765
917
  let mipmaps;
766
918
 
767
919
  if ( isCompressed ) {
768
920
 
921
+ if ( useTexStorage && allocateMemory ) {
922
+
923
+ state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );
924
+
925
+ }
926
+
769
927
  for ( let i = 0; i < 6; i ++ ) {
770
928
 
771
929
  mipmaps = cubeImage[ i ].mipmaps;
@@ -778,7 +936,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
778
936
 
779
937
  if ( glFormat !== null ) {
780
938
 
781
- state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
939
+ if ( useTexStorage ) {
940
+
941
+ state.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
942
+
943
+ } else {
944
+
945
+ state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
946
+
947
+ }
782
948
 
783
949
  } else {
784
950
 
@@ -788,7 +954,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
788
954
 
789
955
  } else {
790
956
 
791
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
957
+ if ( useTexStorage ) {
958
+
959
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
960
+
961
+ } else {
962
+
963
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
964
+
965
+ }
792
966
 
793
967
  }
794
968
 
@@ -796,36 +970,78 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
796
970
 
797
971
  }
798
972
 
799
- textureProperties.__maxMipLevel = mipmaps.length - 1;
800
-
801
973
  } else {
802
974
 
803
975
  mipmaps = texture.mipmaps;
804
976
 
977
+ if ( useTexStorage && allocateMemory ) {
978
+
979
+ // TODO: Uniformly handle mipmap definitions
980
+ // Normal textures and compressed cube textures define base level + mips with their mipmap array
981
+ // Uncompressed cube textures use their mipmap array only for mips (no base level)
982
+
983
+ if ( mipmaps.length > 0 ) levels ++;
984
+
985
+ state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );
986
+
987
+ }
988
+
805
989
  for ( let i = 0; i < 6; i ++ ) {
806
990
 
807
991
  if ( isDataTexture ) {
808
992
 
809
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
993
+ if ( useTexStorage ) {
994
+
995
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );
996
+
997
+ } else {
998
+
999
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
1000
+
1001
+ }
810
1002
 
811
1003
  for ( let j = 0; j < mipmaps.length; j ++ ) {
812
1004
 
813
1005
  const mipmap = mipmaps[ j ];
814
1006
  const mipmapImage = mipmap.image[ i ].image;
815
1007
 
816
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );
1008
+ if ( useTexStorage ) {
1009
+
1010
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );
1011
+
1012
+ } else {
1013
+
1014
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );
1015
+
1016
+ }
817
1017
 
818
1018
  }
819
1019
 
820
1020
  } else {
821
1021
 
822
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );
1022
+ if ( useTexStorage ) {
1023
+
1024
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );
1025
+
1026
+ } else {
1027
+
1028
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );
1029
+
1030
+ }
823
1031
 
824
1032
  for ( let j = 0; j < mipmaps.length; j ++ ) {
825
1033
 
826
1034
  const mipmap = mipmaps[ j ];
827
1035
 
828
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );
1036
+ if ( useTexStorage ) {
1037
+
1038
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );
1039
+
1040
+ } else {
1041
+
1042
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );
1043
+
1044
+ }
829
1045
 
830
1046
  }
831
1047
 
@@ -833,14 +1049,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
833
1049
 
834
1050
  }
835
1051
 
836
- textureProperties.__maxMipLevel = mipmaps.length;
837
-
838
1052
  }
839
1053
 
840
1054
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
841
1055
 
842
1056
  // We assume images for cube map have the same size.
843
- generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, image.width, image.height );
1057
+ generateMipmap( _gl.TEXTURE_CUBE_MAP );
844
1058
 
845
1059
  }
846
1060
 
@@ -858,23 +1072,38 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
858
1072
  const glFormat = utils.convert( texture.format );
859
1073
  const glType = utils.convert( texture.type );
860
1074
  const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1075
+ const renderTargetProperties = properties.get( renderTarget );
861
1076
 
862
- if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
1077
+ if ( ! renderTargetProperties.__hasExternalTextures ) {
863
1078
 
864
- state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
1079
+ if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
865
1080
 
866
- } else {
1081
+ state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
1082
+
1083
+ } else {
867
1084
 
868
- state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
1085
+ state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
1086
+
1087
+ }
869
1088
 
870
1089
  }
871
1090
 
872
1091
  state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
873
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
1092
+ if ( renderTarget.useRenderToTexture ) {
1093
+
1094
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );
1095
+
1096
+ } else {
1097
+
1098
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
1099
+
1100
+ }
1101
+
874
1102
  state.bindFramebuffer( _gl.FRAMEBUFFER, null );
875
1103
 
876
1104
  }
877
1105
 
1106
+
878
1107
  // Setup storage for internal depth/stencil buffers and bind to correct framebuffer
879
1108
  function setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {
880
1109
 
@@ -884,7 +1113,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
884
1113
 
885
1114
  let glInternalFormat = _gl.DEPTH_COMPONENT16;
886
1115
 
887
- if ( isMultisample ) {
1116
+ if ( isMultisample || renderTarget.useRenderToTexture ) {
888
1117
 
889
1118
  const depthTexture = renderTarget.depthTexture;
890
1119
 
@@ -904,7 +1133,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
904
1133
 
905
1134
  const samples = getRenderTargetSamples( renderTarget );
906
1135
 
907
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1136
+ if ( renderTarget.useRenderToTexture ) {
1137
+
1138
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1139
+
1140
+ } else {
1141
+
1142
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1143
+
1144
+ }
908
1145
 
909
1146
  } else {
910
1147
 
@@ -916,12 +1153,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
916
1153
 
917
1154
  } else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {
918
1155
 
919
- if ( isMultisample ) {
1156
+ const samples = getRenderTargetSamples( renderTarget );
920
1157
 
921
- const samples = getRenderTargetSamples( renderTarget );
1158
+ if ( isMultisample && renderTarget.useRenderbuffer ) {
922
1159
 
923
1160
  _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
924
1161
 
1162
+ } else if ( renderTarget.useRenderToTexture ) {
1163
+
1164
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
1165
+
925
1166
  } else {
926
1167
 
927
1168
  _gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );
@@ -939,13 +1180,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
939
1180
  const glFormat = utils.convert( texture.format );
940
1181
  const glType = utils.convert( texture.type );
941
1182
  const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1183
+ const samples = getRenderTargetSamples( renderTarget );
942
1184
 
943
- if ( isMultisample ) {
944
-
945
- const samples = getRenderTargetSamples( renderTarget );
1185
+ if ( isMultisample && renderTarget.useRenderbuffer ) {
946
1186
 
947
1187
  _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
948
1188
 
1189
+ } else if ( renderTarget.useRenderToTexture ) {
1190
+
1191
+ MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1192
+
949
1193
  } else {
950
1194
 
951
1195
  _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
@@ -986,14 +1230,31 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
986
1230
  setTexture2D( renderTarget.depthTexture, 0 );
987
1231
 
988
1232
  const webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;
1233
+ const samples = getRenderTargetSamples( renderTarget );
989
1234
 
990
1235
  if ( renderTarget.depthTexture.format === DepthFormat ) {
991
1236
 
992
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1237
+ if ( renderTarget.useRenderToTexture ) {
1238
+
1239
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1240
+
1241
+ } else {
1242
+
1243
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1244
+
1245
+ }
993
1246
 
994
1247
  } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
995
1248
 
996
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1249
+ if ( renderTarget.useRenderToTexture ) {
1250
+
1251
+ MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1252
+
1253
+ } else {
1254
+
1255
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );
1256
+
1257
+ }
997
1258
 
998
1259
  } else {
999
1260
 
@@ -1007,10 +1268,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1007
1268
  function setupDepthRenderbuffer( renderTarget ) {
1008
1269
 
1009
1270
  const renderTargetProperties = properties.get( renderTarget );
1010
-
1011
1271
  const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
1012
1272
 
1013
- if ( renderTarget.depthTexture ) {
1273
+ if ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {
1014
1274
 
1015
1275
  if ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );
1016
1276
 
@@ -1044,6 +1304,25 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1044
1304
 
1045
1305
  }
1046
1306
 
1307
+ // rebind framebuffer with external textures
1308
+ function rebindTextures( renderTarget, colorTexture, depthTexture ) {
1309
+
1310
+ const renderTargetProperties = properties.get( renderTarget );
1311
+
1312
+ if ( colorTexture !== undefined ) {
1313
+
1314
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
1315
+
1316
+ }
1317
+
1318
+ if ( depthTexture !== undefined ) {
1319
+
1320
+ setupDepthRenderbuffer( renderTarget );
1321
+
1322
+ }
1323
+
1324
+ }
1325
+
1047
1326
  // Set up GL resources for the render target
1048
1327
  function setupRenderTarget( renderTarget ) {
1049
1328
 
@@ -1056,7 +1335,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1056
1335
 
1057
1336
  if ( renderTarget.isWebGLMultipleRenderTargets !== true ) {
1058
1337
 
1059
- textureProperties.__webglTexture = _gl.createTexture();
1338
+ if ( textureProperties.__webglTexture === undefined ) {
1339
+
1340
+ textureProperties.__webglTexture = _gl.createTexture();
1341
+
1342
+ }
1343
+
1060
1344
  textureProperties.__version = texture.version;
1061
1345
  info.memory.textures ++;
1062
1346
 
@@ -1064,7 +1348,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1064
1348
 
1065
1349
  const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
1066
1350
  const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
1067
- const isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true );
1068
1351
  const isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;
1069
1352
  const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
1070
1353
 
@@ -1120,7 +1403,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1120
1403
 
1121
1404
  }
1122
1405
 
1123
- } else if ( isMultisample ) {
1406
+ } else if ( renderTarget.useRenderbuffer ) {
1124
1407
 
1125
1408
  if ( isWebGL2 ) {
1126
1409
 
@@ -1174,7 +1457,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1174
1457
 
1175
1458
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1176
1459
 
1177
- generateMipmap( _gl.TEXTURE_CUBE_MAP, texture, renderTarget.width, renderTarget.height );
1460
+ generateMipmap( _gl.TEXTURE_CUBE_MAP );
1178
1461
 
1179
1462
  }
1180
1463
 
@@ -1195,7 +1478,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1195
1478
 
1196
1479
  if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {
1197
1480
 
1198
- generateMipmap( _gl.TEXTURE_2D, attachment, renderTarget.width, renderTarget.height );
1481
+ generateMipmap( _gl.TEXTURE_2D );
1199
1482
 
1200
1483
  }
1201
1484
 
@@ -1230,7 +1513,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1230
1513
 
1231
1514
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1232
1515
 
1233
- generateMipmap( glTextureType, texture, renderTarget.width, renderTarget.height, renderTarget.depth );
1516
+ generateMipmap( glTextureType );
1234
1517
 
1235
1518
  }
1236
1519
 
@@ -1264,7 +1547,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1264
1547
  const webglTexture = properties.get( texture ).__webglTexture;
1265
1548
 
1266
1549
  state.bindTexture( target, webglTexture );
1267
- generateMipmap( target, texture, renderTarget.width, renderTarget.height );
1550
+ generateMipmap( target );
1268
1551
  state.unbindTexture();
1269
1552
 
1270
1553
  }
@@ -1275,23 +1558,43 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1275
1558
 
1276
1559
  function updateMultisampleRenderTarget( renderTarget ) {
1277
1560
 
1278
- if ( renderTarget.isWebGLMultisampleRenderTarget ) {
1561
+ if ( renderTarget.useRenderbuffer ) {
1279
1562
 
1280
1563
  if ( isWebGL2 ) {
1281
1564
 
1282
1565
  const width = renderTarget.width;
1283
1566
  const height = renderTarget.height;
1284
1567
  let mask = _gl.COLOR_BUFFER_BIT;
1568
+ const invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];
1569
+ const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
1570
+
1571
+ if ( renderTarget.depthBuffer ) {
1572
+
1573
+ invalidationArray.push( depthStyle );
1574
+
1575
+ }
1285
1576
 
1286
- if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
1287
- if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
1577
+ if ( ! renderTarget.ignoreDepthForMultisampleCopy ) {
1578
+
1579
+ if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
1580
+ if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
1581
+
1582
+ }
1288
1583
 
1289
1584
  const renderTargetProperties = properties.get( renderTarget );
1290
1585
 
1291
1586
  state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1292
1587
  state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
1293
1588
 
1589
+ if ( renderTarget.ignoreDepthForMultisampleCopy ) {
1590
+
1591
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
1592
+ _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
1593
+
1594
+ }
1595
+
1294
1596
  _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
1597
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
1295
1598
 
1296
1599
  state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
1297
1600
  state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
@@ -1308,7 +1611,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1308
1611
 
1309
1612
  function getRenderTargetSamples( renderTarget ) {
1310
1613
 
1311
- return ( isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget ) ?
1614
+ return ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?
1312
1615
  Math.min( maxSamples, renderTarget.samples ) : 0;
1313
1616
 
1314
1617
  }
@@ -1381,9 +1684,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1381
1684
  this.setTexture2DArray = setTexture2DArray;
1382
1685
  this.setTexture3D = setTexture3D;
1383
1686
  this.setTextureCube = setTextureCube;
1687
+ this.rebindTextures = rebindTextures;
1384
1688
  this.setupRenderTarget = setupRenderTarget;
1385
1689
  this.updateRenderTargetMipmap = updateRenderTargetMipmap;
1386
1690
  this.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
1691
+ this.setupDepthRenderbuffer = setupDepthRenderbuffer;
1692
+ this.setupFrameBufferTexture = setupFrameBufferTexture;
1387
1693
 
1388
1694
  this.safeSetTexture2D = safeSetTexture2D;
1389
1695
  this.safeSetTextureCube = safeSetTextureCube;