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