super-three 0.137.0 → 0.141.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 (703) hide show
  1. package/README.md +23 -25
  2. package/build/three.cjs +3721 -4964
  3. package/build/three.js +3723 -4966
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +5705 -7216
  6. package/examples/js/animation/CCDIKSolver.js +3 -2
  7. package/examples/js/animation/MMDPhysics.js +2 -2
  8. package/examples/js/controls/ArcballControls.js +3 -1
  9. package/examples/js/controls/PointerLockControls.js +3 -2
  10. package/examples/js/controls/TrackballControls.js +1 -4
  11. package/examples/js/controls/TransformControls.js +5 -6
  12. package/examples/js/controls/experimental/CameraControls.js +2 -2
  13. package/examples/js/csm/CSMFrustum.js +1 -1
  14. package/examples/js/csm/CSMShader.js +51 -35
  15. package/examples/js/curves/CurveExtras.js +14 -18
  16. package/examples/js/effects/AnaglyphEffect.js +7 -4
  17. package/examples/js/effects/AsciiEffect.js +10 -29
  18. package/examples/js/exporters/ColladaExporter.js +29 -7
  19. package/examples/js/exporters/EXRExporter.js +458 -0
  20. package/examples/js/exporters/GLTFExporter.js +213 -128
  21. package/examples/js/exporters/OBJExporter.js +12 -18
  22. package/examples/js/exporters/PLYExporter.js +15 -20
  23. package/examples/js/exporters/USDZExporter.js +13 -0
  24. package/examples/js/geometries/DecalGeometry.js +0 -7
  25. package/examples/js/geometries/LightningStrike.js +2 -2
  26. package/examples/js/geometries/ParametricGeometries.js +3 -3
  27. package/examples/js/helpers/OctreeHelper.js +74 -0
  28. package/examples/js/helpers/VertexNormalsHelper.js +4 -23
  29. package/examples/js/helpers/VertexTangentsHelper.js +3 -13
  30. package/examples/js/helpers/ViewHelper.js +266 -0
  31. package/examples/js/interactive/HTMLMesh.js +235 -40
  32. package/examples/js/interactive/SelectionHelper.js +1 -1
  33. package/examples/js/libs/opentype.min.js +1 -118
  34. package/examples/js/lines/Line2.js +1 -2
  35. package/examples/js/lines/LineGeometry.js +10 -21
  36. package/examples/js/lines/LineMaterial.js +2 -3
  37. package/examples/js/lines/LineSegments2.js +214 -140
  38. package/examples/js/lines/LineSegmentsGeometry.js +3 -14
  39. package/examples/js/lines/Wireframe.js +2 -3
  40. package/examples/js/lines/WireframeGeometry2.js +1 -2
  41. package/examples/js/loaders/3MFLoader.js +21 -17
  42. package/examples/js/loaders/AMFLoader.js +1 -1
  43. package/examples/js/loaders/ColladaLoader.js +33 -12
  44. package/examples/js/loaders/DDSLoader.js +23 -30
  45. package/examples/js/loaders/EXRLoader.js +269 -266
  46. package/examples/js/loaders/FBXLoader.js +11 -0
  47. package/examples/js/loaders/FontLoader.js +1 -2
  48. package/examples/js/loaders/GCodeLoader.js +0 -1
  49. package/examples/js/loaders/GLTFLoader.js +249 -60
  50. package/examples/js/loaders/KMZLoader.js +1 -1
  51. package/examples/js/loaders/KTX2Loader.js +1 -9
  52. package/examples/js/loaders/LDrawLoader.js +3 -11
  53. package/examples/js/loaders/LUT3dlLoader.js +1 -1
  54. package/examples/js/loaders/LUTCubeLoader.js +1 -1
  55. package/examples/js/loaders/LWOLoader.js +4 -2
  56. package/examples/js/loaders/LogLuvLoader.js +1 -2
  57. package/examples/js/loaders/MMDLoader.js +18 -4
  58. package/examples/js/loaders/NRRDLoader.js +1 -1
  59. package/examples/js/loaders/OBJLoader.js +9 -5
  60. package/examples/js/loaders/PCDLoader.js +22 -13
  61. package/examples/js/loaders/PDBLoader.js +11 -11
  62. package/examples/js/loaders/PLYLoader.js +5 -1
  63. package/examples/js/loaders/RGBELoader.js +3 -11
  64. package/examples/js/loaders/RGBMLoader.js +12 -15
  65. package/examples/js/loaders/SVGLoader.js +16 -9
  66. package/examples/js/loaders/VOXLoader.js +3 -4
  67. package/examples/js/loaders/VTKLoader.js +260 -295
  68. package/examples/js/loaders/lwo/LWO2Parser.js +4 -4
  69. package/examples/js/loaders/lwo/LWO3Parser.js +4 -4
  70. package/examples/js/math/ConvexHull.js +6 -15
  71. package/examples/js/math/Lut.js +27 -26
  72. package/examples/js/misc/MorphAnimMesh.js +2 -2
  73. package/examples/js/misc/ProgressiveLightMap.js +1 -1
  74. package/examples/js/misc/Volume.js +37 -46
  75. package/examples/js/misc/VolumeSlice.js +21 -21
  76. package/examples/js/modifiers/EdgeSplitModifier.js +0 -7
  77. package/examples/js/modifiers/SimplifyModifier.js +1 -8
  78. package/examples/js/modifiers/TessellateModifier.js +0 -7
  79. package/examples/js/objects/Lensflare.js +2 -2
  80. package/examples/js/objects/LightningStorm.js +4 -5
  81. package/examples/js/objects/MarchingCubes.js +6 -11
  82. package/examples/js/objects/Reflector.js +10 -4
  83. package/examples/js/objects/ReflectorForSSRPass.js +1 -1
  84. package/examples/js/objects/Refractor.js +10 -4
  85. package/examples/js/objects/ShadowMesh.js +1 -2
  86. package/examples/js/objects/Sky.js +1 -1
  87. package/examples/js/objects/Water.js +1 -2
  88. package/examples/js/objects/Water2.js +1 -1
  89. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +6 -10
  90. package/examples/js/postprocessing/AfterimagePass.js +2 -6
  91. package/examples/js/postprocessing/BloomPass.js +50 -19
  92. package/examples/js/postprocessing/DotScreenPass.js +1 -1
  93. package/examples/js/postprocessing/EffectComposer.js +1 -6
  94. package/examples/js/postprocessing/LUTPass.js +2 -2
  95. package/examples/js/postprocessing/OutlinePass.js +7 -12
  96. package/examples/js/postprocessing/SAOPass.js +2 -7
  97. package/examples/js/postprocessing/SSAARenderPass.js +1 -6
  98. package/examples/js/postprocessing/SSRPass.js +3 -8
  99. package/examples/js/postprocessing/TAARenderPass.js +4 -4
  100. package/examples/js/postprocessing/UnrealBloomPass.js +3 -12
  101. package/examples/js/renderers/CSS2DRenderer.js +20 -25
  102. package/examples/js/renderers/CSS3DRenderer.js +6 -7
  103. package/examples/js/renderers/Projector.js +97 -124
  104. package/examples/js/renderers/SVGRenderer.js +3 -4
  105. package/examples/js/shaders/BlendShader.js +2 -1
  106. package/examples/js/shaders/CopyShader.js +4 -3
  107. package/examples/js/shaders/FXAAShader.js +239 -1069
  108. package/examples/js/shaders/FreiChenShader.js +1 -1
  109. package/examples/js/shaders/HorizontalBlurShader.js +1 -1
  110. package/examples/js/shaders/HorizontalTiltShiftShader.js +1 -1
  111. package/examples/js/shaders/SSRShader.js +3 -3
  112. package/examples/js/shaders/ToneMapShader.js +1 -1
  113. package/examples/js/utils/BufferGeometryUtils.js +282 -22
  114. package/examples/js/utils/GPUStatsPanel.js +1 -1
  115. package/examples/js/utils/LDrawUtils.js +6 -6
  116. package/examples/js/utils/SceneUtils.js +59 -0
  117. package/examples/js/utils/SkeletonUtils.js +1 -1
  118. package/examples/js/utils/UVsDebug.js +23 -33
  119. package/examples/jsm/animation/CCDIKSolver.js +3 -9
  120. package/examples/jsm/animation/MMDPhysics.js +1 -1
  121. package/examples/jsm/capabilities/WebGPU.js +6 -0
  122. package/examples/jsm/controls/ArcballControls.js +3 -1
  123. package/examples/jsm/controls/PointerLockControls.js +4 -2
  124. package/examples/jsm/controls/TrackballControls.js +1 -4
  125. package/examples/jsm/controls/TransformControls.js +6 -6
  126. package/examples/jsm/controls/experimental/CameraControls.js +2 -2
  127. package/examples/jsm/csm/CSMFrustum.js +1 -1
  128. package/examples/jsm/csm/CSMShader.js +51 -35
  129. package/examples/jsm/curves/CurveExtras.js +15 -17
  130. package/examples/jsm/effects/AnaglyphEffect.js +4 -4
  131. package/examples/jsm/effects/AsciiEffect.js +9 -22
  132. package/examples/jsm/exporters/ColladaExporter.js +31 -6
  133. package/examples/jsm/exporters/EXRExporter.js +507 -0
  134. package/examples/jsm/exporters/GLTFExporter.js +231 -125
  135. package/examples/jsm/exporters/KTX2Exporter.js +281 -0
  136. package/examples/jsm/exporters/OBJExporter.js +11 -18
  137. package/examples/jsm/exporters/PLYExporter.js +23 -21
  138. package/examples/jsm/exporters/USDZExporter.js +12 -0
  139. package/examples/jsm/geometries/DecalGeometry.js +0 -7
  140. package/examples/jsm/geometries/LightningStrike.js +2 -2
  141. package/examples/jsm/geometries/ParametricGeometries.js +3 -3
  142. package/examples/jsm/helpers/OctreeHelper.js +58 -0
  143. package/examples/jsm/helpers/VertexNormalsHelper.js +4 -25
  144. package/examples/jsm/helpers/VertexTangentsHelper.js +3 -15
  145. package/examples/jsm/helpers/ViewHelper.js +295 -0
  146. package/examples/jsm/interactive/HTMLMesh.js +252 -34
  147. package/examples/jsm/interactive/SelectionHelper.js +1 -1
  148. package/examples/jsm/libs/flow.module.js +30 -27
  149. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  150. package/examples/jsm/libs/mikktspace.module.js +128 -0
  151. package/examples/jsm/libs/opentype.module.js +14568 -0
  152. package/examples/jsm/lines/Line2.js +2 -2
  153. package/examples/jsm/lines/LineGeometry.js +11 -19
  154. package/examples/jsm/lines/LineMaterial.js +3 -3
  155. package/examples/jsm/lines/LineSegments2.js +210 -145
  156. package/examples/jsm/lines/LineSegmentsGeometry.js +3 -12
  157. package/examples/jsm/lines/Wireframe.js +3 -3
  158. package/examples/jsm/lines/WireframeGeometry2.js +2 -2
  159. package/examples/jsm/loaders/3DMLoader.js +3 -2
  160. package/examples/jsm/loaders/3MFLoader.js +21 -17
  161. package/examples/jsm/loaders/AMFLoader.js +1 -1
  162. package/examples/jsm/loaders/ColladaLoader.js +40 -12
  163. package/examples/jsm/loaders/DDSLoader.js +21 -28
  164. package/examples/jsm/loaders/EXRLoader.js +268 -265
  165. package/examples/jsm/loaders/FBXLoader.js +11 -0
  166. package/examples/jsm/loaders/FontLoader.js +2 -2
  167. package/examples/jsm/loaders/GCodeLoader.js +0 -1
  168. package/examples/jsm/loaders/GLTFLoader.js +263 -66
  169. package/examples/jsm/loaders/KMZLoader.js +1 -1
  170. package/examples/jsm/loaders/KTX2Loader.js +1 -10
  171. package/examples/jsm/loaders/LDrawLoader.js +4 -11
  172. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  173. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  174. package/examples/jsm/loaders/LWOLoader.js +5 -3
  175. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  176. package/examples/jsm/loaders/MMDLoader.js +21 -3
  177. package/examples/jsm/loaders/NRRDLoader.js +1 -2
  178. package/examples/jsm/loaders/OBJLoader.js +11 -7
  179. package/examples/jsm/loaders/PCDLoader.js +23 -15
  180. package/examples/jsm/loaders/PDBLoader.js +11 -11
  181. package/examples/jsm/loaders/PLYLoader.js +10 -2
  182. package/examples/jsm/loaders/RGBELoader.js +4 -12
  183. package/examples/jsm/loaders/RGBMLoader.js +14 -11
  184. package/examples/jsm/loaders/SVGLoader.js +17 -9
  185. package/examples/jsm/loaders/TTFLoader.js +1 -1
  186. package/examples/jsm/loaders/VOXLoader.js +5 -5
  187. package/examples/jsm/loaders/VTKLoader.js +256 -284
  188. package/examples/jsm/loaders/ifc/web-ifc-api.js +9 -8
  189. package/examples/jsm/loaders/lwo/LWO2Parser.js +4 -4
  190. package/examples/jsm/loaders/lwo/LWO3Parser.js +4 -4
  191. package/examples/jsm/math/ConvexHull.js +6 -15
  192. package/examples/jsm/math/Lut.js +35 -25
  193. package/examples/jsm/misc/MorphAnimMesh.js +2 -2
  194. package/examples/jsm/misc/ProgressiveLightMap.js +1 -1
  195. package/examples/jsm/misc/Volume.js +37 -44
  196. package/examples/jsm/misc/VolumeSlice.js +21 -21
  197. package/examples/jsm/modifiers/EdgeSplitModifier.js +0 -7
  198. package/examples/jsm/modifiers/SimplifyModifier.js +1 -8
  199. package/examples/jsm/modifiers/TessellateModifier.js +0 -7
  200. package/examples/jsm/node-editor/NodeEditor.js +78 -9
  201. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +14 -0
  202. package/examples/jsm/node-editor/accessors/NormalEditor.js +1 -1
  203. package/examples/jsm/node-editor/accessors/PositionEditor.js +1 -1
  204. package/examples/jsm/node-editor/accessors/UVEditor.js +1 -1
  205. package/examples/jsm/node-editor/core/BaseNode.js +17 -11
  206. package/examples/jsm/node-editor/core/DataFile.js +59 -0
  207. package/examples/jsm/node-editor/core/FileEditor.js +20 -0
  208. package/examples/jsm/node-editor/core/FileURLEditor.js +29 -0
  209. package/examples/jsm/node-editor/display/BlendEditor.js +3 -3
  210. package/examples/jsm/node-editor/display/NormalMapEditor.js +49 -0
  211. package/examples/jsm/node-editor/examples/matcap.json +1 -0
  212. package/examples/jsm/node-editor/inputs/ColorEditor.js +7 -6
  213. package/examples/jsm/node-editor/inputs/FloatEditor.js +2 -2
  214. package/examples/jsm/node-editor/inputs/SliderEditor.js +2 -2
  215. package/examples/jsm/node-editor/inputs/TextureEditor.js +155 -0
  216. package/examples/jsm/node-editor/inputs/Vector2Editor.js +3 -2
  217. package/examples/jsm/node-editor/inputs/Vector3Editor.js +3 -2
  218. package/examples/jsm/node-editor/inputs/Vector4Editor.js +4 -3
  219. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +3 -3
  220. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +16 -11
  221. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +15 -5
  222. package/examples/jsm/node-editor/math/AngleEditor.js +3 -2
  223. package/examples/jsm/node-editor/math/DotEditor.js +2 -2
  224. package/examples/jsm/node-editor/math/InvertEditor.js +4 -4
  225. package/examples/jsm/node-editor/math/LimiterEditor.js +22 -9
  226. package/examples/jsm/node-editor/math/NormalizeEditor.js +3 -2
  227. package/examples/jsm/node-editor/math/OperatorEditor.js +20 -8
  228. package/examples/jsm/node-editor/math/PowerEditor.js +17 -8
  229. package/examples/jsm/node-editor/math/TrigonometryEditor.js +3 -2
  230. package/examples/jsm/node-editor/procedural/CheckerEditor.js +4 -4
  231. package/examples/jsm/node-editor/utils/JoinEditor.js +2 -2
  232. package/examples/jsm/node-editor/utils/OscillatorEditor.js +2 -2
  233. package/examples/jsm/node-editor/utils/PreviewEditor.js +166 -0
  234. package/examples/jsm/node-editor/utils/SplitEditor.js +2 -2
  235. package/examples/jsm/node-editor/utils/TimerEditor.js +1 -1
  236. package/examples/jsm/nodes/Nodes.js +283 -94
  237. package/examples/jsm/nodes/accessors/BufferNode.js +24 -0
  238. package/examples/jsm/nodes/accessors/CameraNode.js +27 -196
  239. package/examples/jsm/nodes/accessors/CubeTextureNode.js +103 -0
  240. package/examples/jsm/nodes/accessors/InstanceNode.js +58 -0
  241. package/examples/jsm/{renderers/nodes → nodes}/accessors/MaterialNode.js +49 -11
  242. package/examples/jsm/{renderers/nodes → nodes}/accessors/MaterialReferenceNode.js +0 -0
  243. package/examples/jsm/{renderers/nodes → nodes}/accessors/ModelNode.js +8 -0
  244. package/examples/jsm/{renderers/nodes → nodes}/accessors/ModelViewProjectionNode.js +0 -0
  245. package/examples/jsm/nodes/accessors/NormalNode.js +39 -99
  246. package/examples/jsm/{renderers/nodes → nodes}/accessors/Object3DNode.js +34 -17
  247. package/examples/jsm/{renderers/nodes → nodes}/accessors/PointUVNode.js +2 -2
  248. package/examples/jsm/nodes/accessors/PositionNode.js +41 -110
  249. package/examples/jsm/nodes/accessors/ReferenceNode.js +65 -0
  250. package/examples/jsm/nodes/accessors/ReflectNode.js +34 -121
  251. package/examples/jsm/nodes/accessors/SkinningNode.js +102 -0
  252. package/examples/jsm/nodes/accessors/StorageBufferNode.js +21 -0
  253. package/examples/jsm/nodes/accessors/TextureNode.js +100 -0
  254. package/examples/jsm/nodes/accessors/UVNode.js +17 -43
  255. package/examples/jsm/nodes/accessors/UserDataNode.js +23 -0
  256. package/examples/jsm/nodes/core/ArrayUniformNode.js +23 -0
  257. package/examples/jsm/nodes/core/AttributeNode.js +33 -30
  258. package/examples/jsm/{renderers/nodes → nodes}/core/BypassNode.js +2 -2
  259. package/examples/jsm/{renderers/nodes → nodes}/core/CodeNode.js +2 -30
  260. package/examples/jsm/nodes/core/ConstNode.js +10 -106
  261. package/examples/jsm/{renderers/nodes → nodes}/core/ContextNode.js +17 -3
  262. package/examples/jsm/nodes/core/ExpressionNode.js +24 -7
  263. package/examples/jsm/nodes/core/FunctionCallNode.js +26 -67
  264. package/examples/jsm/nodes/core/FunctionNode.js +43 -216
  265. package/examples/jsm/nodes/core/InputNode.js +28 -60
  266. package/examples/jsm/nodes/core/InstanceIndexNode.js +21 -0
  267. package/examples/jsm/nodes/core/Node.js +228 -94
  268. package/examples/jsm/{renderers/nodes → nodes}/core/NodeAttribute.js +2 -2
  269. package/examples/jsm/nodes/core/NodeBuilder.js +388 -560
  270. package/examples/jsm/{renderers/nodes → nodes}/core/NodeCode.js +0 -0
  271. package/examples/jsm/nodes/core/NodeFrame.js +30 -23
  272. package/examples/jsm/{renderers/nodes → nodes}/core/NodeFunction.js +0 -0
  273. package/examples/jsm/{renderers/nodes → nodes}/core/NodeFunctionInput.js +0 -0
  274. package/examples/jsm/{renderers/nodes → nodes}/core/NodeKeywords.js +0 -0
  275. package/examples/jsm/{renderers/nodes → nodes}/core/NodeParser.js +0 -0
  276. package/examples/jsm/nodes/core/NodeUniform.js +8 -6
  277. package/examples/jsm/nodes/core/NodeUtils.js +69 -37
  278. package/examples/jsm/{renderers/nodes → nodes}/core/NodeVar.js +2 -2
  279. package/examples/jsm/{renderers/nodes → nodes}/core/NodeVary.js +2 -2
  280. package/examples/jsm/{renderers/nodes → nodes}/core/PropertyNode.js +0 -0
  281. package/examples/jsm/nodes/core/TempNode.js +20 -112
  282. package/examples/jsm/nodes/core/UniformNode.js +46 -0
  283. package/examples/jsm/nodes/core/VarNode.js +58 -27
  284. package/examples/jsm/{renderers/nodes → nodes}/core/VaryNode.js +0 -0
  285. package/examples/jsm/{renderers/nodes → nodes}/core/constants.js +0 -0
  286. package/examples/jsm/{renderers/nodes → nodes}/display/ColorSpaceNode.js +10 -11
  287. package/examples/jsm/nodes/display/FrontFacingNode.js +21 -0
  288. package/examples/jsm/nodes/display/NormalMapNode.js +86 -0
  289. package/examples/jsm/nodes/display/ToneMappingNode.js +51 -0
  290. package/examples/jsm/nodes/fog/FogNode.js +31 -0
  291. package/examples/jsm/nodes/fog/FogRangeNode.js +27 -0
  292. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +33 -0
  293. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +9 -0
  294. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +27 -0
  295. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +18 -0
  296. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +18 -0
  297. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +18 -0
  298. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +94 -0
  299. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +22 -0
  300. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +12 -0
  301. package/examples/jsm/nodes/functions/material/getRoughness.js +18 -0
  302. package/examples/jsm/nodes/gpgpu/ComputeNode.js +63 -0
  303. package/examples/jsm/nodes/lighting/AONode.js +25 -0
  304. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +37 -0
  305. package/examples/jsm/nodes/lighting/EnvironmentNode.js +65 -0
  306. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +50 -0
  307. package/examples/jsm/nodes/lighting/LightingContextNode.js +75 -0
  308. package/examples/jsm/nodes/lighting/LightingNode.js +19 -0
  309. package/examples/jsm/nodes/lighting/LightsNode.js +120 -0
  310. package/examples/jsm/nodes/lighting/PunctualLightNode.js +68 -0
  311. package/examples/jsm/nodes/loaders/NodeLoader.js +107 -0
  312. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +42 -0
  313. package/examples/jsm/nodes/loaders/NodeObjectLoader.js +70 -0
  314. package/examples/jsm/{renderers/nodes → nodes}/materials/LineBasicNodeMaterial.js +11 -4
  315. package/examples/jsm/nodes/materials/Materials.js +65 -0
  316. package/examples/jsm/{renderers/nodes → nodes}/materials/MeshBasicNodeMaterial.js +13 -4
  317. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +162 -22
  318. package/examples/jsm/nodes/materials/NodeMaterial.js +128 -113
  319. package/examples/jsm/{renderers/nodes → nodes}/materials/PointsNodeMaterial.js +13 -4
  320. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +84 -16
  321. package/examples/jsm/nodes/math/CondNode.js +26 -95
  322. package/examples/jsm/nodes/math/MathNode.js +164 -187
  323. package/examples/jsm/nodes/math/OperatorNode.js +161 -41
  324. package/examples/jsm/{renderers/nodes → nodes}/parsers/GLSLNodeFunction.js +2 -2
  325. package/examples/jsm/{renderers/nodes → nodes}/parsers/GLSLNodeParser.js +0 -0
  326. package/examples/jsm/{renderers/nodes → nodes}/parsers/WGSLNodeFunction.js +20 -5
  327. package/examples/jsm/{renderers/nodes → nodes}/parsers/WGSLNodeParser.js +0 -0
  328. package/examples/jsm/nodes/procedural/CheckerNode.js +16 -57
  329. package/examples/jsm/nodes/shadernode/ShaderNode.js +262 -0
  330. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +274 -0
  331. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +106 -0
  332. package/examples/jsm/{renderers/nodes → nodes}/utils/ArrayElementNode.js +3 -3
  333. package/examples/jsm/{renderers/nodes → nodes}/utils/ConvertNode.js +11 -3
  334. package/examples/jsm/nodes/utils/JoinNode.js +17 -89
  335. package/examples/jsm/nodes/utils/MatcapUVNode.js +25 -0
  336. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +32 -0
  337. package/examples/jsm/{renderers/nodes → nodes}/utils/OscNode.js +18 -2
  338. package/examples/jsm/{renderers/nodes → nodes}/utils/SplitNode.js +16 -0
  339. package/examples/jsm/{renderers/nodes → nodes}/utils/SpriteSheetUVNode.js +3 -3
  340. package/examples/jsm/nodes/utils/TimerNode.js +30 -65
  341. package/examples/jsm/objects/Lensflare.js +2 -2
  342. package/examples/jsm/objects/LightningStorm.js +4 -4
  343. package/examples/jsm/objects/MarchingCubes.js +5 -9
  344. package/examples/jsm/objects/Reflector.js +8 -4
  345. package/examples/jsm/objects/ReflectorForSSRPass.js +2 -2
  346. package/examples/jsm/objects/Refractor.js +8 -4
  347. package/examples/jsm/objects/ShadowMesh.js +2 -2
  348. package/examples/jsm/objects/Sky.js +2 -2
  349. package/examples/jsm/objects/Water.js +2 -2
  350. package/examples/jsm/objects/Water2.js +2 -2
  351. package/examples/jsm/offscreen/jank.js +5 -5
  352. package/examples/jsm/offscreen/offscreen.js +1 -1
  353. package/examples/jsm/offscreen/scene.js +11 -11
  354. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +5 -7
  355. package/examples/jsm/postprocessing/AfterimagePass.js +0 -10
  356. package/examples/jsm/postprocessing/BloomPass.js +48 -20
  357. package/examples/jsm/postprocessing/DotScreenPass.js +1 -1
  358. package/examples/jsm/postprocessing/EffectComposer.js +1 -9
  359. package/examples/jsm/postprocessing/LUTPass.js +2 -2
  360. package/examples/jsm/postprocessing/OutlinePass.js +7 -11
  361. package/examples/jsm/postprocessing/SAOPass.js +2 -9
  362. package/examples/jsm/postprocessing/SSAARenderPass.js +1 -4
  363. package/examples/jsm/postprocessing/SSRPass.js +3 -9
  364. package/examples/jsm/postprocessing/TAARenderPass.js +4 -4
  365. package/examples/jsm/postprocessing/UnrealBloomPass.js +3 -8
  366. package/examples/jsm/renderers/CSS2DRenderer.js +21 -24
  367. package/examples/jsm/renderers/CSS3DRenderer.js +7 -8
  368. package/examples/jsm/renderers/Projector.js +101 -128
  369. package/examples/jsm/renderers/SVGRenderer.js +4 -4
  370. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +1 -1
  371. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +127 -23
  372. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +14 -3
  373. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +5 -5
  374. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +4 -4
  375. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +16 -10
  376. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +8 -7
  377. package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +43 -0
  378. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +14 -7
  379. package/examples/jsm/renderers/webgpu/WebGPUInfo.js +1 -1
  380. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +0 -6
  381. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +20 -20
  382. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +2 -1
  383. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +66 -0
  384. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -24
  385. package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +14 -14
  386. package/examples/jsm/renderers/webgpu/WebGPUSampler.js +2 -2
  387. package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +5 -8
  388. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +23 -20
  389. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +37 -18
  390. package/examples/jsm/renderers/webgpu/WebGPUUniform.js +14 -14
  391. package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +5 -32
  392. package/examples/jsm/renderers/webgpu/WebGPUUniformsGroup.js +2 -2
  393. package/examples/jsm/renderers/webgpu/constants.js +3 -2
  394. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +276 -284
  395. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeSampledTexture.js +20 -2
  396. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +24 -14
  397. package/examples/jsm/shaders/BlendShader.js +2 -1
  398. package/examples/jsm/shaders/CopyShader.js +4 -3
  399. package/examples/jsm/shaders/FXAAShader.js +219 -1051
  400. package/examples/jsm/shaders/FreiChenShader.js +1 -1
  401. package/examples/jsm/shaders/HorizontalBlurShader.js +1 -1
  402. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +1 -1
  403. package/examples/jsm/shaders/SSRShader.js +3 -3
  404. package/examples/jsm/shaders/ToneMapShader.js +1 -1
  405. package/examples/jsm/utils/BufferGeometryUtils.js +292 -22
  406. package/examples/jsm/utils/GPUStatsPanel.js +1 -1
  407. package/examples/jsm/utils/LDrawUtils.js +6 -6
  408. package/examples/jsm/utils/SceneUtils.js +76 -2
  409. package/examples/jsm/utils/SkeletonUtils.js +1 -1
  410. package/examples/jsm/utils/UVsDebug.js +23 -32
  411. package/examples/jsm/webxr/ARButton.js +14 -4
  412. package/examples/jsm/webxr/OculusHandPointerModel.js +3 -3
  413. package/examples/jsm/webxr/Text2D.js +1 -1
  414. package/examples/jsm/webxr/VRButton.js +15 -1
  415. package/examples/jsm/webxr/XRHandMeshModel.js +3 -7
  416. package/examples/jsm/webxr/XRHandModelFactory.js +3 -0
  417. package/package.json +37 -19
  418. package/src/Three.Legacy.js +41 -1912
  419. package/src/Three.js +6 -3
  420. package/src/animation/AnimationClip.js +1 -1
  421. package/src/animation/AnimationMixer.js +5 -3
  422. package/src/animation/AnimationObjectGroup.js +2 -2
  423. package/src/animation/PropertyBinding.js +8 -18
  424. package/src/audio/PositionalAudio.js +8 -0
  425. package/src/cameras/ArrayCamera.js +2 -3
  426. package/src/cameras/Camera.js +2 -2
  427. package/src/cameras/CubeCamera.js +6 -1
  428. package/src/cameras/OrthographicCamera.js +2 -2
  429. package/src/cameras/PerspectiveCamera.js +2 -2
  430. package/src/constants.js +7 -2
  431. package/src/core/BufferAttribute.js +7 -12
  432. package/src/core/BufferGeometry.js +4 -4
  433. package/src/core/GLBufferAttribute.js +2 -2
  434. package/src/core/InstancedBufferAttribute.js +2 -2
  435. package/src/core/InstancedBufferGeometry.js +2 -2
  436. package/src/core/InstancedInterleavedBuffer.js +2 -2
  437. package/src/core/InterleavedBuffer.js +2 -2
  438. package/src/core/InterleavedBufferAttribute.js +5 -11
  439. package/src/core/Object3D.js +6 -3
  440. package/src/core/Raycaster.js +2 -2
  441. package/src/extras/DataUtils.js +127 -40
  442. package/src/extras/Earcut.js +2 -2
  443. package/src/extras/PMREMGenerator.js +132 -104
  444. package/src/extras/core/CurvePath.js +3 -3
  445. package/src/extras/core/ShapePath.js +5 -6
  446. package/src/extras/curves/ArcCurve.js +2 -2
  447. package/src/extras/curves/CatmullRomCurve3.js +2 -2
  448. package/src/extras/curves/CubicBezierCurve.js +2 -2
  449. package/src/extras/curves/CubicBezierCurve3.js +2 -2
  450. package/src/extras/curves/EllipseCurve.js +2 -2
  451. package/src/extras/curves/LineCurve.js +2 -2
  452. package/src/extras/curves/LineCurve3.js +2 -1
  453. package/src/extras/curves/QuadraticBezierCurve.js +2 -2
  454. package/src/extras/curves/QuadraticBezierCurve3.js +2 -2
  455. package/src/extras/curves/SplineCurve.js +2 -2
  456. package/src/geometries/CapsuleGeometry.js +33 -0
  457. package/src/geometries/ExtrudeGeometry.js +2 -0
  458. package/src/geometries/Geometries.js +1 -0
  459. package/src/geometries/TorusKnotGeometry.js +2 -2
  460. package/src/geometries/WireframeGeometry.js +3 -2
  461. package/src/helpers/BoxHelper.js +2 -2
  462. package/src/helpers/PointLightHelper.js +1 -1
  463. package/src/helpers/SkeletonHelper.js +3 -2
  464. package/src/lights/AmbientLight.js +2 -2
  465. package/src/lights/AmbientLightProbe.js +2 -2
  466. package/src/lights/DirectionalLight.js +2 -2
  467. package/src/lights/DirectionalLightShadow.js +2 -2
  468. package/src/lights/HemisphereLight.js +4 -4
  469. package/src/lights/HemisphereLightProbe.js +2 -2
  470. package/src/lights/Light.js +4 -4
  471. package/src/lights/LightProbe.js +2 -2
  472. package/src/lights/PointLight.js +4 -4
  473. package/src/lights/PointLightShadow.js +2 -2
  474. package/src/lights/RectAreaLight.js +2 -2
  475. package/src/lights/SpotLight.js +4 -4
  476. package/src/lights/SpotLightShadow.js +2 -2
  477. package/src/loaders/FileLoader.js +3 -1
  478. package/src/loaders/ImageBitmapLoader.js +2 -2
  479. package/src/loaders/ImageLoader.js +1 -1
  480. package/src/loaders/LoaderUtils.js +1 -1
  481. package/src/loaders/MaterialLoader.js +8 -3
  482. package/src/loaders/ObjectLoader.js +23 -25
  483. package/src/materials/LineBasicMaterial.js +6 -13
  484. package/src/materials/LineDashedMaterial.js +2 -15
  485. package/src/materials/Material.js +48 -14
  486. package/src/materials/Materials.js +66 -18
  487. package/src/materials/MeshBasicMaterial.js +6 -31
  488. package/src/materials/MeshDepthMaterial.js +2 -22
  489. package/src/materials/MeshDistanceMaterial.js +2 -22
  490. package/src/materials/MeshLambertMaterial.js +6 -34
  491. package/src/materials/MeshMatcapMaterial.js +6 -28
  492. package/src/materials/MeshNormalMaterial.js +2 -26
  493. package/src/materials/MeshPhongMaterial.js +6 -48
  494. package/src/materials/MeshPhysicalMaterial.js +32 -35
  495. package/src/materials/MeshStandardMaterial.js +6 -54
  496. package/src/materials/MeshToonMaterial.js +6 -38
  497. package/src/materials/PointsMaterial.js +6 -15
  498. package/src/materials/RawShaderMaterial.js +2 -2
  499. package/src/materials/ShaderMaterial.js +3 -17
  500. package/src/materials/ShadowMaterial.js +6 -8
  501. package/src/materials/SpriteMaterial.js +6 -12
  502. package/src/math/Box2.js +2 -2
  503. package/src/math/Box3.js +5 -5
  504. package/src/math/Color.js +84 -35
  505. package/src/math/ColorManagement.js +74 -0
  506. package/src/math/Euler.js +16 -14
  507. package/src/math/Interpolant.js +4 -9
  508. package/src/math/MathUtils.js +76 -7
  509. package/src/math/Matrix3.js +2 -2
  510. package/src/math/Matrix4.js +2 -3
  511. package/src/math/Plane.js +2 -2
  512. package/src/math/Quaternion.js +11 -2
  513. package/src/math/Spherical.js +1 -1
  514. package/src/math/SphericalHarmonics3.js +2 -2
  515. package/src/math/Vector2.js +2 -2
  516. package/src/math/Vector3.js +12 -3
  517. package/src/math/Vector4.js +2 -2
  518. package/src/math/interpolants/DiscreteInterpolant.js +1 -1
  519. package/src/objects/Bone.js +2 -2
  520. package/src/objects/Group.js +2 -2
  521. package/src/objects/InstancedMesh.js +4 -4
  522. package/src/objects/Line.js +76 -107
  523. package/src/objects/LineLoop.js +2 -2
  524. package/src/objects/LineSegments.js +15 -23
  525. package/src/objects/Mesh.js +82 -104
  526. package/src/objects/Points.js +32 -54
  527. package/src/objects/SkinnedMesh.js +5 -8
  528. package/src/objects/Sprite.js +4 -4
  529. package/src/renderers/WebGL3DRenderTarget.js +22 -0
  530. package/src/renderers/WebGLArrayRenderTarget.js +22 -0
  531. package/src/renderers/WebGLCubeRenderTarget.js +7 -14
  532. package/src/renderers/WebGLMultipleRenderTargets.js +8 -5
  533. package/src/renderers/WebGLRenderTarget.js +16 -18
  534. package/src/renderers/WebGLRenderer.js +108 -63
  535. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +46 -0
  536. package/src/renderers/shaders/ShaderChunk/common.glsl.js +1 -0
  537. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +12 -13
  538. package/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js +1 -1
  539. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +3 -19
  540. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +107 -0
  541. package/src/renderers/shaders/ShaderChunk/iridescence_pars_fragment.glsl.js +14 -0
  542. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +0 -6
  543. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +25 -0
  544. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +0 -6
  545. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +23 -0
  546. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +43 -5
  547. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +24 -0
  548. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +1 -1
  549. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +7 -7
  550. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +1 -9
  551. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +16 -31
  552. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +1 -1
  553. package/src/renderers/shaders/ShaderChunk.js +6 -0
  554. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  555. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
  556. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +3 -2
  557. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
  558. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -0
  559. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +6 -0
  560. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
  561. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +10 -0
  562. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
  563. package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
  564. package/src/renderers/shaders/ShaderLib.js +6 -0
  565. package/src/renderers/shaders/UniformsLib.js +2 -2
  566. package/src/renderers/webgl/WebGLAttributes.js +6 -6
  567. package/src/renderers/webgl/WebGLBackground.js +3 -0
  568. package/src/renderers/webgl/WebGLBindingStates.js +57 -29
  569. package/src/renderers/webgl/WebGLLights.js +0 -1
  570. package/src/renderers/webgl/WebGLMaterials.js +72 -187
  571. package/src/renderers/webgl/WebGLMorphtargets.js +47 -23
  572. package/src/renderers/webgl/WebGLProgram.js +57 -19
  573. package/src/renderers/webgl/WebGLPrograms.js +75 -86
  574. package/src/renderers/webgl/WebGLShaderCache.js +4 -3
  575. package/src/renderers/webgl/WebGLShadowMap.js +6 -8
  576. package/src/renderers/webgl/WebGLTextures.js +567 -380
  577. package/src/renderers/webgl/WebGLUniforms.js +79 -80
  578. package/src/renderers/webgl/WebGLUtils.js +12 -1
  579. package/src/renderers/webxr/WebXRManager.js +60 -45
  580. package/src/scenes/Fog.js +2 -2
  581. package/src/scenes/FogExp2.js +2 -2
  582. package/src/scenes/Scene.js +2 -2
  583. package/src/textures/CanvasTexture.js +2 -2
  584. package/src/textures/CompressedTexture.js +2 -2
  585. package/src/textures/CubeTexture.js +2 -2
  586. package/src/textures/{DataTexture3D.js → Data3DTexture.js} +4 -4
  587. package/src/textures/{DataTexture2DArray.js → DataArrayTexture.js} +4 -4
  588. package/src/textures/DataTexture.js +2 -5
  589. package/src/textures/DepthTexture.js +5 -5
  590. package/src/textures/FramebufferTexture.js +2 -2
  591. package/src/textures/Source.js +123 -0
  592. package/src/textures/Texture.js +27 -97
  593. package/src/textures/VideoTexture.js +2 -2
  594. package/examples/js/csm/Frustum.js +0 -133
  595. package/examples/js/deprecated/Geometry.js +0 -1656
  596. package/examples/js/loaders/VRMLoader.js +0 -72
  597. package/examples/js/objects/ReflectorRTT.js +0 -16
  598. package/examples/js/postprocessing/SSRrPass.js +0 -494
  599. package/examples/js/shaders/SSRrShader.js +0 -336
  600. package/examples/jsm/deprecated/Geometry.js +0 -1869
  601. package/examples/jsm/libs/opentype.module.min.js +0 -119
  602. package/examples/jsm/loaders/NodeMaterialLoader.js +0 -263
  603. package/examples/jsm/loaders/VRMLoader.js +0 -78
  604. package/examples/jsm/nodes/accessors/ColorsNode.js +0 -56
  605. package/examples/jsm/nodes/accessors/LightNode.js +0 -60
  606. package/examples/jsm/nodes/accessors/ResolutionNode.js +0 -64
  607. package/examples/jsm/nodes/accessors/ScreenUVNode.js +0 -64
  608. package/examples/jsm/nodes/core/NodeLib.js +0 -64
  609. package/examples/jsm/nodes/core/StructNode.js +0 -106
  610. package/examples/jsm/nodes/effects/BlurNode.js +0 -171
  611. package/examples/jsm/nodes/effects/ColorAdjustmentNode.js +0 -140
  612. package/examples/jsm/nodes/effects/LuminanceNode.js +0 -75
  613. package/examples/jsm/nodes/inputs/BoolNode.js +0 -51
  614. package/examples/jsm/nodes/inputs/ColorNode.js +0 -58
  615. package/examples/jsm/nodes/inputs/CubeTextureNode.js +0 -108
  616. package/examples/jsm/nodes/inputs/FloatNode.js +0 -51
  617. package/examples/jsm/nodes/inputs/IntNode.js +0 -51
  618. package/examples/jsm/nodes/inputs/Matrix3Node.js +0 -63
  619. package/examples/jsm/nodes/inputs/Matrix4Node.js +0 -63
  620. package/examples/jsm/nodes/inputs/PropertyNode.js +0 -47
  621. package/examples/jsm/nodes/inputs/RTTNode.js +0 -157
  622. package/examples/jsm/nodes/inputs/ReflectorNode.js +0 -90
  623. package/examples/jsm/nodes/inputs/ScreenNode.js +0 -28
  624. package/examples/jsm/nodes/inputs/TextureNode.js +0 -116
  625. package/examples/jsm/nodes/inputs/Vector2Node.js +0 -57
  626. package/examples/jsm/nodes/inputs/Vector3Node.js +0 -58
  627. package/examples/jsm/nodes/inputs/Vector4Node.js +0 -59
  628. package/examples/jsm/nodes/materials/BasicNodeMaterial.js +0 -26
  629. package/examples/jsm/nodes/materials/PhongNodeMaterial.js +0 -36
  630. package/examples/jsm/nodes/materials/StandardNodeMaterial.js +0 -40
  631. package/examples/jsm/nodes/materials/nodes/BasicNode.js +0 -154
  632. package/examples/jsm/nodes/materials/nodes/MeshStandardNode.js +0 -116
  633. package/examples/jsm/nodes/materials/nodes/PhongNode.js +0 -409
  634. package/examples/jsm/nodes/materials/nodes/RawNode.js +0 -62
  635. package/examples/jsm/nodes/materials/nodes/SpriteNode.js +0 -236
  636. package/examples/jsm/nodes/materials/nodes/StandardNode.js +0 -609
  637. package/examples/jsm/nodes/misc/BumpMapNode.js +0 -163
  638. package/examples/jsm/nodes/misc/NormalMapNode.js +0 -138
  639. package/examples/jsm/nodes/misc/TextureCubeNode.js +0 -86
  640. package/examples/jsm/nodes/misc/TextureCubeUVNode.js +0 -280
  641. package/examples/jsm/nodes/postprocessing/NodePass.js +0 -93
  642. package/examples/jsm/nodes/postprocessing/NodePostProcessing.js +0 -148
  643. package/examples/jsm/nodes/procedural/Fractal3DNode.js +0 -104
  644. package/examples/jsm/nodes/procedural/Noise2DNode.js +0 -149
  645. package/examples/jsm/nodes/procedural/Noise3DNode.js +0 -141
  646. package/examples/jsm/nodes/utils/BypassNode.js +0 -85
  647. package/examples/jsm/nodes/utils/ColorSpaceNode.js +0 -145
  648. package/examples/jsm/nodes/utils/MaxMIPLevelNode.js +0 -56
  649. package/examples/jsm/nodes/utils/RemapNode.js +0 -155
  650. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -101
  651. package/examples/jsm/nodes/utils/SubSlotNode.js +0 -77
  652. package/examples/jsm/nodes/utils/SwitchNode.js +0 -103
  653. package/examples/jsm/nodes/utils/UVTransformNode.js +0 -66
  654. package/examples/jsm/nodes/utils/VelocityNode.js +0 -170
  655. package/examples/jsm/objects/ReflectorRTT.js +0 -15
  656. package/examples/jsm/postprocessing/SSRrPass.js +0 -579
  657. package/examples/jsm/renderers/nodes/Nodes.js +0 -166
  658. package/examples/jsm/renderers/nodes/ShaderNode.js +0 -373
  659. package/examples/jsm/renderers/nodes/accessors/CameraNode.js +0 -68
  660. package/examples/jsm/renderers/nodes/accessors/NormalNode.js +0 -63
  661. package/examples/jsm/renderers/nodes/accessors/PositionNode.js +0 -67
  662. package/examples/jsm/renderers/nodes/accessors/ReferenceNode.js +0 -91
  663. package/examples/jsm/renderers/nodes/accessors/SkinningNode.js +0 -107
  664. package/examples/jsm/renderers/nodes/accessors/UVNode.js +0 -25
  665. package/examples/jsm/renderers/nodes/core/ArrayInputNode.js +0 -23
  666. package/examples/jsm/renderers/nodes/core/AttributeNode.js +0 -54
  667. package/examples/jsm/renderers/nodes/core/ExpressionNode.js +0 -32
  668. package/examples/jsm/renderers/nodes/core/FunctionCallNode.js +0 -67
  669. package/examples/jsm/renderers/nodes/core/FunctionNode.js +0 -87
  670. package/examples/jsm/renderers/nodes/core/InputNode.js +0 -66
  671. package/examples/jsm/renderers/nodes/core/Node.js +0 -104
  672. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +0 -634
  673. package/examples/jsm/renderers/nodes/core/NodeFrame.js +0 -59
  674. package/examples/jsm/renderers/nodes/core/NodeUniform.js +0 -28
  675. package/examples/jsm/renderers/nodes/core/TempNode.js +0 -43
  676. package/examples/jsm/renderers/nodes/core/VarNode.js +0 -51
  677. package/examples/jsm/renderers/nodes/display/NormalMapNode.js +0 -87
  678. package/examples/jsm/renderers/nodes/functions/BSDFs.js +0 -122
  679. package/examples/jsm/renderers/nodes/functions/PhysicalMaterialFunctions.js +0 -27
  680. package/examples/jsm/renderers/nodes/inputs/BufferNode.js +0 -25
  681. package/examples/jsm/renderers/nodes/inputs/ColorNode.js +0 -18
  682. package/examples/jsm/renderers/nodes/inputs/FloatNode.js +0 -17
  683. package/examples/jsm/renderers/nodes/inputs/IntNode.js +0 -17
  684. package/examples/jsm/renderers/nodes/inputs/Matrix3Node.js +0 -18
  685. package/examples/jsm/renderers/nodes/inputs/Matrix4Node.js +0 -18
  686. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +0 -74
  687. package/examples/jsm/renderers/nodes/inputs/Vector2Node.js +0 -18
  688. package/examples/jsm/renderers/nodes/inputs/Vector3Node.js +0 -18
  689. package/examples/jsm/renderers/nodes/inputs/Vector4Node.js +0 -18
  690. package/examples/jsm/renderers/nodes/lights/LightContextNode.js +0 -59
  691. package/examples/jsm/renderers/nodes/lights/LightNode.js +0 -79
  692. package/examples/jsm/renderers/nodes/lights/LightsNode.js +0 -44
  693. package/examples/jsm/renderers/nodes/materials/Materials.js +0 -11
  694. package/examples/jsm/renderers/nodes/materials/MeshStandardNodeMaterial.js +0 -63
  695. package/examples/jsm/renderers/nodes/math/CondNode.js +0 -60
  696. package/examples/jsm/renderers/nodes/math/MathNode.js +0 -242
  697. package/examples/jsm/renderers/nodes/math/OperatorNode.js +0 -174
  698. package/examples/jsm/renderers/nodes/procedural/CheckerNode.js +0 -36
  699. package/examples/jsm/renderers/nodes/utils/JoinNode.js +0 -42
  700. package/examples/jsm/renderers/nodes/utils/TimerNode.js +0 -47
  701. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +0 -20
  702. package/examples/jsm/shaders/SSRrShader.js +0 -307
  703. package/src/renderers/WebGLMultisampleRenderTarget.js +0 -33
@@ -10,12 +10,14 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
10
10
  const maxCubemapSize = capabilities.maxCubemapSize;
11
11
  const maxTextureSize = capabilities.maxTextureSize;
12
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;
13
+ const multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;
14
+ const supportsInvalidateFramebuffer = /OculusBrowser/g.test( navigator.userAgent );
15
15
 
16
16
  const _videoTextures = new WeakMap();
17
17
  let _canvas;
18
18
 
19
+ const _sources = new WeakMap(); // maps WebglTexture objects to instances of Source
20
+
19
21
  // cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,
20
22
  // also OffscreenCanvas.getContext("webgl"), but not OffscreenCanvas.getContext("2d")!
21
23
  // Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).
@@ -25,6 +27,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
25
27
  try {
26
28
 
27
29
  useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'
30
+ // eslint-disable-next-line compat/compat
28
31
  && ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;
29
32
 
30
33
  } catch ( err ) {
@@ -38,6 +41,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
38
41
  // Use OffscreenCanvas when available. Specially needed in web workers
39
42
 
40
43
  return useOffscreenCanvas ?
44
+ // eslint-disable-next-line compat/compat
41
45
  new OffscreenCanvas( width, height ) : createElementNS( 'canvas' );
42
46
 
43
47
  }
@@ -239,8 +243,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
239
243
 
240
244
  }
241
245
 
242
- info.memory.textures --;
243
-
244
246
  }
245
247
 
246
248
  function onRenderTargetDispose( event ) {
@@ -261,12 +263,51 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
261
263
 
262
264
  if ( textureProperties.__webglInit === undefined ) return;
263
265
 
264
- _gl.deleteTexture( textureProperties.__webglTexture );
266
+ // check if it's necessary to remove the WebGLTexture object
267
+
268
+ const source = texture.source;
269
+ const webglTextures = _sources.get( source );
270
+
271
+ if ( webglTextures ) {
272
+
273
+ const webglTexture = webglTextures[ textureProperties.__cacheKey ];
274
+ webglTexture.usedTimes --;
275
+
276
+ // the WebGLTexture object is not used anymore, remove it
277
+
278
+ if ( webglTexture.usedTimes === 0 ) {
279
+
280
+ deleteTexture( texture );
281
+
282
+ }
283
+
284
+ // remove the weak map entry if no WebGLTexture uses the source anymore
285
+
286
+ if ( Object.keys( webglTextures ).length === 0 ) {
287
+
288
+ _sources.delete( source );
289
+
290
+ }
291
+
292
+ }
265
293
 
266
294
  properties.remove( texture );
267
295
 
268
296
  }
269
297
 
298
+ function deleteTexture( texture ) {
299
+
300
+ const textureProperties = properties.get( texture );
301
+ _gl.deleteTexture( textureProperties.__webglTexture );
302
+
303
+ const source = texture.source;
304
+ const webglTextures = _sources.get( source );
305
+ delete webglTextures[ textureProperties.__cacheKey ];
306
+
307
+ info.memory.textures --;
308
+
309
+ }
310
+
270
311
  function deallocateRenderTarget( renderTarget ) {
271
312
 
272
313
  const texture = renderTarget.texture;
@@ -274,8 +315,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
274
315
  const renderTargetProperties = properties.get( renderTarget );
275
316
  const textureProperties = properties.get( texture );
276
317
 
277
- if ( ! renderTarget ) return;
278
-
279
318
  if ( textureProperties.__webglTexture !== undefined ) {
280
319
 
281
320
  _gl.deleteTexture( textureProperties.__webglTexture );
@@ -304,7 +343,17 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
304
343
  _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
305
344
  if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
306
345
  if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );
307
- if ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );
346
+
347
+ if ( renderTargetProperties.__webglColorRenderbuffer ) {
348
+
349
+ for ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {
350
+
351
+ if ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );
352
+
353
+ }
354
+
355
+ }
356
+
308
357
  if ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );
309
358
 
310
359
  }
@@ -360,6 +409,28 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
360
409
 
361
410
  }
362
411
 
412
+ function getTextureCacheKey( texture ) {
413
+
414
+ const array = [];
415
+
416
+ array.push( texture.wrapS );
417
+ array.push( texture.wrapT );
418
+ array.push( texture.magFilter );
419
+ array.push( texture.minFilter );
420
+ array.push( texture.anisotropy );
421
+ array.push( texture.internalFormat );
422
+ array.push( texture.format );
423
+ array.push( texture.type );
424
+ array.push( texture.generateMipmaps );
425
+ array.push( texture.premultiplyAlpha );
426
+ array.push( texture.flipY );
427
+ array.push( texture.unpackAlignment );
428
+ array.push( texture.encoding );
429
+
430
+ return array.join();
431
+
432
+ }
433
+
363
434
  //
364
435
 
365
436
  function setTexture2D( texture, slot ) {
@@ -368,13 +439,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
368
439
 
369
440
  if ( texture.isVideoTexture ) updateVideoTexture( texture );
370
441
 
371
- if ( texture.version > 0 && textureProperties.__version !== texture.version ) {
442
+ if ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {
372
443
 
373
444
  const image = texture.image;
374
445
 
375
- if ( image === undefined ) {
446
+ if ( image === null ) {
376
447
 
377
- console.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );
448
+ console.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );
378
449
 
379
450
  } else if ( image.complete === false ) {
380
451
 
@@ -522,452 +593,545 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
522
593
 
523
594
  function initTexture( textureProperties, texture ) {
524
595
 
596
+ let forceUpload = false;
597
+
525
598
  if ( textureProperties.__webglInit === undefined ) {
526
599
 
527
600
  textureProperties.__webglInit = true;
528
601
 
529
602
  texture.addEventListener( 'dispose', onTextureDispose );
530
603
 
531
- textureProperties.__webglTexture = _gl.createTexture();
604
+ }
532
605
 
533
- info.memory.textures ++;
606
+ // create Source <-> WebGLTextures mapping if necessary
534
607
 
535
- }
608
+ const source = texture.source;
609
+ let webglTextures = _sources.get( source );
536
610
 
537
- }
611
+ if ( webglTextures === undefined ) {
538
612
 
539
- function uploadTexture( textureProperties, texture, slot ) {
613
+ webglTextures = {};
614
+ _sources.set( source, webglTextures );
540
615
 
541
- let textureType = _gl.TEXTURE_2D;
616
+ }
542
617
 
543
- if ( texture.isDataTexture2DArray ) textureType = _gl.TEXTURE_2D_ARRAY;
544
- if ( texture.isDataTexture3D ) textureType = _gl.TEXTURE_3D;
618
+ // check if there is already a WebGLTexture object for the given texture parameters
545
619
 
546
- initTexture( textureProperties, texture );
620
+ const textureCacheKey = getTextureCacheKey( texture );
547
621
 
548
- state.activeTexture( _gl.TEXTURE0 + slot );
549
- state.bindTexture( textureType, textureProperties.__webglTexture );
622
+ if ( textureCacheKey !== textureProperties.__cacheKey ) {
550
623
 
551
- _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
552
- _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
553
- _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
554
- _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );
624
+ // if not, create a new instance of WebGLTexture
555
625
 
556
- const needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;
557
- let image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );
558
- image = verifyColorSpace( texture, image );
626
+ if ( webglTextures[ textureCacheKey ] === undefined ) {
559
627
 
560
- const supportsMips = isPowerOfTwo( image ) || isWebGL2,
561
- glFormat = utils.convert( texture.format, texture.encoding );
628
+ // create new entry
562
629
 
563
- let glType = utils.convert( texture.type ),
564
- glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );
630
+ webglTextures[ textureCacheKey ] = {
631
+ texture: _gl.createTexture(),
632
+ usedTimes: 0
633
+ };
565
634
 
566
- setTextureParameters( textureType, texture, supportsMips );
635
+ info.memory.textures ++;
567
636
 
568
- let mipmap;
569
- const mipmaps = texture.mipmaps;
637
+ // when a new instance of WebGLTexture was created, a texture upload is required
638
+ // even if the image contents are identical
570
639
 
571
- const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
572
- const allocateMemory = ( textureProperties.__version === undefined );
573
- const levels = getMipLevels( texture, image, supportsMips );
640
+ forceUpload = true;
574
641
 
575
- if ( texture.isDepthTexture ) {
642
+ }
576
643
 
577
- // populate depth texture with dummy data
644
+ webglTextures[ textureCacheKey ].usedTimes ++;
578
645
 
579
- glInternalFormat = _gl.DEPTH_COMPONENT;
646
+ // every time the texture cache key changes, it's necessary to check if an instance of
647
+ // WebGLTexture can be deleted in order to avoid a memory leak.
580
648
 
581
- if ( isWebGL2 ) {
649
+ const webglTexture = webglTextures[ textureProperties.__cacheKey ];
582
650
 
583
- if ( texture.type === FloatType ) {
651
+ if ( webglTexture !== undefined ) {
584
652
 
585
- glInternalFormat = _gl.DEPTH_COMPONENT32F;
653
+ webglTextures[ textureProperties.__cacheKey ].usedTimes --;
586
654
 
587
- } else if ( texture.type === UnsignedIntType ) {
655
+ if ( webglTexture.usedTimes === 0 ) {
588
656
 
589
- glInternalFormat = _gl.DEPTH_COMPONENT24;
657
+ deleteTexture( texture );
590
658
 
591
- } else if ( texture.type === UnsignedInt248Type ) {
659
+ }
592
660
 
593
- glInternalFormat = _gl.DEPTH24_STENCIL8;
661
+ }
594
662
 
595
- } else {
663
+ // store references to cache key and WebGLTexture object
596
664
 
597
- glInternalFormat = _gl.DEPTH_COMPONENT16; // WebGL2 requires sized internalformat for glTexImage2D
665
+ textureProperties.__cacheKey = textureCacheKey;
666
+ textureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;
598
667
 
599
- }
668
+ }
600
669
 
601
- } else {
670
+ return forceUpload;
602
671
 
603
- if ( texture.type === FloatType ) {
672
+ }
604
673
 
605
- console.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );
674
+ function uploadTexture( textureProperties, texture, slot ) {
606
675
 
607
- }
676
+ let textureType = _gl.TEXTURE_2D;
608
677
 
609
- }
678
+ if ( texture.isDataArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;
679
+ if ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;
610
680
 
611
- // validation checks for WebGL 1
681
+ const forceUpload = initTexture( textureProperties, texture );
682
+ const source = texture.source;
612
683
 
613
- if ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {
684
+ state.activeTexture( _gl.TEXTURE0 + slot );
685
+ state.bindTexture( textureType, textureProperties.__webglTexture );
614
686
 
615
- // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
616
- // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT
617
- // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
618
- if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {
687
+ if ( source.version !== source.__currentVersion || forceUpload === true ) {
619
688
 
620
- console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );
689
+ _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
690
+ _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
691
+ _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
692
+ _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );
621
693
 
622
- texture.type = UnsignedShortType;
623
- glType = utils.convert( texture.type );
694
+ const needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;
695
+ let image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );
696
+ image = verifyColorSpace( texture, image );
624
697
 
625
- }
698
+ const supportsMips = isPowerOfTwo( image ) || isWebGL2,
699
+ glFormat = utils.convert( texture.format, texture.encoding );
626
700
 
627
- }
701
+ let glType = utils.convert( texture.type ),
702
+ glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );
628
703
 
629
- if ( texture.format === DepthStencilFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {
704
+ setTextureParameters( textureType, texture, supportsMips );
630
705
 
631
- // Depth stencil textures need the DEPTH_STENCIL internal format
632
- // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
633
- glInternalFormat = _gl.DEPTH_STENCIL;
706
+ let mipmap;
707
+ const mipmaps = texture.mipmaps;
634
708
 
635
- // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
636
- // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.
637
- // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
638
- if ( texture.type !== UnsignedInt248Type ) {
709
+ const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
710
+ const allocateMemory = ( source.__currentVersion === undefined ) || ( forceUpload === true );
711
+ const levels = getMipLevels( texture, image, supportsMips );
639
712
 
640
- console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );
713
+ if ( texture.isDepthTexture ) {
641
714
 
642
- texture.type = UnsignedInt248Type;
643
- glType = utils.convert( texture.type );
715
+ // populate depth texture with dummy data
644
716
 
645
- }
717
+ glInternalFormat = _gl.DEPTH_COMPONENT;
646
718
 
647
- }
719
+ if ( isWebGL2 ) {
648
720
 
649
- //
721
+ if ( texture.type === FloatType ) {
650
722
 
651
- if ( useTexStorage && allocateMemory ) {
723
+ glInternalFormat = _gl.DEPTH_COMPONENT32F;
652
724
 
653
- state.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );
725
+ } else if ( texture.type === UnsignedIntType ) {
654
726
 
655
- } else {
727
+ glInternalFormat = _gl.DEPTH_COMPONENT24;
656
728
 
657
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
729
+ } else if ( texture.type === UnsignedInt248Type ) {
658
730
 
659
- }
731
+ glInternalFormat = _gl.DEPTH24_STENCIL8;
660
732
 
661
- } else if ( texture.isDataTexture ) {
733
+ } else {
662
734
 
663
- // use manually created mipmaps if available
664
- // if there are no manual mipmaps
665
- // set 0 level mipmap and then use GL to generate other mipmap levels
735
+ glInternalFormat = _gl.DEPTH_COMPONENT16; // WebGL2 requires sized internalformat for glTexImage2D
666
736
 
667
- if ( mipmaps.length > 0 && supportsMips ) {
737
+ }
668
738
 
669
- if ( useTexStorage && allocateMemory ) {
739
+ } else {
670
740
 
671
- state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
741
+ if ( texture.type === FloatType ) {
672
742
 
673
- }
743
+ console.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );
674
744
 
675
- for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
745
+ }
676
746
 
677
- mipmap = mipmaps[ i ];
747
+ }
678
748
 
679
- if ( useTexStorage ) {
749
+ // validation checks for WebGL 1
680
750
 
681
- state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
751
+ if ( texture.format === DepthFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {
682
752
 
683
- } else {
753
+ // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
754
+ // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT
755
+ // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
756
+ if ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {
757
+
758
+ console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );
684
759
 
685
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
760
+ texture.type = UnsignedIntType;
761
+ glType = utils.convert( texture.type );
686
762
 
687
763
  }
688
764
 
689
765
  }
690
766
 
691
- texture.generateMipmaps = false;
767
+ if ( texture.format === DepthStencilFormat && glInternalFormat === _gl.DEPTH_COMPONENT ) {
692
768
 
693
- } else {
769
+ // Depth stencil textures need the DEPTH_STENCIL internal format
770
+ // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
771
+ glInternalFormat = _gl.DEPTH_STENCIL;
694
772
 
695
- if ( useTexStorage ) {
773
+ // The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
774
+ // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.
775
+ // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
776
+ if ( texture.type !== UnsignedInt248Type ) {
696
777
 
697
- if ( allocateMemory ) {
778
+ console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );
698
779
 
699
- state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
780
+ texture.type = UnsignedInt248Type;
781
+ glType = utils.convert( texture.type );
700
782
 
701
783
  }
702
784
 
703
- state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );
785
+ }
786
+
787
+ //
704
788
 
705
- } else {
789
+ if ( allocateMemory ) {
706
790
 
707
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
791
+ if ( useTexStorage ) {
708
792
 
709
- }
793
+ state.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );
710
794
 
711
- }
795
+ } else {
796
+
797
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
798
+
799
+ }
712
800
 
713
- } else if ( texture.isCompressedTexture ) {
801
+ }
714
802
 
715
- if ( useTexStorage && allocateMemory ) {
803
+ } else if ( texture.isDataTexture ) {
716
804
 
717
- state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
805
+ // use manually created mipmaps if available
806
+ // if there are no manual mipmaps
807
+ // set 0 level mipmap and then use GL to generate other mipmap levels
718
808
 
719
- }
809
+ if ( mipmaps.length > 0 && supportsMips ) {
720
810
 
721
- for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
811
+ if ( useTexStorage && allocateMemory ) {
722
812
 
723
- mipmap = mipmaps[ i ];
813
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
724
814
 
725
- if ( texture.format !== RGBAFormat ) {
815
+ }
816
+
817
+ for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
726
818
 
727
- if ( glFormat !== null ) {
819
+ mipmap = mipmaps[ i ];
728
820
 
729
821
  if ( useTexStorage ) {
730
822
 
731
- state.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
823
+ state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
732
824
 
733
825
  } else {
734
826
 
735
- state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
827
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
736
828
 
737
829
  }
738
830
 
739
- } else {
740
-
741
- console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );
742
-
743
831
  }
744
832
 
833
+ texture.generateMipmaps = false;
834
+
745
835
  } else {
746
836
 
747
837
  if ( useTexStorage ) {
748
838
 
749
- state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
839
+ if ( allocateMemory ) {
840
+
841
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
842
+
843
+ }
844
+
845
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );
750
846
 
751
847
  } else {
752
848
 
753
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
849
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );
754
850
 
755
851
  }
756
852
 
757
853
  }
758
854
 
759
- }
855
+ } else if ( texture.isCompressedTexture ) {
856
+
857
+ if ( useTexStorage && allocateMemory ) {
760
858
 
761
- } else if ( texture.isDataTexture2DArray ) {
859
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
762
860
 
763
- if ( useTexStorage ) {
861
+ }
764
862
 
765
- if ( allocateMemory ) {
863
+ for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
766
864
 
767
- state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );
865
+ mipmap = mipmaps[ i ];
768
866
 
769
- }
867
+ if ( texture.format !== RGBAFormat ) {
770
868
 
771
- state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
869
+ if ( glFormat !== null ) {
772
870
 
773
- } else {
871
+ if ( useTexStorage ) {
774
872
 
775
- state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
873
+ state.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
776
874
 
777
- }
875
+ } else {
778
876
 
779
- } else if ( texture.isDataTexture3D ) {
877
+ state.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
780
878
 
781
- if ( useTexStorage ) {
879
+ }
782
880
 
783
- if ( allocateMemory ) {
881
+ } else {
882
+
883
+ console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );
884
+
885
+ }
886
+
887
+ } else {
784
888
 
785
- state.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );
889
+ if ( useTexStorage ) {
890
+
891
+ state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
892
+
893
+ } else {
894
+
895
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
896
+
897
+ }
898
+
899
+ }
786
900
 
787
901
  }
788
902
 
789
- state.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
903
+ } else if ( texture.isDataArrayTexture ) {
790
904
 
791
- } else {
905
+ if ( useTexStorage ) {
906
+
907
+ if ( allocateMemory ) {
792
908
 
793
- state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
909
+ state.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );
794
910
 
795
- }
911
+ }
796
912
 
797
- } else if ( texture.isFramebufferTexture ) {
913
+ state.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
798
914
 
799
- if ( useTexStorage && allocateMemory ) {
915
+ } else {
800
916
 
801
- state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
917
+ state.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
802
918
 
803
- } else {
919
+ }
804
920
 
805
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );
921
+ } else if ( texture.isData3DTexture ) {
806
922
 
807
- }
923
+ if ( useTexStorage ) {
808
924
 
809
- } else {
925
+ if ( allocateMemory ) {
810
926
 
811
- // regular Texture (image, video, canvas)
927
+ state.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );
812
928
 
813
- // use manually created mipmaps if available
814
- // if there are no manual mipmaps
815
- // set 0 level mipmap and then use GL to generate other mipmap levels
929
+ }
816
930
 
817
- if ( mipmaps.length > 0 && supportsMips ) {
931
+ state.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
818
932
 
819
- if ( useTexStorage && allocateMemory ) {
933
+ } else {
820
934
 
821
- state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
935
+ state.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );
822
936
 
823
937
  }
824
938
 
825
- for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
939
+ } else if ( texture.isFramebufferTexture ) {
826
940
 
827
- mipmap = mipmaps[ i ];
941
+ if ( allocateMemory ) {
828
942
 
829
943
  if ( useTexStorage ) {
830
944
 
831
- state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );
945
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
832
946
 
833
947
  } else {
834
948
 
835
- state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
949
+ let width = image.width, height = image.height;
950
+
951
+ for ( let i = 0; i < levels; i ++ ) {
952
+
953
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );
954
+
955
+ width >>= 1;
956
+ height >>= 1;
957
+
958
+ }
836
959
 
837
960
  }
838
961
 
839
962
  }
840
963
 
841
- texture.generateMipmaps = false;
842
-
843
964
  } else {
844
965
 
845
- if ( useTexStorage ) {
966
+ // regular Texture (image, video, canvas)
846
967
 
847
- if ( allocateMemory ) {
968
+ // use manually created mipmaps if available
969
+ // if there are no manual mipmaps
970
+ // set 0 level mipmap and then use GL to generate other mipmap levels
848
971
 
849
- state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
972
+ if ( mipmaps.length > 0 && supportsMips ) {
973
+
974
+ if ( useTexStorage && allocateMemory ) {
975
+
976
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );
850
977
 
851
978
  }
852
979
 
853
- state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );
980
+ for ( let i = 0, il = mipmaps.length; i < il; i ++ ) {
981
+
982
+ mipmap = mipmaps[ i ];
983
+
984
+ if ( useTexStorage ) {
985
+
986
+ state.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );
987
+
988
+ } else {
989
+
990
+ state.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );
991
+
992
+ }
993
+
994
+ }
995
+
996
+ texture.generateMipmaps = false;
854
997
 
855
998
  } else {
856
999
 
857
- state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
1000
+ if ( useTexStorage ) {
1001
+
1002
+ if ( allocateMemory ) {
1003
+
1004
+ state.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );
1005
+
1006
+ }
1007
+
1008
+ state.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );
1009
+
1010
+ } else {
1011
+
1012
+ state.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );
1013
+
1014
+ }
858
1015
 
859
1016
  }
860
1017
 
861
1018
  }
862
1019
 
863
- }
1020
+ if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1021
+
1022
+ generateMipmap( textureType );
1023
+
1024
+ }
864
1025
 
865
- if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1026
+ source.__currentVersion = source.version;
866
1027
 
867
- generateMipmap( textureType );
1028
+ if ( texture.onUpdate ) texture.onUpdate( texture );
868
1029
 
869
1030
  }
870
1031
 
871
1032
  textureProperties.__version = texture.version;
872
1033
 
873
- if ( texture.onUpdate ) texture.onUpdate( texture );
874
-
875
1034
  }
876
1035
 
877
1036
  function uploadCubeTexture( textureProperties, texture, slot ) {
878
1037
 
879
1038
  if ( texture.image.length !== 6 ) return;
880
1039
 
881
- initTexture( textureProperties, texture );
1040
+ const forceUpload = initTexture( textureProperties, texture );
1041
+ const source = texture.source;
882
1042
 
883
1043
  state.activeTexture( _gl.TEXTURE0 + slot );
884
1044
  state.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );
885
1045
 
886
- _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
887
- _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
888
- _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
889
- _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );
1046
+ if ( source.version !== source.__currentVersion || forceUpload === true ) {
1047
+
1048
+ _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
1049
+ _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
1050
+ _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
1051
+ _gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, _gl.NONE );
890
1052
 
891
- const isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) );
892
- const isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );
1053
+ const isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );
1054
+ const isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );
893
1055
 
894
- const cubeImage = [];
1056
+ const cubeImage = [];
895
1057
 
896
- for ( let i = 0; i < 6; i ++ ) {
1058
+ for ( let i = 0; i < 6; i ++ ) {
897
1059
 
898
- if ( ! isCompressed && ! isDataTexture ) {
1060
+ if ( ! isCompressed && ! isDataTexture ) {
899
1061
 
900
- cubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );
1062
+ cubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );
901
1063
 
902
- } else {
1064
+ } else {
903
1065
 
904
- cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];
1066
+ cubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];
1067
+
1068
+ }
1069
+
1070
+ cubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );
905
1071
 
906
1072
  }
907
1073
 
908
- cubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );
1074
+ const image = cubeImage[ 0 ],
1075
+ supportsMips = isPowerOfTwo( image ) || isWebGL2,
1076
+ glFormat = utils.convert( texture.format, texture.encoding ),
1077
+ glType = utils.convert( texture.type ),
1078
+ glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
909
1079
 
910
- }
1080
+ const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
1081
+ const allocateMemory = ( source.__currentVersion === undefined ) || ( forceUpload === true );
1082
+ let levels = getMipLevels( texture, image, supportsMips );
1083
+
1084
+ setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );
911
1085
 
912
- const image = cubeImage[ 0 ],
913
- supportsMips = isPowerOfTwo( image ) || isWebGL2,
914
- glFormat = utils.convert( texture.format, texture.encoding ),
915
- glType = utils.convert( texture.type ),
916
- glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1086
+ let mipmaps;
917
1087
 
918
- const useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );
919
- const allocateMemory = ( textureProperties.__version === undefined );
920
- let levels = getMipLevels( texture, image, supportsMips );
1088
+ if ( isCompressed ) {
921
1089
 
922
- setTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, supportsMips );
1090
+ if ( useTexStorage && allocateMemory ) {
923
1091
 
924
- let mipmaps;
1092
+ state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );
925
1093
 
926
- if ( isCompressed ) {
1094
+ }
927
1095
 
928
- if ( useTexStorage && allocateMemory ) {
1096
+ for ( let i = 0; i < 6; i ++ ) {
929
1097
 
930
- state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );
1098
+ mipmaps = cubeImage[ i ].mipmaps;
931
1099
 
932
- }
1100
+ for ( let j = 0; j < mipmaps.length; j ++ ) {
933
1101
 
934
- for ( let i = 0; i < 6; i ++ ) {
1102
+ const mipmap = mipmaps[ j ];
935
1103
 
936
- mipmaps = cubeImage[ i ].mipmaps;
1104
+ if ( texture.format !== RGBAFormat ) {
937
1105
 
938
- for ( let j = 0; j < mipmaps.length; j ++ ) {
1106
+ if ( glFormat !== null ) {
939
1107
 
940
- const mipmap = mipmaps[ j ];
1108
+ if ( useTexStorage ) {
941
1109
 
942
- if ( texture.format !== RGBAFormat ) {
1110
+ state.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
943
1111
 
944
- if ( glFormat !== null ) {
1112
+ } else {
945
1113
 
946
- if ( useTexStorage ) {
1114
+ state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
947
1115
 
948
- state.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );
1116
+ }
949
1117
 
950
1118
  } else {
951
1119
 
952
- state.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );
1120
+ console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );
953
1121
 
954
1122
  }
955
1123
 
956
1124
  } else {
957
1125
 
958
- console.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );
959
-
960
- }
961
-
962
- } else {
1126
+ if ( useTexStorage ) {
963
1127
 
964
- if ( useTexStorage ) {
1128
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
965
1129
 
966
- state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );
1130
+ } else {
967
1131
 
968
- } else {
1132
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
969
1133
 
970
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
1134
+ }
971
1135
 
972
1136
  }
973
1137
 
@@ -975,78 +1139,78 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
975
1139
 
976
1140
  }
977
1141
 
978
- }
1142
+ } else {
979
1143
 
980
- } else {
1144
+ mipmaps = texture.mipmaps;
981
1145
 
982
- mipmaps = texture.mipmaps;
1146
+ if ( useTexStorage && allocateMemory ) {
983
1147
 
984
- if ( useTexStorage && allocateMemory ) {
1148
+ // TODO: Uniformly handle mipmap definitions
1149
+ // Normal textures and compressed cube textures define base level + mips with their mipmap array
1150
+ // Uncompressed cube textures use their mipmap array only for mips (no base level)
985
1151
 
986
- // TODO: Uniformly handle mipmap definitions
987
- // Normal textures and compressed cube textures define base level + mips with their mipmap array
988
- // Uncompressed cube textures use their mipmap array only for mips (no base level)
1152
+ if ( mipmaps.length > 0 ) levels ++;
989
1153
 
990
- if ( mipmaps.length > 0 ) levels ++;
1154
+ state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );
991
1155
 
992
- state.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );
1156
+ }
993
1157
 
994
- }
1158
+ for ( let i = 0; i < 6; i ++ ) {
995
1159
 
996
- for ( let i = 0; i < 6; i ++ ) {
1160
+ if ( isDataTexture ) {
997
1161
 
998
- if ( isDataTexture ) {
1162
+ if ( useTexStorage ) {
999
1163
 
1000
- if ( useTexStorage ) {
1164
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );
1001
1165
 
1002
- state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );
1166
+ } else {
1003
1167
 
1004
- } else {
1168
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
1005
1169
 
1006
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );
1170
+ }
1007
1171
 
1008
- }
1172
+ for ( let j = 0; j < mipmaps.length; j ++ ) {
1009
1173
 
1010
- for ( let j = 0; j < mipmaps.length; j ++ ) {
1174
+ const mipmap = mipmaps[ j ];
1175
+ const mipmapImage = mipmap.image[ i ].image;
1011
1176
 
1012
- const mipmap = mipmaps[ j ];
1013
- const mipmapImage = mipmap.image[ i ].image;
1177
+ if ( useTexStorage ) {
1014
1178
 
1015
- if ( useTexStorage ) {
1179
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );
1016
1180
 
1017
- state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );
1181
+ } else {
1018
1182
 
1019
- } else {
1183
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );
1020
1184
 
1021
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );
1185
+ }
1022
1186
 
1023
1187
  }
1024
1188
 
1025
- }
1189
+ } else {
1026
1190
 
1027
- } else {
1191
+ if ( useTexStorage ) {
1028
1192
 
1029
- if ( useTexStorage ) {
1193
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );
1030
1194
 
1031
- state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );
1195
+ } else {
1032
1196
 
1033
- } else {
1197
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );
1034
1198
 
1035
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );
1199
+ }
1036
1200
 
1037
- }
1201
+ for ( let j = 0; j < mipmaps.length; j ++ ) {
1038
1202
 
1039
- for ( let j = 0; j < mipmaps.length; j ++ ) {
1203
+ const mipmap = mipmaps[ j ];
1040
1204
 
1041
- const mipmap = mipmaps[ j ];
1205
+ if ( useTexStorage ) {
1042
1206
 
1043
- if ( useTexStorage ) {
1207
+ state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );
1044
1208
 
1045
- state.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );
1209
+ } else {
1046
1210
 
1047
- } else {
1211
+ state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );
1048
1212
 
1049
- state.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );
1213
+ }
1050
1214
 
1051
1215
  }
1052
1216
 
@@ -1056,19 +1220,21 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1056
1220
 
1057
1221
  }
1058
1222
 
1059
- }
1223
+ if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1060
1224
 
1061
- if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1225
+ // We assume images for cube map have the same size.
1226
+ generateMipmap( _gl.TEXTURE_CUBE_MAP );
1062
1227
 
1063
- // We assume images for cube map have the same size.
1064
- generateMipmap( _gl.TEXTURE_CUBE_MAP );
1228
+ }
1229
+
1230
+ source.__currentVersion = source.version;
1231
+
1232
+ if ( texture.onUpdate ) texture.onUpdate( texture );
1065
1233
 
1066
1234
  }
1067
1235
 
1068
1236
  textureProperties.__version = texture.version;
1069
1237
 
1070
- if ( texture.onUpdate ) texture.onUpdate( texture );
1071
-
1072
1238
  }
1073
1239
 
1074
1240
  // Render targets
@@ -1096,9 +1262,10 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1096
1262
  }
1097
1263
 
1098
1264
  state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
1099
- if ( renderTarget.useRenderToTexture ) {
1100
1265
 
1101
- MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );
1266
+ if ( useMultisampledRTT( renderTarget ) ) {
1267
+
1268
+ multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );
1102
1269
 
1103
1270
  } else {
1104
1271
 
@@ -1120,7 +1287,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1120
1287
 
1121
1288
  let glInternalFormat = _gl.DEPTH_COMPONENT16;
1122
1289
 
1123
- if ( isMultisample || renderTarget.useRenderToTexture ) {
1290
+ if ( isMultisample || useMultisampledRTT( renderTarget ) ) {
1124
1291
 
1125
1292
  const depthTexture = renderTarget.depthTexture;
1126
1293
 
@@ -1140,9 +1307,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1140
1307
 
1141
1308
  const samples = getRenderTargetSamples( renderTarget );
1142
1309
 
1143
- if ( renderTarget.useRenderToTexture ) {
1310
+ if ( useMultisampledRTT( renderTarget ) ) {
1144
1311
 
1145
- MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1312
+ multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1146
1313
 
1147
1314
  } else {
1148
1315
 
@@ -1162,13 +1329,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1162
1329
 
1163
1330
  const samples = getRenderTargetSamples( renderTarget );
1164
1331
 
1165
- if ( isMultisample && renderTarget.useRenderbuffer ) {
1332
+ if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {
1166
1333
 
1167
1334
  _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
1168
1335
 
1169
- } else if ( renderTarget.useRenderToTexture ) {
1336
+ } else if ( useMultisampledRTT( renderTarget ) ) {
1170
1337
 
1171
- MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
1338
+ multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, _gl.DEPTH24_STENCIL8, renderTarget.width, renderTarget.height );
1172
1339
 
1173
1340
  } else {
1174
1341
 
@@ -1181,25 +1348,30 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1181
1348
 
1182
1349
  } else {
1183
1350
 
1184
- // Use the first texture for MRT so far
1185
- const texture = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture[ 0 ] : renderTarget.texture;
1351
+ const textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];
1186
1352
 
1187
- const glFormat = utils.convert( texture.format, texture.encoding );
1188
- const glType = utils.convert( texture.type );
1189
- const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1190
- const samples = getRenderTargetSamples( renderTarget );
1353
+ for ( let i = 0; i < textures.length; i ++ ) {
1191
1354
 
1192
- if ( isMultisample && renderTarget.useRenderbuffer ) {
1355
+ const texture = textures[ i ];
1193
1356
 
1194
- _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1357
+ const glFormat = utils.convert( texture.format, texture.encoding );
1358
+ const glType = utils.convert( texture.type );
1359
+ const glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );
1360
+ const samples = getRenderTargetSamples( renderTarget );
1195
1361
 
1196
- } else if ( renderTarget.useRenderToTexture ) {
1362
+ if ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {
1197
1363
 
1198
- MultisampledRenderToTextureExtension.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1364
+ _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1199
1365
 
1200
- } else {
1366
+ } else if ( useMultisampledRTT( renderTarget ) ) {
1201
1367
 
1202
- _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
1368
+ multisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1369
+
1370
+ } else {
1371
+
1372
+ _gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );
1373
+
1374
+ }
1203
1375
 
1204
1376
  }
1205
1377
 
@@ -1241,9 +1413,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1241
1413
 
1242
1414
  if ( renderTarget.depthTexture.format === DepthFormat ) {
1243
1415
 
1244
- if ( renderTarget.useRenderToTexture ) {
1416
+ if ( useMultisampledRTT( renderTarget ) ) {
1245
1417
 
1246
- MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1418
+ multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1247
1419
 
1248
1420
  } else {
1249
1421
 
@@ -1253,9 +1425,9 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1253
1425
 
1254
1426
  } else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {
1255
1427
 
1256
- if ( renderTarget.useRenderToTexture ) {
1428
+ if ( useMultisampledRTT( renderTarget ) ) {
1257
1429
 
1258
- MultisampledRenderToTextureExtension.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1430
+ multisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );
1259
1431
 
1260
1432
  } else {
1261
1433
 
@@ -1355,7 +1527,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1355
1527
 
1356
1528
  const isCube = ( renderTarget.isWebGLCubeRenderTarget === true );
1357
1529
  const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
1358
- const isRenderTarget3D = texture.isDataTexture3D || texture.isDataTexture2DArray;
1359
1530
  const supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;
1360
1531
 
1361
1532
  // Setup framebuffer
@@ -1400,14 +1571,23 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1400
1571
 
1401
1572
  }
1402
1573
 
1403
- } else if ( renderTarget.useRenderbuffer ) {
1574
+ }
1404
1575
 
1405
- if ( isWebGL2 ) {
1576
+ if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
1577
+
1578
+ const textures = isMultipleRenderTargets ? texture : [ texture ];
1406
1579
 
1407
- renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
1408
- renderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();
1580
+ renderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();
1581
+ renderTargetProperties.__webglColorRenderbuffer = [];
1409
1582
 
1410
- _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
1583
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1584
+
1585
+ for ( let i = 0; i < textures.length; i ++ ) {
1586
+
1587
+ const texture = textures[ i ];
1588
+ renderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();
1589
+
1590
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
1411
1591
 
1412
1592
  const glFormat = utils.convert( texture.format, texture.encoding );
1413
1593
  const glType = utils.convert( texture.type );
@@ -1415,26 +1595,21 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1415
1595
  const samples = getRenderTargetSamples( renderTarget );
1416
1596
  _gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );
1417
1597
 
1418
- state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1419
- _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer );
1420
- _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
1421
-
1422
- if ( renderTarget.depthBuffer ) {
1423
-
1424
- renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();
1425
- setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );
1598
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
1426
1599
 
1427
- }
1428
-
1429
- state.bindFramebuffer( _gl.FRAMEBUFFER, null );
1600
+ }
1430
1601
 
1602
+ _gl.bindRenderbuffer( _gl.RENDERBUFFER, null );
1431
1603
 
1432
- } else {
1604
+ if ( renderTarget.depthBuffer ) {
1433
1605
 
1434
- console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );
1606
+ renderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();
1607
+ setupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );
1435
1608
 
1436
1609
  }
1437
1610
 
1611
+ state.bindFramebuffer( _gl.FRAMEBUFFER, null );
1612
+
1438
1613
  }
1439
1614
 
1440
1615
  }
@@ -1487,18 +1662,15 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1487
1662
 
1488
1663
  let glTextureType = _gl.TEXTURE_2D;
1489
1664
 
1490
- if ( isRenderTarget3D ) {
1491
-
1492
- // Render targets containing layers, i.e: Texture 3D and 2d arrays
1665
+ if ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {
1493
1666
 
1494
1667
  if ( isWebGL2 ) {
1495
1668
 
1496
- const isTexture3D = texture.isDataTexture3D;
1497
- glTextureType = isTexture3D ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;
1669
+ glTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;
1498
1670
 
1499
1671
  } else {
1500
1672
 
1501
- console.warn( 'THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.' );
1673
+ console.error( 'THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.' );
1502
1674
 
1503
1675
  }
1504
1676
 
@@ -1555,15 +1727,38 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1555
1727
 
1556
1728
  function updateMultisampleRenderTarget( renderTarget ) {
1557
1729
 
1558
- if ( renderTarget.useRenderbuffer ) {
1730
+ if ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {
1731
+
1732
+ const textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [ renderTarget.texture ];
1733
+ const width = renderTarget.width;
1734
+ const height = renderTarget.height;
1735
+ let mask = _gl.COLOR_BUFFER_BIT;
1736
+ const invalidationArray = [];
1737
+ const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
1738
+ const renderTargetProperties = properties.get( renderTarget );
1739
+ const isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );
1740
+
1741
+ // If MRT we need to remove FBO attachments
1742
+ if ( isMultipleRenderTargets ) {
1743
+
1744
+ for ( let i = 0; i < textures.length; i ++ ) {
1745
+
1746
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1747
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );
1748
+
1749
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
1750
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );
1751
+
1752
+ }
1753
+
1754
+ }
1559
1755
 
1560
- if ( isWebGL2 ) {
1756
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1757
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
1561
1758
 
1562
- const width = renderTarget.width;
1563
- const height = renderTarget.height;
1564
- let mask = _gl.COLOR_BUFFER_BIT;
1565
- const invalidationArray = [ _gl.COLOR_ATTACHMENT0 ];
1566
- const depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;
1759
+ for ( let i = 0; i < textures.length; i ++ ) {
1760
+
1761
+ invalidationArray.push( _gl.COLOR_ATTACHMENT0 + i );
1567
1762
 
1568
1763
  if ( renderTarget.depthBuffer ) {
1569
1764
 
@@ -1571,45 +1766,83 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1571
1766
 
1572
1767
  }
1573
1768
 
1574
- if ( ! renderTarget.ignoreDepthForMultisampleCopy ) {
1769
+ const ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;
1770
+
1771
+ if ( ignoreDepthValues === false ) {
1575
1772
 
1576
1773
  if ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;
1577
1774
  if ( renderTarget.stencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;
1578
1775
 
1579
1776
  }
1580
1777
 
1581
- const renderTargetProperties = properties.get( renderTarget );
1778
+ if ( isMultipleRenderTargets ) {
1779
+
1780
+ _gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
1582
1781
 
1583
- state.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1584
- state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
1782
+ }
1585
1783
 
1586
- if ( renderTarget.ignoreDepthForMultisampleCopy ) {
1784
+ if ( ignoreDepthValues === true ) {
1587
1785
 
1588
1786
  _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, [ depthStyle ] );
1589
1787
  _gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );
1590
1788
 
1591
1789
  }
1592
1790
 
1791
+ if ( isMultipleRenderTargets ) {
1792
+
1793
+ const webglTexture = properties.get( textures[ i ] ).__webglTexture;
1794
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );
1795
+
1796
+ }
1797
+
1593
1798
  _gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );
1594
- _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
1595
1799
 
1596
- state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
1597
- state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1800
+ if ( supportsInvalidateFramebuffer ) {
1598
1801
 
1599
- } else {
1802
+ _gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArray );
1803
+
1804
+ }
1600
1805
 
1601
- console.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );
1602
1806
 
1603
1807
  }
1604
1808
 
1809
+ state.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );
1810
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );
1811
+
1812
+ // If MRT since pre-blit we removed the FBO we need to reconstruct the attachments
1813
+ if ( isMultipleRenderTargets ) {
1814
+
1815
+ for ( let i = 0; i < textures.length; i ++ ) {
1816
+
1817
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1818
+ _gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );
1819
+
1820
+ const webglTexture = properties.get( textures[ i ] ).__webglTexture;
1821
+
1822
+ state.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
1823
+ _gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );
1824
+
1825
+ }
1826
+
1827
+ }
1828
+
1829
+ state.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );
1830
+
1605
1831
  }
1606
1832
 
1607
1833
  }
1608
1834
 
1609
1835
  function getRenderTargetSamples( renderTarget ) {
1610
1836
 
1611
- return ( isWebGL2 && ( renderTarget.useRenderbuffer || renderTarget.useRenderToTexture ) ) ?
1612
- Math.min( maxSamples, renderTarget.samples ) : 0;
1837
+ return Math.min( maxSamples, renderTarget.samples );
1838
+
1839
+ }
1840
+
1841
+ function useMultisampledRTT( renderTarget ) {
1842
+
1843
+ const renderTargetProperties = properties.get( renderTarget );
1844
+
1845
+ return isWebGL2 && renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;
1613
1846
 
1614
1847
  }
1615
1848
 
@@ -1687,50 +1920,6 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1687
1920
 
1688
1921
  }
1689
1922
 
1690
- // backwards compatibility
1691
-
1692
- let warnedTexture2D = false;
1693
- let warnedTextureCube = false;
1694
-
1695
- function safeSetTexture2D( texture, slot ) {
1696
-
1697
- if ( texture && texture.isWebGLRenderTarget ) {
1698
-
1699
- if ( warnedTexture2D === false ) {
1700
-
1701
- console.warn( 'THREE.WebGLTextures.safeSetTexture2D: don\'t use render targets as textures. Use their .texture property instead.' );
1702
- warnedTexture2D = true;
1703
-
1704
- }
1705
-
1706
- texture = texture.texture;
1707
-
1708
- }
1709
-
1710
- setTexture2D( texture, slot );
1711
-
1712
- }
1713
-
1714
- function safeSetTextureCube( texture, slot ) {
1715
-
1716
- if ( texture && texture.isWebGLCubeRenderTarget ) {
1717
-
1718
- if ( warnedTextureCube === false ) {
1719
-
1720
- console.warn( 'THREE.WebGLTextures.safeSetTextureCube: don\'t use cube render targets as textures. Use their .texture property instead.' );
1721
- warnedTextureCube = true;
1722
-
1723
- }
1724
-
1725
- texture = texture.texture;
1726
-
1727
- }
1728
-
1729
-
1730
- setTextureCube( texture, slot );
1731
-
1732
- }
1733
-
1734
1923
  //
1735
1924
 
1736
1925
  this.allocateTextureUnit = allocateTextureUnit;
@@ -1746,9 +1935,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1746
1935
  this.updateMultisampleRenderTarget = updateMultisampleRenderTarget;
1747
1936
  this.setupDepthRenderbuffer = setupDepthRenderbuffer;
1748
1937
  this.setupFrameBufferTexture = setupFrameBufferTexture;
1749
-
1750
- this.safeSetTexture2D = safeSetTexture2D;
1751
- this.safeSetTextureCube = safeSetTextureCube;
1938
+ this.useMultisampledRTT = useMultisampledRTT;
1752
1939
 
1753
1940
  }
1754
1941