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