super-three 0.147.1 → 0.154.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 (896) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +37190 -21678
  3. package/build/three.js +37182 -21669
  4. package/build/three.min.js +4 -2
  5. package/build/three.module.js +7656 -6548
  6. package/build/three.module.min.js +7 -0
  7. package/examples/jsm/animation/AnimationClipCreator.js +5 -3
  8. package/examples/jsm/cameras/CinematicCamera.js +1 -2
  9. package/examples/jsm/capabilities/WebGPU.js +17 -5
  10. package/examples/jsm/controls/ArcballControls.js +1835 -1827
  11. package/examples/jsm/controls/FlyControls.js +25 -9
  12. package/examples/jsm/controls/MapControls.js +28 -0
  13. package/examples/jsm/controls/OrbitControls.js +25 -46
  14. package/examples/jsm/controls/PointerLockControls.js +70 -65
  15. package/examples/jsm/controls/TrackballControls.js +18 -4
  16. package/examples/jsm/controls/TransformControls.js +0 -1
  17. package/examples/jsm/csm/CSM.js +12 -6
  18. package/examples/jsm/csm/CSMShader.js +7 -6
  19. package/examples/jsm/effects/AnaglyphEffect.js +6 -20
  20. package/examples/jsm/effects/AsciiEffect.js +3 -6
  21. package/examples/jsm/effects/OutlineEffect.js +2 -16
  22. package/examples/jsm/effects/ParallaxBarrierEffect.js +3 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +6 -2
  24. package/examples/jsm/exporters/DRACOExporter.js +53 -11
  25. package/examples/jsm/exporters/EXRExporter.js +3 -9
  26. package/examples/jsm/exporters/GLTFExporter.js +597 -112
  27. package/examples/jsm/exporters/KTX2Exporter.js +34 -23
  28. package/examples/jsm/exporters/MMDExporter.js +1 -1
  29. package/examples/jsm/exporters/PLYExporter.js +8 -1
  30. package/examples/jsm/exporters/STLExporter.js +8 -4
  31. package/examples/jsm/exporters/USDZExporter.js +184 -124
  32. package/examples/jsm/geometries/ConvexGeometry.js +0 -6
  33. package/examples/jsm/geometries/ParametricGeometry.js +10 -0
  34. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  35. package/examples/jsm/helpers/ViewHelper.js +71 -57
  36. package/examples/jsm/interactive/HTMLMesh.js +16 -3
  37. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  38. package/examples/{js → jsm}/libs/basis/README.md +4 -4
  39. package/examples/jsm/libs/draco/draco_decoder.js +34 -0
  40. package/examples/jsm/libs/draco/draco_decoder.wasm +0 -0
  41. package/examples/jsm/libs/draco/draco_wasm_wrapper.js +117 -0
  42. package/examples/jsm/libs/draco/gltf/draco_decoder.js +33 -0
  43. package/examples/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
  44. package/examples/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
  45. package/examples/jsm/libs/lil-gui.module.min.js +2 -2
  46. package/examples/jsm/libs/tween.module.js +803 -0
  47. package/examples/jsm/lights/IESSpotLight.js +25 -0
  48. package/examples/jsm/lights/LightProbeGenerator.js +11 -9
  49. package/examples/jsm/lines/LineMaterial.js +1 -1
  50. package/examples/jsm/lines/LineSegments2.js +12 -10
  51. package/examples/jsm/loaders/3DMLoader.js +9 -6
  52. package/examples/jsm/loaders/3MFLoader.js +17 -12
  53. package/examples/jsm/loaders/AMFLoader.js +7 -4
  54. package/examples/jsm/loaders/BVHLoader.js +2 -2
  55. package/examples/jsm/loaders/ColladaLoader.js +19 -17
  56. package/examples/jsm/loaders/DRACOLoader.js +69 -18
  57. package/examples/jsm/loaders/EXRLoader.js +23 -24
  58. package/examples/jsm/loaders/FBXLoader.js +41 -52
  59. package/examples/jsm/loaders/GCodeLoader.js +1 -2
  60. package/examples/jsm/loaders/GLTFLoader.js +452 -282
  61. package/examples/jsm/loaders/HDRCubeTextureLoader.js +4 -4
  62. package/examples/jsm/loaders/IESLoader.js +337 -0
  63. package/examples/jsm/loaders/KMZLoader.js +4 -4
  64. package/examples/jsm/loaders/KTX2Loader.js +145 -69
  65. package/examples/jsm/loaders/LDrawLoader.js +24 -25
  66. package/examples/jsm/loaders/LWOLoader.js +12 -29
  67. package/examples/jsm/loaders/LottieLoader.js +3 -1
  68. package/examples/jsm/loaders/MMDLoader.js +49 -18
  69. package/examples/jsm/loaders/MTLLoader.js +2 -2
  70. package/examples/jsm/loaders/MaterialXLoader.js +9 -3
  71. package/examples/jsm/loaders/NRRDLoader.js +33 -5
  72. package/examples/jsm/loaders/OBJLoader.js +1 -1
  73. package/examples/jsm/loaders/PCDLoader.js +26 -12
  74. package/examples/jsm/loaders/PDBLoader.js +7 -2
  75. package/examples/jsm/loaders/PLYLoader.js +261 -106
  76. package/examples/jsm/loaders/RGBELoader.js +3 -3
  77. package/examples/jsm/loaders/STLLoader.js +9 -5
  78. package/examples/jsm/loaders/SVGLoader.js +36 -27
  79. package/examples/jsm/loaders/TTFLoader.js +1 -8
  80. package/examples/jsm/loaders/TiltLoader.js +13 -7
  81. package/examples/jsm/loaders/USDZLoader.js +5 -5
  82. package/examples/jsm/loaders/VOXLoader.js +8 -2
  83. package/examples/jsm/loaders/VRMLLoader.js +60 -20
  84. package/examples/jsm/loaders/VTKLoader.js +19 -10
  85. package/examples/jsm/loaders/XYZLoader.js +9 -3
  86. package/examples/jsm/loaders/lwo/IFFParser.js +19 -19
  87. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -5
  88. package/examples/jsm/math/Lut.js +5 -4
  89. package/examples/jsm/math/MeshSurfaceSampler.js +82 -43
  90. package/examples/jsm/misc/ConvexObjectBreaker.js +2 -8
  91. package/examples/jsm/misc/GPUComputationRenderer.js +6 -5
  92. package/examples/jsm/misc/MD2Character.js +2 -2
  93. package/examples/jsm/misc/MD2CharacterComplex.js +2 -2
  94. package/examples/jsm/misc/ProgressiveLightMap.js +12 -10
  95. package/examples/jsm/misc/RollerCoaster.js +7 -1
  96. package/examples/jsm/misc/Volume.js +20 -5
  97. package/examples/jsm/misc/VolumeSlice.js +3 -1
  98. package/examples/jsm/modifiers/CurveModifier.js +1 -0
  99. package/examples/jsm/modifiers/TessellateModifier.js +19 -19
  100. package/examples/jsm/nodes/Nodes.js +149 -335
  101. package/examples/jsm/nodes/accessors/BitangentNode.js +43 -16
  102. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +99 -0
  103. package/examples/jsm/nodes/accessors/BufferNode.js +6 -0
  104. package/examples/jsm/nodes/accessors/CameraNode.js +36 -5
  105. package/examples/jsm/nodes/accessors/CubeTextureNode.js +27 -33
  106. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +64 -0
  107. package/examples/jsm/nodes/accessors/InstanceNode.js +39 -26
  108. package/examples/jsm/nodes/accessors/MaterialNode.js +164 -39
  109. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +16 -0
  110. package/examples/jsm/nodes/accessors/ModelNode.js +13 -0
  111. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +13 -14
  112. package/examples/jsm/nodes/accessors/MorphNode.js +70 -0
  113. package/examples/jsm/nodes/accessors/NormalNode.js +36 -19
  114. package/examples/jsm/nodes/accessors/Object3DNode.js +40 -12
  115. package/examples/jsm/nodes/accessors/PointUVNode.js +6 -1
  116. package/examples/jsm/nodes/accessors/PositionNode.js +38 -23
  117. package/examples/jsm/nodes/accessors/ReferenceNode.js +21 -14
  118. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +11 -7
  119. package/examples/jsm/nodes/accessors/SceneNode.js +46 -0
  120. package/examples/jsm/nodes/accessors/SkinningNode.js +55 -71
  121. package/examples/jsm/nodes/accessors/StorageBufferNode.js +6 -0
  122. package/examples/jsm/nodes/accessors/TangentNode.js +28 -20
  123. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +94 -0
  124. package/examples/jsm/nodes/accessors/TextureNode.js +143 -13
  125. package/examples/jsm/nodes/accessors/TextureSizeNode.js +35 -0
  126. package/examples/jsm/nodes/accessors/UVNode.js +7 -1
  127. package/examples/jsm/nodes/accessors/UserDataNode.js +6 -0
  128. package/examples/jsm/nodes/code/CodeNode.js +78 -0
  129. package/examples/jsm/nodes/code/ExpressionNode.js +37 -0
  130. package/examples/jsm/nodes/{core → code}/FunctionCallNode.js +15 -1
  131. package/examples/jsm/nodes/{core → code}/FunctionNode.js +31 -9
  132. package/examples/jsm/nodes/code/ScriptableNode.js +488 -0
  133. package/examples/jsm/nodes/code/ScriptableValueNode.js +167 -0
  134. package/examples/jsm/nodes/core/ArrayUniformNode.js +3 -0
  135. package/examples/jsm/nodes/core/AttributeNode.js +17 -9
  136. package/examples/jsm/nodes/core/BypassNode.js +11 -4
  137. package/examples/jsm/nodes/core/CacheNode.js +46 -0
  138. package/examples/jsm/nodes/core/ConstNode.js +3 -0
  139. package/examples/jsm/nodes/core/ContextNode.js +10 -1
  140. package/examples/jsm/nodes/core/IndexNode.js +66 -0
  141. package/examples/jsm/nodes/core/InputNode.js +26 -5
  142. package/examples/jsm/nodes/core/LightingModel.js +17 -0
  143. package/examples/jsm/nodes/core/Node.js +128 -37
  144. package/examples/jsm/nodes/core/NodeAttribute.js +2 -1
  145. package/examples/jsm/nodes/core/NodeBuilder.js +287 -118
  146. package/examples/jsm/nodes/core/NodeCache.js +26 -0
  147. package/examples/jsm/nodes/core/NodeFrame.js +56 -5
  148. package/examples/jsm/nodes/core/NodeUtils.js +115 -28
  149. package/examples/jsm/nodes/core/PropertyNode.js +23 -2
  150. package/examples/jsm/nodes/core/StackNode.js +99 -0
  151. package/examples/jsm/nodes/core/TempNode.js +11 -3
  152. package/examples/jsm/nodes/core/UniformNode.js +16 -1
  153. package/examples/jsm/nodes/core/VarNode.js +19 -29
  154. package/examples/jsm/nodes/core/VaryingNode.js +15 -2
  155. package/examples/jsm/nodes/core/constants.js +6 -0
  156. package/examples/jsm/nodes/display/BlendModeNode.js +33 -19
  157. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +36 -20
  158. package/examples/jsm/nodes/display/ColorSpaceNode.js +60 -47
  159. package/examples/jsm/nodes/display/FrontFacingNode.js +7 -1
  160. package/examples/jsm/nodes/display/NormalMapNode.js +33 -20
  161. package/examples/jsm/nodes/display/PosterizeNode.js +10 -3
  162. package/examples/jsm/nodes/display/ToneMappingNode.js +101 -11
  163. package/examples/jsm/nodes/display/ViewportDepthNode.js +69 -0
  164. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +34 -0
  165. package/examples/jsm/nodes/display/ViewportNode.js +27 -18
  166. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +31 -0
  167. package/examples/jsm/nodes/display/ViewportTextureNode.js +75 -0
  168. package/examples/jsm/nodes/fog/FogExp2Node.js +35 -0
  169. package/examples/jsm/nodes/fog/FogNode.js +12 -6
  170. package/examples/jsm/nodes/fog/FogRangeNode.js +12 -5
  171. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +30 -0
  172. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +15 -16
  173. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +3 -3
  174. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +43 -0
  175. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +9 -7
  176. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +5 -5
  177. package/examples/jsm/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  178. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +4 -6
  179. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -6
  180. package/examples/jsm/nodes/functions/PhongLightingModel.js +28 -0
  181. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +155 -45
  182. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +5 -4
  183. package/examples/jsm/nodes/functions/material/getRoughness.js +6 -6
  184. package/examples/jsm/nodes/geometry/RangeNode.js +50 -55
  185. package/examples/jsm/nodes/gpgpu/ComputeNode.js +9 -2
  186. package/examples/jsm/nodes/lighting/AONode.js +5 -3
  187. package/examples/jsm/nodes/lighting/AmbientLightNode.js +27 -0
  188. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +114 -5
  189. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +43 -0
  190. package/examples/jsm/nodes/lighting/EnvironmentNode.js +153 -38
  191. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +15 -10
  192. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +39 -0
  193. package/examples/jsm/nodes/lighting/LightNode.js +57 -0
  194. package/examples/jsm/nodes/lighting/LightUtils.js +17 -0
  195. package/examples/jsm/nodes/lighting/LightingContextNode.js +41 -17
  196. package/examples/jsm/nodes/lighting/LightingNode.js +3 -1
  197. package/examples/jsm/nodes/lighting/LightsNode.js +18 -10
  198. package/examples/jsm/nodes/lighting/PointLightNode.js +71 -0
  199. package/examples/jsm/nodes/lighting/SpotLightNode.js +92 -0
  200. package/examples/jsm/nodes/loaders/NodeLoader.js +5 -4
  201. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +4 -20
  202. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +6 -24
  203. package/examples/jsm/nodes/materials/Materials.js +11 -55
  204. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +5 -26
  205. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +38 -0
  206. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +65 -0
  207. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -6
  208. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +22 -110
  209. package/examples/jsm/nodes/materials/NodeMaterial.js +340 -67
  210. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +7 -10
  211. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +29 -32
  212. package/examples/jsm/nodes/materialx/MaterialXNodes.js +31 -22
  213. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +3 -3
  214. package/examples/jsm/nodes/materialx/lib/mx_noise.js +14 -13
  215. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +4 -3
  216. package/examples/jsm/nodes/math/CondNode.js +43 -17
  217. package/examples/jsm/nodes/math/MathNode.js +184 -73
  218. package/examples/jsm/nodes/math/OperatorNode.js +53 -3
  219. package/examples/jsm/nodes/procedural/CheckerNode.js +16 -8
  220. package/examples/jsm/nodes/shadernode/ShaderNode.js +206 -63
  221. package/examples/jsm/nodes/utils/ArrayElementNode.js +4 -2
  222. package/examples/jsm/nodes/utils/ConvertNode.js +19 -1
  223. package/examples/jsm/nodes/utils/DiscardNode.js +26 -0
  224. package/examples/jsm/nodes/utils/EquirectUVNode.js +10 -4
  225. package/examples/jsm/nodes/utils/JoinNode.js +4 -1
  226. package/examples/jsm/nodes/utils/LoopNode.js +186 -0
  227. package/examples/jsm/nodes/utils/MatcapUVNode.js +11 -4
  228. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +18 -5
  229. package/examples/jsm/nodes/utils/OscNode.js +21 -14
  230. package/examples/jsm/nodes/utils/PackingNode.js +55 -0
  231. package/examples/jsm/nodes/utils/RemapNode.js +13 -5
  232. package/examples/jsm/nodes/utils/RotateUVNode.js +18 -7
  233. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +37 -0
  234. package/examples/jsm/nodes/utils/SplitNode.js +7 -5
  235. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +15 -30
  236. package/examples/jsm/nodes/utils/TimerNode.js +16 -6
  237. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +21 -10
  238. package/examples/jsm/objects/GroundProjectedSkybox.js +172 -0
  239. package/examples/jsm/objects/Lensflare.js +3 -4
  240. package/examples/jsm/objects/MarchingCubes.js +5 -1
  241. package/examples/jsm/objects/Reflector.js +8 -5
  242. package/examples/jsm/objects/Refractor.js +5 -5
  243. package/examples/jsm/objects/ShadowMesh.js +3 -3
  244. package/examples/jsm/objects/Sky.js +1 -1
  245. package/examples/jsm/objects/Water.js +2 -1
  246. package/examples/jsm/objects/Water2.js +1 -1
  247. package/examples/jsm/offscreen/scene.js +1 -0
  248. package/examples/jsm/physics/AmmoPhysics.js +27 -28
  249. package/examples/jsm/physics/RapierPhysics.js +199 -0
  250. package/examples/jsm/postprocessing/AfterimagePass.js +3 -2
  251. package/examples/jsm/postprocessing/BloomPass.js +7 -4
  252. package/examples/jsm/postprocessing/BokehPass.js +3 -8
  253. package/examples/jsm/postprocessing/DotScreenPass.js +1 -2
  254. package/examples/jsm/postprocessing/EffectComposer.js +7 -95
  255. package/examples/jsm/postprocessing/FilmPass.js +1 -2
  256. package/examples/jsm/postprocessing/GlitchPass.js +0 -2
  257. package/examples/jsm/postprocessing/HalftonePass.js +0 -6
  258. package/examples/jsm/postprocessing/OutlinePass.js +8 -10
  259. package/examples/jsm/postprocessing/OutputPass.js +72 -0
  260. package/examples/jsm/postprocessing/Pass.js +2 -0
  261. package/examples/jsm/postprocessing/RenderPixelatedPass.js +4 -3
  262. package/examples/jsm/postprocessing/SAOPass.js +4 -26
  263. package/examples/jsm/postprocessing/SMAAPass.js +5 -8
  264. package/examples/jsm/postprocessing/SSAARenderPass.js +5 -5
  265. package/examples/jsm/postprocessing/SSAOPass.js +4 -14
  266. package/examples/jsm/postprocessing/SSRPass.js +3 -7
  267. package/examples/jsm/postprocessing/SavePass.js +5 -4
  268. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  269. package/examples/jsm/postprocessing/TAARenderPass.js +17 -4
  270. package/examples/jsm/postprocessing/TexturePass.js +2 -3
  271. package/examples/jsm/postprocessing/UnrealBloomPass.js +13 -21
  272. package/examples/jsm/renderers/CSS2DRenderer.js +6 -1
  273. package/examples/jsm/renderers/CSS3DRenderer.js +27 -5
  274. package/examples/jsm/renderers/{webgpu/WebGPUAnimation.js → common/Animation.js} +4 -4
  275. package/examples/jsm/renderers/common/Attributes.js +75 -0
  276. package/examples/jsm/renderers/common/Backend.js +162 -0
  277. package/examples/jsm/renderers/common/Background.js +134 -0
  278. package/examples/jsm/renderers/common/Binding.js +11 -0
  279. package/examples/jsm/renderers/common/Bindings.js +169 -0
  280. package/examples/jsm/renderers/common/Buffer.js +38 -0
  281. package/examples/jsm/renderers/{webgpu/WebGPUBufferUtils.js → common/BufferUtils.js} +2 -2
  282. package/examples/jsm/renderers/common/ChainMap.js +89 -0
  283. package/examples/jsm/renderers/common/ComputePipeline.js +17 -0
  284. package/examples/jsm/renderers/common/Constants.js +14 -0
  285. package/examples/jsm/renderers/common/CubeRenderTarget.js +65 -0
  286. package/examples/jsm/renderers/common/DataMap.js +54 -0
  287. package/examples/jsm/renderers/common/Geometries.js +215 -0
  288. package/examples/jsm/renderers/{webgpu/WebGPUInfo.js → common/Info.js} +2 -3
  289. package/examples/jsm/renderers/common/Pipeline.js +13 -0
  290. package/examples/jsm/renderers/common/Pipelines.js +321 -0
  291. package/examples/jsm/renderers/common/ProgrammableStage.js +18 -0
  292. package/examples/jsm/renderers/common/RenderContext.js +37 -0
  293. package/examples/jsm/renderers/common/RenderContexts.js +38 -0
  294. package/examples/jsm/renderers/{webgpu/WebGPURenderLists.js → common/RenderList.js} +26 -47
  295. package/examples/jsm/renderers/common/RenderLists.js +38 -0
  296. package/examples/jsm/renderers/common/RenderObject.js +113 -0
  297. package/examples/jsm/renderers/common/RenderObjects.js +92 -0
  298. package/examples/jsm/renderers/common/RenderPipeline.js +16 -0
  299. package/examples/jsm/renderers/common/RenderTarget.js +15 -0
  300. package/examples/jsm/renderers/common/Renderer.js +864 -0
  301. package/examples/jsm/renderers/common/SampledTexture.js +80 -0
  302. package/examples/jsm/renderers/common/Sampler.js +18 -0
  303. package/examples/jsm/renderers/common/StorageBuffer.js +17 -0
  304. package/examples/jsm/renderers/common/Textures.js +206 -0
  305. package/examples/jsm/renderers/{webgpu/WebGPUUniform.js → common/Uniform.js} +13 -9
  306. package/examples/jsm/renderers/common/UniformBuffer.js +15 -0
  307. package/examples/jsm/renderers/{webgpu/WebGPUUniformsGroup.js → common/UniformsGroup.js} +13 -13
  308. package/examples/jsm/renderers/common/nodes/NodeRender.js +302 -0
  309. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampledTexture.js → common/nodes/NodeSampledTexture.js} +4 -4
  310. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeSampler.js → common/nodes/NodeSampler.js} +3 -3
  311. package/examples/jsm/renderers/{webgpu/nodes/WebGPUNodeUniform.js → common/nodes/NodeUniform.js} +1 -1
  312. package/examples/jsm/renderers/common/nodes/Nodes.js +319 -0
  313. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +340 -0
  314. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +58 -50
  315. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +847 -0
  316. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +15 -987
  317. package/examples/jsm/renderers/webgpu/nodes/{WebGPUNodeBuilder.js → WGSLNodeBuilder.js} +139 -92
  318. package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeFunction.js +2 -2
  319. package/examples/jsm/{nodes/parsers → renderers/webgpu/nodes}/WGSLNodeParser.js +1 -1
  320. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +255 -0
  321. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +145 -0
  322. package/examples/jsm/renderers/webgpu/{constants.js → utils/WebGPUConstants.js} +73 -12
  323. package/examples/jsm/renderers/webgpu/{WebGPURenderPipeline.js → utils/WebGPUPipelineUtils.js} +141 -296
  324. package/examples/jsm/renderers/webgpu/{WebGPUTextureUtils.js → utils/WebGPUTextureMipmapUtils.js} +5 -25
  325. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +937 -0
  326. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +92 -0
  327. package/examples/jsm/shaders/BleachBypassShader.js +2 -0
  328. package/examples/jsm/shaders/BlendShader.js +1 -2
  329. package/examples/jsm/shaders/BokehShader2.js +3 -0
  330. package/examples/jsm/shaders/ColorifyShader.js +2 -0
  331. package/examples/jsm/shaders/ConvolutionShader.js +2 -0
  332. package/examples/jsm/shaders/CopyShader.js +4 -2
  333. package/examples/jsm/shaders/DotScreenShader.js +2 -0
  334. package/examples/jsm/shaders/ExposureShader.js +44 -0
  335. package/examples/jsm/shaders/FilmShader.js +2 -0
  336. package/examples/jsm/shaders/GammaCorrectionShader.js +2 -0
  337. package/examples/jsm/shaders/HorizontalBlurShader.js +2 -0
  338. package/examples/jsm/shaders/MMDToonShader.js +15 -4
  339. package/examples/jsm/shaders/OutputShader.js +61 -0
  340. package/examples/jsm/shaders/RGBShiftShader.js +4 -2
  341. package/examples/jsm/shaders/SepiaShader.js +2 -0
  342. package/examples/jsm/shaders/ToonShader.js +13 -5
  343. package/examples/jsm/shaders/VelocityShader.js +1 -1
  344. package/examples/jsm/shaders/VerticalBlurShader.js +2 -0
  345. package/examples/jsm/shaders/VignetteShader.js +2 -0
  346. package/examples/jsm/shaders/WaterRefractionShader.js +5 -2
  347. package/examples/jsm/utils/BufferGeometryUtils.js +54 -36
  348. package/examples/jsm/utils/LDrawUtils.js +4 -4
  349. package/examples/jsm/utils/PackedPhongMaterial.js +5 -78
  350. package/examples/jsm/utils/SceneUtils.js +8 -4
  351. package/examples/jsm/utils/SkeletonUtils.js +27 -210
  352. package/examples/jsm/utils/TextureUtils.js +86 -0
  353. package/examples/jsm/webxr/OculusHandPointerModel.js +34 -13
  354. package/examples/jsm/webxr/VRButton.js +1 -2
  355. package/examples/jsm/webxr/XRButton.js +198 -0
  356. package/examples/jsm/webxr/XRHandPrimitiveModel.js +1 -0
  357. package/examples/jsm/webxr/XRPlanes.js +100 -0
  358. package/package.json +35 -87
  359. package/src/Three.Legacy.js +0 -319
  360. package/src/Three.js +4 -3
  361. package/src/animation/AnimationUtils.js +13 -1
  362. package/src/animation/PropertyBinding.js +2 -2
  363. package/src/audio/Audio.js +7 -2
  364. package/src/audio/PositionalAudio.js +8 -0
  365. package/src/cameras/Camera.js +5 -0
  366. package/src/cameras/CubeCamera.js +76 -13
  367. package/src/cameras/OrthographicCamera.js +1 -1
  368. package/src/cameras/PerspectiveCamera.js +1 -1
  369. package/src/constants.js +22 -2
  370. package/src/core/BufferAttribute.js +146 -29
  371. package/src/core/BufferGeometry.js +2 -15
  372. package/src/core/GLBufferAttribute.js +2 -0
  373. package/src/core/InterleavedBufferAttribute.js +1 -1
  374. package/src/core/Object3D.js +37 -8
  375. package/src/extras/DataUtils.js +7 -1
  376. package/src/extras/ImageUtils.js +2 -2
  377. package/src/extras/PMREMGenerator.js +5 -5
  378. package/src/extras/core/Curve.js +1 -1
  379. package/src/extras/curves/LineCurve.js +6 -4
  380. package/src/extras/curves/LineCurve3.js +13 -0
  381. package/src/geometries/BoxGeometry.js +10 -0
  382. package/src/geometries/CircleGeometry.js +11 -1
  383. package/src/geometries/ConeGeometry.js +1 -1
  384. package/src/geometries/CylinderGeometry.js +11 -1
  385. package/src/geometries/EdgesGeometry.js +10 -0
  386. package/src/geometries/ExtrudeGeometry.js +11 -1
  387. package/src/geometries/LatheGeometry.js +10 -0
  388. package/src/geometries/PlaneGeometry.js +10 -0
  389. package/src/geometries/PolyhedronGeometry.js +10 -0
  390. package/src/geometries/RingGeometry.js +11 -1
  391. package/src/geometries/ShapeGeometry.js +10 -0
  392. package/src/geometries/SphereGeometry.js +12 -2
  393. package/src/geometries/TorusGeometry.js +11 -1
  394. package/src/geometries/TorusKnotGeometry.js +10 -0
  395. package/src/geometries/TubeGeometry.js +10 -0
  396. package/src/geometries/WireframeGeometry.js +10 -0
  397. package/src/helpers/Box3Helper.js +1 -2
  398. package/src/lights/DirectionalLight.js +1 -1
  399. package/src/lights/HemisphereLight.js +1 -1
  400. package/src/lights/SpotLight.js +1 -1
  401. package/src/loaders/AudioLoader.js +14 -8
  402. package/src/loaders/CubeTextureLoader.js +2 -0
  403. package/src/loaders/DataTextureLoader.js +5 -1
  404. package/src/loaders/Loader.js +2 -0
  405. package/src/loaders/MaterialLoader.js +9 -0
  406. package/src/loaders/ObjectLoader.js +10 -2
  407. package/src/materials/LineBasicMaterial.js +4 -0
  408. package/src/materials/Material.js +19 -4
  409. package/src/materials/MeshDistanceMaterial.js +0 -9
  410. package/src/materials/MeshPhysicalMaterial.js +32 -6
  411. package/src/materials/ShaderMaterial.js +6 -1
  412. package/src/math/Box2.js +3 -2
  413. package/src/math/Box3.js +49 -64
  414. package/src/math/Color.js +88 -66
  415. package/src/math/ColorManagement.js +75 -16
  416. package/src/math/Euler.js +2 -11
  417. package/src/math/Frustum.js +29 -5
  418. package/src/math/MathUtils.js +43 -1
  419. package/src/math/Matrix3.js +26 -6
  420. package/src/math/Matrix4.js +74 -19
  421. package/src/math/Plane.js +2 -2
  422. package/src/math/Quaternion.js +6 -0
  423. package/src/math/Ray.js +7 -7
  424. package/src/math/Triangle.js +37 -7
  425. package/src/math/Vector2.js +16 -0
  426. package/src/math/Vector3.js +10 -0
  427. package/src/math/interpolants/CubicInterpolant.js +1 -2
  428. package/src/objects/InstancedMesh.js +82 -1
  429. package/src/objects/Mesh.js +108 -76
  430. package/src/objects/Skeleton.js +1 -3
  431. package/src/objects/SkinnedMesh.js +123 -8
  432. package/src/objects/Sprite.js +1 -1
  433. package/src/renderers/WebGLCubeRenderTarget.js +12 -3
  434. package/src/renderers/WebGLMultipleRenderTargets.js +4 -2
  435. package/src/renderers/WebGLRenderTarget.js +14 -2
  436. package/src/renderers/WebGLRenderer.js +1439 -1252
  437. package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
  438. package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
  439. package/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js +1 -1
  440. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  441. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +6 -0
  442. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +0 -271
  443. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +5 -5
  444. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +2 -10
  445. package/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js +5 -5
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +38 -0
  447. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +26 -3
  451. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +10 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -11
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +39 -13
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +306 -10
  457. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -11
  458. package/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js +9 -1
  459. package/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js +10 -2
  460. package/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js +1 -1
  461. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +40 -10
  462. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +5 -13
  463. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +7 -7
  464. package/src/renderers/shaders/ShaderChunk/{output_fragment.glsl.js → opaque_fragment.glsl.js} +1 -2
  465. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +11 -5
  466. package/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js +1 -1
  467. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +4 -11
  468. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +2 -2
  469. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +39 -34
  470. package/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js +1 -1
  471. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  472. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +5 -5
  473. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +101 -16
  474. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +113 -1
  475. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +135 -7
  476. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +117 -2
  477. package/src/renderers/shaders/ShaderChunk.js +10 -12
  478. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -9
  479. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -1
  480. package/src/renderers/shaders/ShaderLib/cube.glsl.js +1 -1
  481. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  482. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  483. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -1
  484. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +7 -2
  485. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +5 -6
  486. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +4 -5
  487. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +4 -2
  488. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +3 -3
  489. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +4 -5
  490. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +20 -14
  491. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +4 -5
  492. package/src/renderers/shaders/ShaderLib/points.glsl.js +17 -2
  493. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +6 -1
  494. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +4 -2
  495. package/src/renderers/shaders/ShaderLib.js +18 -4
  496. package/src/renderers/shaders/UniformsLib.js +27 -15
  497. package/src/renderers/shaders/UniformsUtils.js +12 -3
  498. package/src/renderers/webgl/WebGLBackground.js +23 -12
  499. package/src/renderers/webgl/WebGLBindingStates.js +13 -5
  500. package/src/renderers/webgl/WebGLCapabilities.js +1 -2
  501. package/src/renderers/webgl/WebGLClipping.js +7 -3
  502. package/src/renderers/webgl/WebGLGeometries.js +12 -0
  503. package/src/renderers/webgl/WebGLInfo.js +0 -1
  504. package/src/renderers/webgl/WebGLLights.js +2 -2
  505. package/src/renderers/webgl/WebGLMaterials.js +123 -234
  506. package/src/renderers/webgl/WebGLMorphtargets.js +1 -1
  507. package/src/renderers/webgl/WebGLObjects.js +23 -3
  508. package/src/renderers/webgl/WebGLProgram.js +154 -53
  509. package/src/renderers/webgl/WebGLPrograms.js +213 -130
  510. package/src/renderers/webgl/WebGLRenderStates.js +2 -2
  511. package/src/renderers/webgl/WebGLShadowMap.js +40 -27
  512. package/src/renderers/webgl/WebGLState.js +23 -9
  513. package/src/renderers/webgl/WebGLTextures.js +39 -19
  514. package/src/renderers/webgl/WebGLUniformsGroups.js +74 -33
  515. package/src/renderers/webgl/WebGLUtils.js +41 -29
  516. package/src/renderers/webvr/WebVRManager.js +12 -0
  517. package/src/renderers/webxr/WebXRController.js +3 -0
  518. package/src/renderers/webxr/WebXRManager.js +96 -134
  519. package/src/scenes/Scene.js +2 -18
  520. package/src/textures/CompressedTexture.js +2 -2
  521. package/src/textures/CubeTexture.js +2 -2
  522. package/src/textures/DataTexture.js +2 -2
  523. package/src/textures/DepthTexture.js +22 -0
  524. package/src/textures/FramebufferTexture.js +1 -3
  525. package/src/textures/Source.js +4 -0
  526. package/src/textures/Texture.js +42 -13
  527. package/src/utils.js +13 -1
  528. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff +0 -0
  529. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  530. package/examples/fonts/open-sans/open-sans.css +0 -9
  531. package/examples/fonts/tabler-icons/fonts/tabler-icons.eot +0 -0
  532. package/examples/fonts/tabler-icons/fonts/tabler-icons.svg +0 -3966
  533. package/examples/fonts/tabler-icons/fonts/tabler-icons.ttf +0 -0
  534. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff +0 -0
  535. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff2 +0 -0
  536. package/examples/fonts/tabler-icons/tabler-icons.min.css +0 -4
  537. package/examples/js/animation/AnimationClipCreator.js +0 -89
  538. package/examples/js/animation/CCDIKSolver.js +0 -416
  539. package/examples/js/animation/MMDAnimationHelper.js +0 -1046
  540. package/examples/js/animation/MMDPhysics.js +0 -1174
  541. package/examples/js/cameras/CinematicCamera.js +0 -168
  542. package/examples/js/controls/ArcballControls.js +0 -2770
  543. package/examples/js/controls/DragControls.js +0 -205
  544. package/examples/js/controls/FirstPersonControls.js +0 -312
  545. package/examples/js/controls/FlyControls.js +0 -321
  546. package/examples/js/controls/OrbitControls.js +0 -1101
  547. package/examples/js/controls/PointerLockControls.js +0 -144
  548. package/examples/js/controls/TrackballControls.js +0 -729
  549. package/examples/js/controls/TransformControls.js +0 -1301
  550. package/examples/js/csm/CSM.js +0 -347
  551. package/examples/js/csm/CSMFrustum.js +0 -127
  552. package/examples/js/csm/CSMHelper.js +0 -165
  553. package/examples/js/csm/CSMShader.js +0 -253
  554. package/examples/js/curves/CurveExtras.js +0 -348
  555. package/examples/js/curves/NURBSCurve.js +0 -63
  556. package/examples/js/curves/NURBSSurface.js +0 -48
  557. package/examples/js/curves/NURBSUtils.js +0 -439
  558. package/examples/js/effects/AnaglyphEffect.js +0 -86
  559. package/examples/js/effects/AsciiEffect.js +0 -260
  560. package/examples/js/effects/OutlineEffect.js +0 -450
  561. package/examples/js/effects/ParallaxBarrierEffect.js +0 -62
  562. package/examples/js/effects/PeppersGhostEffect.js +0 -139
  563. package/examples/js/effects/StereoEffect.js +0 -46
  564. package/examples/js/environments/DebugEnvironment.js +0 -53
  565. package/examples/js/environments/RoomEnvironment.js +0 -124
  566. package/examples/js/exporters/ColladaExporter.js +0 -487
  567. package/examples/js/exporters/DRACOExporter.js +0 -212
  568. package/examples/js/exporters/EXRExporter.js +0 -455
  569. package/examples/js/exporters/GLTFExporter.js +0 -2367
  570. package/examples/js/exporters/MMDExporter.js +0 -187
  571. package/examples/js/exporters/OBJExporter.js +0 -260
  572. package/examples/js/exporters/PLYExporter.js +0 -427
  573. package/examples/js/exporters/STLExporter.js +0 -188
  574. package/examples/js/exporters/USDZExporter.js +0 -608
  575. package/examples/js/geometries/BoxLineGeometry.js +0 -59
  576. package/examples/js/geometries/ConvexGeometry.js +0 -53
  577. package/examples/js/geometries/DecalGeometry.js +0 -324
  578. package/examples/js/geometries/LightningStrike.js +0 -861
  579. package/examples/js/geometries/ParametricGeometries.js +0 -216
  580. package/examples/js/geometries/ParametricGeometry.js +0 -121
  581. package/examples/js/geometries/RoundedBoxGeometry.js +0 -142
  582. package/examples/js/geometries/TeapotGeometry.js +0 -335
  583. package/examples/js/geometries/TextGeometry.js +0 -53
  584. package/examples/js/helpers/LightProbeHelper.js +0 -48
  585. package/examples/js/helpers/OctreeHelper.js +0 -76
  586. package/examples/js/helpers/PositionalAudioHelper.js +0 -91
  587. package/examples/js/helpers/RectAreaLightHelper.js +0 -73
  588. package/examples/js/helpers/VertexNormalsHelper.js +0 -74
  589. package/examples/js/helpers/VertexTangentsHelper.js +0 -68
  590. package/examples/js/helpers/ViewHelper.js +0 -281
  591. package/examples/js/interactive/HTMLMesh.js +0 -497
  592. package/examples/js/interactive/InteractiveGroup.js +0 -95
  593. package/examples/js/interactive/SelectionBox.js +0 -195
  594. package/examples/js/interactive/SelectionHelper.js +0 -83
  595. package/examples/js/libs/chevrotain.min.js +0 -3
  596. package/examples/js/libs/draco/draco_decoder.js +0 -52
  597. package/examples/js/libs/draco/draco_decoder.wasm +0 -0
  598. package/examples/js/libs/draco/draco_wasm_wrapper.js +0 -104
  599. package/examples/js/libs/draco/gltf/draco_decoder.js +0 -48
  600. package/examples/js/libs/draco/gltf/draco_decoder.wasm +0 -0
  601. package/examples/js/libs/draco/gltf/draco_wasm_wrapper.js +0 -104
  602. package/examples/js/libs/fflate.min.js +0 -7
  603. package/examples/js/libs/ktx-parse.umd.js +0 -1
  604. package/examples/js/libs/meshopt_decoder.js +0 -188
  605. package/examples/js/libs/opentype.min.js +0 -1
  606. package/examples/js/libs/stats.min.js +0 -5
  607. package/examples/js/lights/LightProbeGenerator.js +0 -221
  608. package/examples/js/lights/RectAreaLightUniformsLib.js +0 -60
  609. package/examples/js/lines/Line2.js +0 -19
  610. package/examples/js/lines/LineGeometry.js +0 -69
  611. package/examples/js/lines/LineMaterial.js +0 -635
  612. package/examples/js/lines/LineSegments2.js +0 -313
  613. package/examples/js/lines/LineSegmentsGeometry.js +0 -198
  614. package/examples/js/lines/Wireframe.js +0 -47
  615. package/examples/js/lines/WireframeGeometry2.js +0 -20
  616. package/examples/js/loaders/3DMLoader.js +0 -1273
  617. package/examples/js/loaders/3MFLoader.js +0 -1306
  618. package/examples/js/loaders/AMFLoader.js +0 -504
  619. package/examples/js/loaders/BVHLoader.js +0 -395
  620. package/examples/js/loaders/BasisTextureLoader.js +0 -706
  621. package/examples/js/loaders/ColladaLoader.js +0 -3690
  622. package/examples/js/loaders/DDSLoader.js +0 -244
  623. package/examples/js/loaders/DRACOLoader.js +0 -511
  624. package/examples/js/loaders/EXRLoader.js +0 -2039
  625. package/examples/js/loaders/FBXLoader.js +0 -3681
  626. package/examples/js/loaders/FontLoader.js +0 -160
  627. package/examples/js/loaders/GCodeLoader.js +0 -255
  628. package/examples/js/loaders/GLTFLoader.js +0 -3862
  629. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -87
  630. package/examples/js/loaders/KMZLoader.js +0 -121
  631. package/examples/js/loaders/KTXLoader.js +0 -159
  632. package/examples/js/loaders/LDrawLoader.js +0 -2263
  633. package/examples/js/loaders/LUT3dlLoader.js +0 -135
  634. package/examples/js/loaders/LUTCubeLoader.js +0 -132
  635. package/examples/js/loaders/LWOLoader.js +0 -901
  636. package/examples/js/loaders/LogLuvLoader.js +0 -715
  637. package/examples/js/loaders/LottieLoader.js +0 -62
  638. package/examples/js/loaders/MD2Loader.js +0 -248
  639. package/examples/js/loaders/MDDLoader.js +0 -91
  640. package/examples/js/loaders/MMDLoader.js +0 -1915
  641. package/examples/js/loaders/MTLLoader.js +0 -472
  642. package/examples/js/loaders/NRRDLoader.js +0 -609
  643. package/examples/js/loaders/OBJLoader.js +0 -789
  644. package/examples/js/loaders/PCDLoader.js +0 -413
  645. package/examples/js/loaders/PDBLoader.js +0 -317
  646. package/examples/js/loaders/PLYLoader.js +0 -576
  647. package/examples/js/loaders/PRWMLoader.js +0 -249
  648. package/examples/js/loaders/PVRLoader.js +0 -218
  649. package/examples/js/loaders/RGBELoader.js +0 -442
  650. package/examples/js/loaders/RGBMLoader.js +0 -1354
  651. package/examples/js/loaders/STLLoader.js +0 -364
  652. package/examples/js/loaders/SVGLoader.js +0 -2783
  653. package/examples/js/loaders/TDSLoader.js +0 -992
  654. package/examples/js/loaders/TGALoader.js +0 -484
  655. package/examples/js/loaders/TIFFLoader.js +0 -30
  656. package/examples/js/loaders/TTFLoader.js +0 -203
  657. package/examples/js/loaders/TiltLoader.js +0 -459
  658. package/examples/js/loaders/VOXLoader.js +0 -240
  659. package/examples/js/loaders/VRMLLoader.js +0 -3140
  660. package/examples/js/loaders/VTKLoader.js +0 -1078
  661. package/examples/js/loaders/XYZLoader.js +0 -89
  662. package/examples/js/loaders/lwo/IFFParser.js +0 -1067
  663. package/examples/js/loaders/lwo/LWO2Parser.js +0 -397
  664. package/examples/js/loaders/lwo/LWO3Parser.js +0 -360
  665. package/examples/js/materials/MeshGouraudMaterial.js +0 -387
  666. package/examples/js/math/Capsule.js +0 -103
  667. package/examples/js/math/ColorConverter.js +0 -33
  668. package/examples/js/math/ConvexHull.js +0 -1154
  669. package/examples/js/math/ImprovedNoise.js +0 -66
  670. package/examples/js/math/Lut.js +0 -164
  671. package/examples/js/math/MeshSurfaceSampler.js +0 -171
  672. package/examples/js/math/OBB.js +0 -382
  673. package/examples/js/math/Octree.js +0 -410
  674. package/examples/js/math/SimplexNoise.js +0 -445
  675. package/examples/js/misc/ConvexObjectBreaker.js +0 -474
  676. package/examples/js/misc/GPUComputationRenderer.js +0 -393
  677. package/examples/js/misc/Gyroscope.js +0 -56
  678. package/examples/js/misc/MD2Character.js +0 -235
  679. package/examples/js/misc/MD2CharacterComplex.js +0 -513
  680. package/examples/js/misc/MorphAnimMesh.js +0 -63
  681. package/examples/js/misc/MorphBlendMesh.js +0 -265
  682. package/examples/js/misc/ProgressiveLightMap.js +0 -335
  683. package/examples/js/misc/RollerCoaster.js +0 -430
  684. package/examples/js/misc/TubePainter.js +0 -167
  685. package/examples/js/misc/Volume.js +0 -437
  686. package/examples/js/misc/VolumeSlice.js +0 -214
  687. package/examples/js/modifiers/CurveModifier.js +0 -309
  688. package/examples/js/modifiers/EdgeSplitModifier.js +0 -228
  689. package/examples/js/modifiers/SimplifyModifier.js +0 -465
  690. package/examples/js/modifiers/TessellateModifier.js +0 -276
  691. package/examples/js/objects/GroundProjectedEnv.js +0 -181
  692. package/examples/js/objects/Lensflare.js +0 -356
  693. package/examples/js/objects/LightningStorm.js +0 -206
  694. package/examples/js/objects/MarchingCubes.js +0 -759
  695. package/examples/js/objects/Reflector.js +0 -216
  696. package/examples/js/objects/ReflectorForSSRPass.js +0 -315
  697. package/examples/js/objects/Refractor.js +0 -283
  698. package/examples/js/objects/ShadowMesh.js +0 -59
  699. package/examples/js/objects/Sky.js +0 -218
  700. package/examples/js/objects/Water.js +0 -292
  701. package/examples/js/objects/Water2.js +0 -307
  702. package/examples/js/physics/AmmoPhysics.js +0 -259
  703. package/examples/js/physics/OimoPhysics.js +0 -217
  704. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +0 -335
  705. package/examples/js/postprocessing/AfterimagePass.js +0 -77
  706. package/examples/js/postprocessing/BloomPass.js +0 -135
  707. package/examples/js/postprocessing/BokehPass.js +0 -120
  708. package/examples/js/postprocessing/ClearPass.js +0 -39
  709. package/examples/js/postprocessing/CubeTexturePass.js +0 -60
  710. package/examples/js/postprocessing/DotScreenPass.js +0 -51
  711. package/examples/js/postprocessing/EffectComposer.js +0 -272
  712. package/examples/js/postprocessing/FilmPass.js +0 -52
  713. package/examples/js/postprocessing/GlitchPass.js +0 -104
  714. package/examples/js/postprocessing/HalftonePass.js +0 -75
  715. package/examples/js/postprocessing/LUTPass.js +0 -171
  716. package/examples/js/postprocessing/MaskPass.js +0 -95
  717. package/examples/js/postprocessing/OutlinePass.js +0 -598
  718. package/examples/js/postprocessing/Pass.js +0 -72
  719. package/examples/js/postprocessing/RenderPass.js +0 -70
  720. package/examples/js/postprocessing/RenderPixelatedPass.js +0 -215
  721. package/examples/js/postprocessing/SAOPass.js +0 -374
  722. package/examples/js/postprocessing/SMAAPass.js +0 -170
  723. package/examples/js/postprocessing/SSAARenderPass.js +0 -156
  724. package/examples/js/postprocessing/SSAOPass.js +0 -365
  725. package/examples/js/postprocessing/SSRPass.js +0 -567
  726. package/examples/js/postprocessing/SavePass.js +0 -59
  727. package/examples/js/postprocessing/ShaderPass.js +0 -64
  728. package/examples/js/postprocessing/TAARenderPass.js +0 -130
  729. package/examples/js/postprocessing/TexturePass.js +0 -49
  730. package/examples/js/postprocessing/UnrealBloomPass.js +0 -375
  731. package/examples/js/renderers/CSS2DRenderer.js +0 -178
  732. package/examples/js/renderers/CSS3DRenderer.js +0 -237
  733. package/examples/js/renderers/Projector.js +0 -818
  734. package/examples/js/renderers/SVGRenderer.js +0 -491
  735. package/examples/js/shaders/ACESFilmicToneMappingShader.js +0 -89
  736. package/examples/js/shaders/AfterimageShader.js +0 -60
  737. package/examples/js/shaders/BasicShader.js +0 -27
  738. package/examples/js/shaders/BleachBypassShader.js +0 -62
  739. package/examples/js/shaders/BlendShader.js +0 -54
  740. package/examples/js/shaders/BokehShader.js +0 -156
  741. package/examples/js/shaders/BokehShader2.js +0 -419
  742. package/examples/js/shaders/BrightnessContrastShader.js +0 -58
  743. package/examples/js/shaders/ColorCorrectionShader.js +0 -52
  744. package/examples/js/shaders/ColorifyShader.js +0 -47
  745. package/examples/js/shaders/ConvolutionShader.js +0 -92
  746. package/examples/js/shaders/CopyShader.js +0 -45
  747. package/examples/js/shaders/DOFMipMapShader.js +0 -60
  748. package/examples/js/shaders/DepthLimitedBlurShader.js +0 -173
  749. package/examples/js/shaders/DigitalGlitch.js +0 -127
  750. package/examples/js/shaders/DotScreenShader.js +0 -72
  751. package/examples/js/shaders/FXAAShader.js +0 -284
  752. package/examples/js/shaders/FilmShader.js +0 -110
  753. package/examples/js/shaders/FocusShader.js +0 -95
  754. package/examples/js/shaders/FreiChenShader.js +0 -93
  755. package/examples/js/shaders/GammaCorrectionShader.js +0 -41
  756. package/examples/js/shaders/GodRaysShader.js +0 -284
  757. package/examples/js/shaders/HalftoneShader.js +0 -336
  758. package/examples/js/shaders/HorizontalBlurShader.js +0 -59
  759. package/examples/js/shaders/HorizontalTiltShiftShader.js +0 -65
  760. package/examples/js/shaders/HueSaturationShader.js +0 -69
  761. package/examples/js/shaders/KaleidoShader.js +0 -60
  762. package/examples/js/shaders/LuminosityHighPassShader.js +0 -67
  763. package/examples/js/shaders/LuminosityShader.js +0 -46
  764. package/examples/js/shaders/MMDToonShader.js +0 -94
  765. package/examples/js/shaders/MirrorShader.js +0 -56
  766. package/examples/js/shaders/NormalMapShader.js +0 -55
  767. package/examples/js/shaders/RGBShiftShader.js +0 -56
  768. package/examples/js/shaders/SAOShader.js +0 -209
  769. package/examples/js/shaders/SMAAShader.js +0 -454
  770. package/examples/js/shaders/SSAOShader.js +0 -295
  771. package/examples/js/shaders/SSRShader.js +0 -381
  772. package/examples/js/shaders/SepiaShader.js +0 -52
  773. package/examples/js/shaders/SobelOperatorShader.js +0 -88
  774. package/examples/js/shaders/SubsurfaceScatteringShader.js +0 -49
  775. package/examples/js/shaders/TechnicolorShader.js +0 -43
  776. package/examples/js/shaders/ToneMapShader.js +0 -84
  777. package/examples/js/shaders/ToonShader.js +0 -335
  778. package/examples/js/shaders/TriangleBlurShader.js +0 -70
  779. package/examples/js/shaders/UnpackDepthRGBAShader.js +0 -47
  780. package/examples/js/shaders/VelocityShader.js +0 -126
  781. package/examples/js/shaders/VerticalBlurShader.js +0 -59
  782. package/examples/js/shaders/VerticalTiltShiftShader.js +0 -65
  783. package/examples/js/shaders/VignetteShader.js +0 -53
  784. package/examples/js/shaders/VolumeShader.js +0 -296
  785. package/examples/js/shaders/WaterRefractionShader.js +0 -84
  786. package/examples/js/textures/FlakesTexture.js +0 -40
  787. package/examples/js/utils/BufferGeometryUtils.js +0 -1160
  788. package/examples/js/utils/CameraUtils.js +0 -71
  789. package/examples/js/utils/GPUStatsPanel.js +0 -125
  790. package/examples/js/utils/GeometryCompressionUtils.js +0 -549
  791. package/examples/js/utils/GeometryUtils.js +0 -168
  792. package/examples/js/utils/LDrawUtils.js +0 -179
  793. package/examples/js/utils/PackedPhongMaterial.js +0 -109
  794. package/examples/js/utils/SceneUtils.js +0 -214
  795. package/examples/js/utils/ShadowMapViewer.js +0 -183
  796. package/examples/js/utils/SkeletonUtils.js +0 -493
  797. package/examples/js/utils/UVsDebug.js +0 -143
  798. package/examples/js/utils/WorkerPool.js +0 -105
  799. package/examples/jsm/exporters/ColladaExporter.js +0 -713
  800. package/examples/jsm/geometries/LightningStrike.js +0 -1017
  801. package/examples/jsm/libs/OimoPhysics/OimoPhysics.js +0 -37071
  802. package/examples/jsm/libs/OimoPhysics/index.js +0 -43
  803. package/examples/jsm/libs/flow.module.js +0 -4552
  804. package/examples/jsm/libs/tween.module.min.js +0 -3
  805. package/examples/jsm/loaders/BasisTextureLoader.js +0 -790
  806. package/examples/jsm/loaders/IFCLoader.js +0 -2431
  807. package/examples/jsm/loaders/PRWMLoader.js +0 -299
  808. package/examples/jsm/loaders/ifc/web-ifc-api.js +0 -47504
  809. package/examples/jsm/loaders/ifc/web-ifc.wasm +0 -0
  810. package/examples/jsm/node-editor/NodeEditor.js +0 -857
  811. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +0 -14
  812. package/examples/jsm/node-editor/accessors/NormalEditor.js +0 -30
  813. package/examples/jsm/node-editor/accessors/PositionEditor.js +0 -30
  814. package/examples/jsm/node-editor/accessors/UVEditor.js +0 -25
  815. package/examples/jsm/node-editor/core/BaseNode.js +0 -96
  816. package/examples/jsm/node-editor/core/DataFile.js +0 -59
  817. package/examples/jsm/node-editor/core/FileEditor.js +0 -20
  818. package/examples/jsm/node-editor/core/FileURLEditor.js +0 -29
  819. package/examples/jsm/node-editor/display/BlendEditor.js +0 -44
  820. package/examples/jsm/node-editor/display/NormalMapEditor.js +0 -49
  821. package/examples/jsm/node-editor/examples/animate-uv.json +0 -1
  822. package/examples/jsm/node-editor/examples/fake-top-light.json +0 -1
  823. package/examples/jsm/node-editor/examples/matcap.json +0 -1
  824. package/examples/jsm/node-editor/examples/oscillator-color.json +0 -1
  825. package/examples/jsm/node-editor/examples/rim.json +0 -1
  826. package/examples/jsm/node-editor/inputs/ColorEditor.js +0 -96
  827. package/examples/jsm/node-editor/inputs/FloatEditor.js +0 -23
  828. package/examples/jsm/node-editor/inputs/SliderEditor.js +0 -67
  829. package/examples/jsm/node-editor/inputs/TextureEditor.js +0 -155
  830. package/examples/jsm/node-editor/inputs/Vector2Editor.js +0 -28
  831. package/examples/jsm/node-editor/inputs/Vector3Editor.js +0 -30
  832. package/examples/jsm/node-editor/inputs/Vector4Editor.js +0 -37
  833. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +0 -84
  834. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +0 -102
  835. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +0 -118
  836. package/examples/jsm/node-editor/math/AngleEditor.js +0 -40
  837. package/examples/jsm/node-editor/math/DotEditor.js +0 -35
  838. package/examples/jsm/node-editor/math/InvertEditor.js +0 -39
  839. package/examples/jsm/node-editor/math/LimiterEditor.js +0 -62
  840. package/examples/jsm/node-editor/math/NormalizeEditor.js +0 -28
  841. package/examples/jsm/node-editor/math/OperatorEditor.js +0 -63
  842. package/examples/jsm/node-editor/math/PowerEditor.js +0 -44
  843. package/examples/jsm/node-editor/math/TrigonometryEditor.js +0 -45
  844. package/examples/jsm/node-editor/procedural/CheckerEditor.js +0 -27
  845. package/examples/jsm/node-editor/scene/MeshEditor.js +0 -102
  846. package/examples/jsm/node-editor/scene/Object3DEditor.js +0 -160
  847. package/examples/jsm/node-editor/scene/PointsEditor.js +0 -99
  848. package/examples/jsm/node-editor/utils/JoinEditor.js +0 -58
  849. package/examples/jsm/node-editor/utils/OscillatorEditor.js +0 -43
  850. package/examples/jsm/node-editor/utils/PreviewEditor.js +0 -170
  851. package/examples/jsm/node-editor/utils/SplitEditor.js +0 -39
  852. package/examples/jsm/node-editor/utils/TimerEditor.js +0 -58
  853. package/examples/jsm/nodes/core/CodeNode.js +0 -50
  854. package/examples/jsm/nodes/core/ExpressionNode.js +0 -32
  855. package/examples/jsm/nodes/core/InstanceIndexNode.js +0 -21
  856. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +0 -22
  857. package/examples/jsm/nodes/lighting/PunctualLightNode.js +0 -68
  858. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +0 -301
  859. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +0 -149
  860. package/examples/jsm/objects/GroundProjectedEnv.js +0 -186
  861. package/examples/jsm/objects/LightningStorm.js +0 -245
  862. package/examples/jsm/physics/OimoPhysics.js +0 -231
  863. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +0 -369
  864. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +0 -187
  865. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +0 -173
  866. package/examples/jsm/renderers/webgpu/WebGPUBinding.js +0 -22
  867. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +0 -255
  868. package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +0 -43
  869. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +0 -78
  870. package/examples/jsm/renderers/webgpu/WebGPUGeometries.js +0 -82
  871. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +0 -36
  872. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +0 -22
  873. package/examples/jsm/renderers/webgpu/WebGPUProperties.js +0 -38
  874. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +0 -296
  875. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +0 -66
  876. package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +0 -73
  877. package/examples/jsm/renderers/webgpu/WebGPUSampler.js +0 -29
  878. package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +0 -20
  879. package/examples/jsm/renderers/webgpu/WebGPUTextureRenderer.js +0 -40
  880. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +0 -794
  881. package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +0 -18
  882. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +0 -81
  883. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +0 -83
  884. package/examples/jsm/shaders/ToneMapShader.js +0 -73
  885. package/src/renderers/shaders/ShaderChunk/uv2_pars_fragment.glsl.js +0 -7
  886. package/src/renderers/shaders/ShaderChunk/uv2_pars_vertex.glsl.js +0 -10
  887. package/src/renderers/shaders/ShaderChunk/uv2_vertex.glsl.js +0 -7
  888. /package/examples/{js → jsm}/libs/ammo.wasm.js +0 -0
  889. /package/examples/{js → jsm}/libs/ammo.wasm.wasm +0 -0
  890. /package/examples/{js → jsm}/libs/basis/basis_transcoder.js +0 -0
  891. /package/examples/{js → jsm}/libs/basis/basis_transcoder.wasm +0 -0
  892. /package/examples/{js → jsm}/libs/draco/README.md +0 -0
  893. /package/examples/{js → jsm}/libs/draco/draco_encoder.js +0 -0
  894. /package/examples/{js → jsm}/libs/draco/gltf/draco_encoder.js +0 -0
  895. /package/src/renderers/shaders/ShaderChunk/{encodings_fragment.glsl.js → colorspace_fragment.glsl.js} +0 -0
  896. /package/src/renderers/shaders/ShaderChunk/{encodings_pars_fragment.glsl.js → colorspace_pars_fragment.glsl.js} +0 -0
@@ -1,22 +1,35 @@
1
1
  import {
2
2
  REVISION,
3
3
  BackSide,
4
- DoubleSide,
5
4
  FrontSide,
5
+ DoubleSide,
6
6
  RGBAFormat,
7
7
  HalfFloatType,
8
8
  FloatType,
9
9
  UnsignedByteType,
10
- LinearEncoding,
11
10
  NoToneMapping,
12
- LinearMipmapLinearFilter
11
+ LinearMipmapLinearFilter,
12
+ SRGBColorSpace,
13
+ LinearSRGBColorSpace,
14
+ sRGBEncoding,
15
+ LinearEncoding,
16
+ RGBAIntegerFormat,
17
+ RGIntegerFormat,
18
+ RedIntegerFormat,
19
+ UnsignedIntType,
20
+ UnsignedShortType,
21
+ UnsignedInt248Type,
22
+ UnsignedShort4444Type,
23
+ UnsignedShort5551Type,
24
+ WebGLCoordinateSystem
13
25
  } from '../constants.js';
14
- import { floorPowerOfTwo } from '../math/MathUtils.js';
26
+ import { Color } from '../math/Color.js';
15
27
  import { Frustum } from '../math/Frustum.js';
16
28
  import { Matrix4 } from '../math/Matrix4.js';
17
29
  import { Vector2 } from '../math/Vector2.js';
18
30
  import { Vector3 } from '../math/Vector3.js';
19
31
  import { Vector4 } from '../math/Vector4.js';
32
+ import { floorPowerOfTwo } from '../math/MathUtils.js';
20
33
  import { WebGLAnimation } from './webgl/WebGLAnimation.js';
21
34
  import { WebGLAttributes } from './webgl/WebGLAttributes.js';
22
35
  import { WebGLBackground } from './webgl/WebGLBackground.js';
@@ -56,1138 +69,1222 @@ function createCanvasElement() {
56
69
 
57
70
  }
58
71
 
59
- function WebGLRenderer( parameters = {} ) {
72
+ class WebGLRenderer {
60
73
 
61
- this.isWebGLRenderer = true;
74
+ constructor( parameters = {} ) {
62
75
 
63
- const _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),
64
- _context = parameters.context !== undefined ? parameters.context : null,
76
+ const {
77
+ canvas = createCanvasElement(),
78
+ context = null,
79
+ depth = true,
80
+ stencil = true,
81
+ alpha = false,
82
+ antialias = false,
83
+ premultipliedAlpha = true,
84
+ preserveDrawingBuffer = false,
85
+ powerPreference = 'default',
86
+ failIfMajorPerformanceCaveat = false,
87
+ } = parameters;
65
88
 
66
- _depth = parameters.depth !== undefined ? parameters.depth : true,
67
- _stencil = parameters.stencil !== undefined ? parameters.stencil : true,
68
- _antialias = parameters.antialias !== undefined ? parameters.antialias : false,
69
- _premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
70
- _preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
71
- _powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',
72
- _failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;
89
+ this.isWebGLRenderer = true;
73
90
 
74
- let _alpha;
91
+ let _alpha;
75
92
 
76
- if ( _context !== null ) {
93
+ if ( context !== null ) {
77
94
 
78
- _alpha = _context.getContextAttributes().alpha;
95
+ _alpha = context.getContextAttributes().alpha;
79
96
 
80
- } else {
97
+ } else {
81
98
 
82
- _alpha = parameters.alpha !== undefined ? parameters.alpha : false;
99
+ _alpha = alpha;
83
100
 
84
- }
101
+ }
85
102
 
86
- let currentRenderList = null;
87
- let currentRenderState = null;
103
+ const uintClearColor = new Uint32Array( 4 );
104
+ const intClearColor = new Int32Array( 4 );
88
105
 
89
- // render() can be called from within a callback triggered by another render.
90
- // We track this so that the nested render call gets its list and state isolated from the parent render call.
106
+ let currentRenderList = null;
107
+ let currentRenderState = null;
91
108
 
92
- const renderListStack = [];
93
- const renderStateStack = [];
109
+ // render() can be called from within a callback triggered by another render.
110
+ // We track this so that the nested render call gets its list and state isolated from the parent render call.
94
111
 
95
- // public properties
112
+ const renderListStack = [];
113
+ const renderStateStack = [];
96
114
 
97
- this.domElement = _canvas;
115
+ // public properties
98
116
 
99
- // Debug configuration container
100
- this.debug = {
117
+ this.domElement = canvas;
101
118
 
102
- /**
103
- * Enables error checking and reporting when shader programs are being compiled
104
- * @type {boolean}
105
- */
106
- checkShaderErrors: true
107
- };
119
+ // Debug configuration container
120
+ this.debug = {
108
121
 
109
- // clearing
122
+ /**
123
+ * Enables error checking and reporting when shader programs are being compiled
124
+ * @type {boolean}
125
+ */
126
+ checkShaderErrors: true,
127
+ /**
128
+ * Callback for custom error reporting.
129
+ * @type {?Function}
130
+ */
131
+ onShaderError: null
132
+ };
110
133
 
111
- this.autoClear = true;
112
- this.autoClearColor = true;
113
- this.autoClearDepth = true;
114
- this.autoClearStencil = true;
134
+ // clearing
115
135
 
116
- // scene graph
136
+ this.autoClear = true;
137
+ this.autoClearColor = true;
138
+ this.autoClearDepth = true;
139
+ this.autoClearStencil = true;
117
140
 
118
- this.sortObjects = true;
141
+ // scene graph
119
142
 
120
- // user-defined clipping
143
+ this.sortObjects = true;
121
144
 
122
- this.clippingPlanes = [];
123
- this.localClippingEnabled = false;
145
+ // user-defined clipping
124
146
 
125
- // physically based shading
147
+ this.clippingPlanes = [];
148
+ this.localClippingEnabled = false;
126
149
 
127
- this.outputEncoding = LinearEncoding;
150
+ // physically based shading
128
151
 
129
- // physical lights
152
+ this.outputColorSpace = SRGBColorSpace;
130
153
 
131
- this.physicallyCorrectLights = false;
154
+ // physical lights
132
155
 
133
- // tone mapping
156
+ this.useLegacyLights = true;
134
157
 
135
- this.toneMapping = NoToneMapping;
136
- this.toneMappingExposure = 1.0;
158
+ // tone mapping
137
159
 
138
- // internal properties
160
+ this.toneMapping = NoToneMapping;
161
+ this.toneMappingExposure = 1.0;
139
162
 
140
- const _this = this;
163
+ // internal properties
141
164
 
142
- let _isContextLost = false;
165
+ const _this = this;
143
166
 
144
- // internal state cache
167
+ let _isContextLost = false;
145
168
 
146
- let _currentActiveCubeFace = 0;
147
- let _currentActiveMipmapLevel = 0;
148
- let _currentRenderTarget = null;
149
- let _currentMaterialId = - 1;
169
+ // internal state cache
150
170
 
151
- let _currentCamera = null;
171
+ let _currentActiveCubeFace = 0;
172
+ let _currentActiveMipmapLevel = 0;
173
+ let _currentRenderTarget = null;
174
+ let _currentMaterialId = - 1;
152
175
 
153
- const _currentViewport = new Vector4();
154
- const _currentScissor = new Vector4();
155
- let _currentScissorTest = null;
176
+ let _currentCamera = null;
156
177
 
157
- //
178
+ const _currentViewport = new Vector4();
179
+ const _currentScissor = new Vector4();
180
+ let _currentScissorTest = null;
158
181
 
159
- let _width = _canvas.width;
160
- let _height = _canvas.height;
182
+ const _currentClearColor = new Color( 0x000000 );
183
+ let _currentClearAlpha = 0;
161
184
 
162
- let _pixelRatio = 1;
163
- let _opaqueSort = null;
164
- let _transparentSort = null;
185
+ //
165
186
 
166
- const _viewport = new Vector4( 0, 0, _width, _height );
167
- const _scissor = new Vector4( 0, 0, _width, _height );
168
- let _scissorTest = false;
187
+ let _width = canvas.width;
188
+ let _height = canvas.height;
169
189
 
170
- // frustum
190
+ let _pixelRatio = 1;
191
+ let _opaqueSort = null;
192
+ let _transparentSort = null;
171
193
 
172
- const _frustum = new Frustum();
194
+ const _viewport = new Vector4( 0, 0, _width, _height );
195
+ const _scissor = new Vector4( 0, 0, _width, _height );
196
+ let _scissorTest = false;
173
197
 
174
- // clipping
198
+ // frustum
175
199
 
176
- let _clippingEnabled = false;
177
- let _localClippingEnabled = false;
200
+ const _frustum = new Frustum();
178
201
 
179
- // transmission
202
+ // clipping
180
203
 
181
- let _transmissionRenderTarget = null;
204
+ let _clippingEnabled = false;
205
+ let _localClippingEnabled = false;
182
206
 
183
- // camera matrices cache
207
+ // transmission
184
208
 
185
- const _projScreenMatrix = new Matrix4();
209
+ let _transmissionRenderTarget = null;
186
210
 
187
- const _vector2 = new Vector2();
188
- const _vector3 = new Vector3();
211
+ // camera matrices cache
189
212
 
190
- const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };
213
+ const _projScreenMatrix = new Matrix4();
191
214
 
192
- function getTargetPixelRatio() {
215
+ const _vector2 = new Vector2();
216
+ const _vector3 = new Vector3();
193
217
 
194
- return _currentRenderTarget === null ? _pixelRatio : 1;
218
+ const _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };
195
219
 
196
- }
220
+ function getTargetPixelRatio() {
197
221
 
198
- // initialize
222
+ return _currentRenderTarget === null ? _pixelRatio : 1;
199
223
 
200
- let _gl = _context;
224
+ }
201
225
 
202
- function getContext( contextNames, contextAttributes ) {
226
+ // initialize
203
227
 
204
- for ( let i = 0; i < contextNames.length; i ++ ) {
228
+ let _gl = context;
205
229
 
206
- const contextName = contextNames[ i ];
207
- const context = _canvas.getContext( contextName, contextAttributes );
208
- if ( context !== null ) return context;
230
+ function getContext( contextNames, contextAttributes ) {
209
231
 
210
- }
232
+ for ( let i = 0; i < contextNames.length; i ++ ) {
211
233
 
212
- return null;
234
+ const contextName = contextNames[ i ];
235
+ const context = canvas.getContext( contextName, contextAttributes );
236
+ if ( context !== null ) return context;
213
237
 
214
- }
238
+ }
215
239
 
216
- try {
217
-
218
- const contextAttributes = {
219
- alpha: true,
220
- depth: _depth,
221
- stencil: _stencil,
222
- antialias: _antialias,
223
- premultipliedAlpha: _premultipliedAlpha,
224
- preserveDrawingBuffer: _preserveDrawingBuffer,
225
- powerPreference: _powerPreference,
226
- failIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat
227
- };
240
+ return null;
228
241
 
229
- // OffscreenCanvas does not have setAttribute, see #22811
230
- if ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );
242
+ }
231
243
 
232
- // event listeners must be registered before WebGL context is created, see #12753
233
- _canvas.addEventListener( 'webglcontextlost', onContextLost, false );
234
- _canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
235
- _canvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );
244
+ try {
245
+
246
+ const contextAttributes = {
247
+ alpha: true,
248
+ depth,
249
+ stencil,
250
+ antialias,
251
+ premultipliedAlpha,
252
+ preserveDrawingBuffer,
253
+ powerPreference,
254
+ failIfMajorPerformanceCaveat,
255
+ };
236
256
 
237
- if ( _gl === null ) {
257
+ // OffscreenCanvas does not have setAttribute, see #22811
258
+ if ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );
238
259
 
239
- const contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];
260
+ // event listeners must be registered before WebGL context is created, see #12753
261
+ canvas.addEventListener( 'webglcontextlost', onContextLost, false );
262
+ canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
263
+ canvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );
240
264
 
241
- if ( _this.isWebGL1Renderer === true ) {
265
+ if ( _gl === null ) {
242
266
 
243
- contextNames.shift();
267
+ const contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];
244
268
 
245
- }
269
+ if ( _this.isWebGL1Renderer === true ) {
246
270
 
247
- _gl = getContext( contextNames, contextAttributes );
271
+ contextNames.shift();
248
272
 
249
- if ( _gl === null ) {
273
+ }
250
274
 
251
- if ( getContext( contextNames ) ) {
275
+ _gl = getContext( contextNames, contextAttributes );
252
276
 
253
- throw new Error( 'Error creating WebGL context with your selected attributes.' );
277
+ if ( _gl === null ) {
254
278
 
255
- } else {
279
+ if ( getContext( contextNames ) ) {
280
+
281
+ throw new Error( 'Error creating WebGL context with your selected attributes.' );
282
+
283
+ } else {
256
284
 
257
- throw new Error( 'Error creating WebGL context.' );
285
+ throw new Error( 'Error creating WebGL context.' );
286
+
287
+ }
258
288
 
259
289
  }
260
290
 
261
291
  }
262
292
 
263
- }
293
+ if ( typeof WebGLRenderingContext !== 'undefined' && _gl instanceof WebGLRenderingContext ) { // @deprecated, r153
264
294
 
265
- // Some experimental-webgl implementations do not have getShaderPrecisionFormat
295
+ console.warn( 'THREE.WebGLRenderer: WebGL 1 support was deprecated in r153 and will be removed in r163.' );
266
296
 
267
- if ( _gl.getShaderPrecisionFormat === undefined ) {
297
+ }
268
298
 
269
- _gl.getShaderPrecisionFormat = function () {
299
+ // Some experimental-webgl implementations do not have getShaderPrecisionFormat
270
300
 
271
- return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };
301
+ if ( _gl.getShaderPrecisionFormat === undefined ) {
272
302
 
273
- };
303
+ _gl.getShaderPrecisionFormat = function () {
304
+
305
+ return { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };
306
+
307
+ };
308
+
309
+ }
310
+
311
+ } catch ( error ) {
312
+
313
+ console.error( 'THREE.WebGLRenderer: ' + error.message );
314
+ throw error;
274
315
 
275
316
  }
276
317
 
277
- } catch ( error ) {
318
+ let extensions, capabilities, state, info;
319
+ let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;
320
+ let programCache, materials, renderLists, renderStates, clipping, shadowMap;
278
321
 
279
- console.error( 'THREE.WebGLRenderer: ' + error.message );
280
- throw error;
322
+ let background, morphtargets, bufferRenderer, indexedBufferRenderer;
281
323
 
282
- }
324
+ let utils, bindingStates, uniformsGroups;
283
325
 
284
- let extensions, capabilities, state, info;
285
- let properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;
286
- let programCache, materials, renderLists, renderStates, clipping, shadowMap;
326
+ function initGLContext() {
287
327
 
288
- let background, morphtargets, bufferRenderer, indexedBufferRenderer;
328
+ extensions = new WebGLExtensions( _gl );
289
329
 
290
- let utils, bindingStates, uniformsGroups;
330
+ capabilities = new WebGLCapabilities( _gl, extensions, parameters );
291
331
 
292
- function initGLContext() {
332
+ extensions.init( capabilities );
293
333
 
294
- extensions = new WebGLExtensions( _gl );
334
+ utils = new WebGLUtils( _gl, extensions, capabilities );
295
335
 
296
- capabilities = new WebGLCapabilities( _gl, extensions, parameters );
336
+ state = new WebGLState( _gl, extensions, capabilities );
297
337
 
298
- extensions.init( capabilities );
338
+ info = new WebGLInfo( _gl );
339
+ properties = new WebGLProperties();
340
+ textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );
341
+ cubemaps = new WebGLCubeMaps( _this );
342
+ cubeuvmaps = new WebGLCubeUVMaps( _this );
343
+ attributes = new WebGLAttributes( _gl, capabilities );
344
+ bindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );
345
+ geometries = new WebGLGeometries( _gl, attributes, info, bindingStates );
346
+ objects = new WebGLObjects( _gl, geometries, attributes, info );
347
+ morphtargets = new WebGLMorphtargets( _gl, capabilities, textures );
348
+ clipping = new WebGLClipping( properties );
349
+ programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );
350
+ materials = new WebGLMaterials( _this, properties );
351
+ renderLists = new WebGLRenderLists();
352
+ renderStates = new WebGLRenderStates( extensions, capabilities );
353
+ background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );
354
+ shadowMap = new WebGLShadowMap( _this, objects, capabilities );
355
+ uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );
299
356
 
300
- utils = new WebGLUtils( _gl, extensions, capabilities );
357
+ bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );
358
+ indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );
301
359
 
302
- state = new WebGLState( _gl, extensions, capabilities );
360
+ info.programs = programCache.programs;
303
361
 
304
- info = new WebGLInfo( _gl );
305
- properties = new WebGLProperties();
306
- textures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );
307
- cubemaps = new WebGLCubeMaps( _this );
308
- cubeuvmaps = new WebGLCubeUVMaps( _this );
309
- attributes = new WebGLAttributes( _gl, capabilities );
310
- bindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );
311
- geometries = new WebGLGeometries( _gl, attributes, info, bindingStates );
312
- objects = new WebGLObjects( _gl, geometries, attributes, info );
313
- morphtargets = new WebGLMorphtargets( _gl, capabilities, textures );
314
- clipping = new WebGLClipping( properties );
315
- programCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );
316
- materials = new WebGLMaterials( _this, properties );
317
- renderLists = new WebGLRenderLists();
318
- renderStates = new WebGLRenderStates( extensions, capabilities );
319
- background = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, _premultipliedAlpha );
320
- shadowMap = new WebGLShadowMap( _this, objects, capabilities );
321
- uniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );
362
+ _this.capabilities = capabilities;
363
+ _this.extensions = extensions;
364
+ _this.properties = properties;
365
+ _this.renderLists = renderLists;
366
+ _this.shadowMap = shadowMap;
367
+ _this.state = state;
368
+ _this.info = info;
322
369
 
323
- bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );
324
- indexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );
370
+ }
325
371
 
326
- info.programs = programCache.programs;
372
+ initGLContext();
327
373
 
328
- _this.capabilities = capabilities;
329
- _this.extensions = extensions;
330
- _this.properties = properties;
331
- _this.renderLists = renderLists;
332
- _this.shadowMap = shadowMap;
333
- _this.state = state;
334
- _this.info = info;
374
+ // xr
335
375
 
336
- }
376
+ const xr = ( typeof navigator !== 'undefined' && 'xr' in navigator ) ? new WebXRManager( _this, _gl ) : new WebVRManager( _this );
337
377
 
338
- initGLContext();
378
+ this.xr = xr;
339
379
 
340
- const xr = ( typeof navigator !== 'undefined' && 'xr' in navigator ) ? new WebXRManager( _this, _gl ) : new WebVRManager( _this );
380
+ // API
341
381
 
342
- this.xr = xr;
382
+ this.getContext = function () {
343
383
 
344
- // API
384
+ return _gl;
345
385
 
346
- this.getContext = function () {
386
+ };
347
387
 
348
- return _gl;
388
+ this.getContextAttributes = function () {
349
389
 
350
- };
390
+ return _gl.getContextAttributes();
351
391
 
352
- this.getContextAttributes = function () {
392
+ };
353
393
 
354
- return _gl.getContextAttributes();
394
+ this.forceContextLoss = function () {
355
395
 
356
- };
396
+ const extension = extensions.get( 'WEBGL_lose_context' );
397
+ if ( extension ) extension.loseContext();
357
398
 
358
- this.forceContextLoss = function () {
399
+ };
359
400
 
360
- const extension = extensions.get( 'WEBGL_lose_context' );
361
- if ( extension ) extension.loseContext();
401
+ this.forceContextRestore = function () {
362
402
 
363
- };
403
+ const extension = extensions.get( 'WEBGL_lose_context' );
404
+ if ( extension ) extension.restoreContext();
364
405
 
365
- this.forceContextRestore = function () {
406
+ };
366
407
 
367
- const extension = extensions.get( 'WEBGL_lose_context' );
368
- if ( extension ) extension.restoreContext();
408
+ this.getPixelRatio = function () {
369
409
 
370
- };
410
+ return _pixelRatio;
371
411
 
372
- this.getPixelRatio = function () {
412
+ };
373
413
 
374
- return _pixelRatio;
414
+ this.setPixelRatio = function ( value ) {
375
415
 
376
- };
416
+ if ( value === undefined ) return;
377
417
 
378
- this.setPixelRatio = function ( value ) {
418
+ _pixelRatio = value;
379
419
 
380
- if ( value === undefined ) return;
420
+ this.setSize( _width, _height, false );
381
421
 
382
- _pixelRatio = value;
422
+ };
383
423
 
384
- this.setSize( _width, _height, false );
424
+ this.getSize = function ( target ) {
385
425
 
386
- };
426
+ return target.set( _width, _height );
387
427
 
388
- this.getSize = function ( target ) {
428
+ };
389
429
 
390
- return target.set( _width, _height );
430
+ this.setSize = function ( width, height, updateStyle = true ) {
391
431
 
392
- };
432
+ if ( xr.isPresenting ) {
393
433
 
394
- this.setSize = function ( width, height, updateStyle ) {
434
+ console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' );
435
+ return;
395
436
 
396
- if ( xr.isPresenting ) {
437
+ }
397
438
 
398
- console.warn( 'THREE.WebGLRenderer: Can\'t change size while VR device is presenting.' );
399
- return;
439
+ _width = width;
440
+ _height = height;
400
441
 
401
- }
442
+ canvas.width = Math.floor( width * _pixelRatio );
443
+ canvas.height = Math.floor( height * _pixelRatio );
402
444
 
403
- _width = width;
404
- _height = height;
445
+ if ( updateStyle === true ) {
405
446
 
406
- _canvas.width = Math.floor( width * _pixelRatio );
407
- _canvas.height = Math.floor( height * _pixelRatio );
447
+ canvas.style.width = width + 'px';
448
+ canvas.style.height = height + 'px';
408
449
 
409
- if ( updateStyle !== false ) {
450
+ }
410
451
 
411
- _canvas.style.width = width + 'px';
412
- _canvas.style.height = height + 'px';
452
+ this.setViewport( 0, 0, width, height );
413
453
 
414
- }
454
+ };
415
455
 
416
- this.setViewport( 0, 0, width, height );
456
+ this.getDrawingBufferSize = function ( target ) {
417
457
 
418
- };
458
+ return target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();
419
459
 
420
- this.getDrawingBufferSize = function ( target ) {
460
+ };
421
461
 
422
- return target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();
462
+ this.setDrawingBufferSize = function ( width, height, pixelRatio ) {
423
463
 
424
- };
464
+ _width = width;
465
+ _height = height;
425
466
 
426
- this.setDrawingBufferSize = function ( width, height, pixelRatio ) {
467
+ _pixelRatio = pixelRatio;
427
468
 
428
- _width = width;
429
- _height = height;
469
+ canvas.width = Math.floor( width * pixelRatio );
470
+ canvas.height = Math.floor( height * pixelRatio );
430
471
 
431
- _pixelRatio = pixelRatio;
472
+ this.setViewport( 0, 0, width, height );
432
473
 
433
- _canvas.width = Math.floor( width * pixelRatio );
434
- _canvas.height = Math.floor( height * pixelRatio );
474
+ };
435
475
 
436
- this.setViewport( 0, 0, width, height );
476
+ this.getCurrentViewport = function ( target ) {
437
477
 
438
- };
478
+ return target.copy( _currentViewport );
439
479
 
440
- this.getCurrentViewport = function ( target ) {
480
+ };
441
481
 
442
- return target.copy( _currentViewport );
482
+ this.getViewport = function ( target ) {
443
483
 
444
- };
484
+ return target.copy( _viewport );
445
485
 
446
- this.getViewport = function ( target ) {
486
+ };
447
487
 
448
- return target.copy( _viewport );
488
+ this.setViewport = function ( x, y, width, height ) {
449
489
 
450
- };
490
+ if ( x.isVector4 ) {
451
491
 
452
- this.setViewport = function ( x, y, width, height ) {
492
+ _viewport.set( x.x, x.y, x.z, x.w );
453
493
 
454
- if ( x.isVector4 ) {
494
+ } else {
455
495
 
456
- _viewport.set( x.x, x.y, x.z, x.w );
496
+ _viewport.set( x, y, width, height );
457
497
 
458
- } else {
498
+ }
459
499
 
460
- _viewport.set( x, y, width, height );
500
+ state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );
461
501
 
462
- }
502
+ };
503
+
504
+ this.getScissor = function ( target ) {
463
505
 
464
- state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );
506
+ return target.copy( _scissor );
465
507
 
466
- };
508
+ };
467
509
 
468
- this.getScissor = function ( target ) {
510
+ this.setScissor = function ( x, y, width, height ) {
469
511
 
470
- return target.copy( _scissor );
512
+ if ( x.isVector4 ) {
471
513
 
472
- };
514
+ _scissor.set( x.x, x.y, x.z, x.w );
473
515
 
474
- this.setScissor = function ( x, y, width, height ) {
516
+ } else {
475
517
 
476
- if ( x.isVector4 ) {
518
+ _scissor.set( x, y, width, height );
477
519
 
478
- _scissor.set( x.x, x.y, x.z, x.w );
520
+ }
479
521
 
480
- } else {
522
+ state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );
481
523
 
482
- _scissor.set( x, y, width, height );
524
+ };
483
525
 
484
- }
526
+ this.getScissorTest = function () {
485
527
 
486
- state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );
528
+ return _scissorTest;
487
529
 
488
- };
530
+ };
489
531
 
490
- this.getScissorTest = function () {
532
+ this.setScissorTest = function ( boolean ) {
491
533
 
492
- return _scissorTest;
534
+ state.setScissorTest( _scissorTest = boolean );
493
535
 
494
- };
536
+ };
495
537
 
496
- this.setScissorTest = function ( boolean ) {
538
+ this.setOpaqueSort = function ( method ) {
497
539
 
498
- state.setScissorTest( _scissorTest = boolean );
540
+ _opaqueSort = method;
499
541
 
500
- };
542
+ };
501
543
 
502
- this.setOpaqueSort = function ( method ) {
544
+ this.setTransparentSort = function ( method ) {
503
545
 
504
- _opaqueSort = method;
546
+ _transparentSort = method;
505
547
 
506
- };
548
+ };
507
549
 
508
- this.setTransparentSort = function ( method ) {
550
+ // Clearing
509
551
 
510
- _transparentSort = method;
552
+ this.getClearColor = function ( target ) {
511
553
 
512
- };
554
+ return target.copy( background.getClearColor() );
513
555
 
514
- // Clearing
556
+ };
515
557
 
516
- this.getClearColor = function ( target ) {
558
+ this.setClearColor = function () {
517
559
 
518
- return target.copy( background.getClearColor() );
560
+ background.setClearColor.apply( background, arguments );
519
561
 
520
- };
562
+ };
521
563
 
522
- this.setClearColor = function () {
564
+ this.getClearAlpha = function () {
523
565
 
524
- background.setClearColor.apply( background, arguments );
566
+ return background.getClearAlpha();
525
567
 
526
- };
568
+ };
527
569
 
528
- this.getClearAlpha = function () {
570
+ this.setClearAlpha = function () {
529
571
 
530
- return background.getClearAlpha();
572
+ background.setClearAlpha.apply( background, arguments );
531
573
 
532
- };
574
+ };
533
575
 
534
- this.setClearAlpha = function () {
576
+ this.clear = function ( color = true, depth = true, stencil = true ) {
535
577
 
536
- background.setClearAlpha.apply( background, arguments );
578
+ let bits = 0;
537
579
 
538
- };
580
+ if ( color ) {
539
581
 
540
- this.clear = function ( color = true, depth = true, stencil = true ) {
582
+ // check if we're trying to clear an integer target
583
+ let isIntegerFormat = false;
584
+ if ( _currentRenderTarget !== null ) {
541
585
 
542
- let bits = 0;
586
+ const targetFormat = _currentRenderTarget.texture.format;
587
+ isIntegerFormat = targetFormat === RGBAIntegerFormat ||
588
+ targetFormat === RGIntegerFormat ||
589
+ targetFormat === RedIntegerFormat;
543
590
 
544
- if ( color ) bits |= _gl.COLOR_BUFFER_BIT;
545
- if ( depth ) bits |= _gl.DEPTH_BUFFER_BIT;
546
- if ( stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
591
+ }
547
592
 
548
- _gl.clear( bits );
593
+ // use the appropriate clear functions to clear the target if it's a signed
594
+ // or unsigned integer target
595
+ if ( isIntegerFormat ) {
549
596
 
550
- };
597
+ const targetType = _currentRenderTarget.texture.type;
598
+ const isUnsignedType = targetType === UnsignedByteType ||
599
+ targetType === UnsignedIntType ||
600
+ targetType === UnsignedShortType ||
601
+ targetType === UnsignedInt248Type ||
602
+ targetType === UnsignedShort4444Type ||
603
+ targetType === UnsignedShort5551Type;
551
604
 
552
- this.clearColor = function () {
605
+ const clearColor = background.getClearColor();
606
+ const a = background.getClearAlpha();
607
+ const r = clearColor.r;
608
+ const g = clearColor.g;
609
+ const b = clearColor.b;
553
610
 
554
- this.clear( true, false, false );
611
+ if ( isUnsignedType ) {
555
612
 
556
- };
613
+ uintClearColor[ 0 ] = r;
614
+ uintClearColor[ 1 ] = g;
615
+ uintClearColor[ 2 ] = b;
616
+ uintClearColor[ 3 ] = a;
617
+ _gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );
557
618
 
558
- this.clearDepth = function () {
619
+ } else {
559
620
 
560
- this.clear( false, true, false );
621
+ intClearColor[ 0 ] = r;
622
+ intClearColor[ 1 ] = g;
623
+ intClearColor[ 2 ] = b;
624
+ intClearColor[ 3 ] = a;
625
+ _gl.clearBufferiv( _gl.COLOR, 0, intClearColor );
561
626
 
562
- };
627
+ }
563
628
 
564
- this.clearStencil = function () {
629
+ } else {
565
630
 
566
- this.clear( false, false, true );
631
+ bits |= _gl.COLOR_BUFFER_BIT;
567
632
 
568
- };
633
+ }
569
634
 
570
- //
635
+ }
571
636
 
572
- this.dispose = function () {
637
+ if ( depth ) bits |= _gl.DEPTH_BUFFER_BIT;
638
+ if ( stencil ) bits |= _gl.STENCIL_BUFFER_BIT;
573
639
 
574
- _canvas.removeEventListener( 'webglcontextlost', onContextLost, false );
575
- _canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );
576
- _canvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );
640
+ _gl.clear( bits );
577
641
 
578
- renderLists.dispose();
579
- renderStates.dispose();
580
- properties.dispose();
581
- cubemaps.dispose();
582
- cubeuvmaps.dispose();
583
- objects.dispose();
584
- bindingStates.dispose();
585
- uniformsGroups.dispose();
586
- programCache.dispose();
642
+ };
587
643
 
588
- xr.dispose();
644
+ this.clearColor = function () {
589
645
 
590
- xr.removeEventListener( 'sessionstart', onXRSessionStart );
591
- xr.removeEventListener( 'sessionend', onXRSessionEnd );
646
+ this.clear( true, false, false );
592
647
 
593
- if ( _transmissionRenderTarget ) {
648
+ };
594
649
 
595
- _transmissionRenderTarget.dispose();
596
- _transmissionRenderTarget = null;
650
+ this.clearDepth = function () {
597
651
 
598
- }
652
+ this.clear( false, true, false );
599
653
 
600
- animation.stop();
654
+ };
601
655
 
602
- };
656
+ this.clearStencil = function () {
603
657
 
604
- // Events
658
+ this.clear( false, false, true );
605
659
 
606
- function onContextLost( event ) {
660
+ };
607
661
 
608
- event.preventDefault();
662
+ //
609
663
 
610
- console.log( 'THREE.WebGLRenderer: Context Lost.' );
664
+ this.dispose = function () {
611
665
 
612
- _isContextLost = true;
666
+ canvas.removeEventListener( 'webglcontextlost', onContextLost, false );
667
+ canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );
668
+ canvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );
613
669
 
614
- }
670
+ renderLists.dispose();
671
+ renderStates.dispose();
672
+ properties.dispose();
673
+ cubemaps.dispose();
674
+ cubeuvmaps.dispose();
675
+ objects.dispose();
676
+ bindingStates.dispose();
677
+ uniformsGroups.dispose();
678
+ programCache.dispose();
615
679
 
616
- function onContextRestore( /* event */ ) {
680
+ xr.dispose();
617
681
 
618
- console.log( 'THREE.WebGLRenderer: Context Restored.' );
682
+ xr.removeEventListener( 'sessionstart', onXRSessionStart );
683
+ xr.removeEventListener( 'sessionend', onXRSessionEnd );
619
684
 
620
- _isContextLost = false;
685
+ if ( _transmissionRenderTarget ) {
621
686
 
622
- const infoAutoReset = info.autoReset;
623
- const shadowMapEnabled = shadowMap.enabled;
624
- const shadowMapAutoUpdate = shadowMap.autoUpdate;
625
- const shadowMapNeedsUpdate = shadowMap.needsUpdate;
626
- const shadowMapType = shadowMap.type;
687
+ _transmissionRenderTarget.dispose();
688
+ _transmissionRenderTarget = null;
627
689
 
628
- initGLContext();
690
+ }
629
691
 
630
- info.autoReset = infoAutoReset;
631
- shadowMap.enabled = shadowMapEnabled;
632
- shadowMap.autoUpdate = shadowMapAutoUpdate;
633
- shadowMap.needsUpdate = shadowMapNeedsUpdate;
634
- shadowMap.type = shadowMapType;
692
+ animation.stop();
635
693
 
636
- }
694
+ };
637
695
 
638
- function onContextCreationError( event ) {
696
+ // Events
639
697
 
640
- console.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );
698
+ function onContextLost( event ) {
641
699
 
642
- }
700
+ event.preventDefault();
643
701
 
644
- function onMaterialDispose( event ) {
702
+ console.log( 'THREE.WebGLRenderer: Context Lost.' );
645
703
 
646
- const material = event.target;
704
+ _isContextLost = true;
647
705
 
648
- material.removeEventListener( 'dispose', onMaterialDispose );
706
+ }
649
707
 
650
- deallocateMaterial( material );
708
+ function onContextRestore( /* event */ ) {
651
709
 
652
- }
710
+ console.log( 'THREE.WebGLRenderer: Context Restored.' );
653
711
 
654
- // Buffer deallocation
712
+ _isContextLost = false;
655
713
 
656
- function deallocateMaterial( material ) {
714
+ const infoAutoReset = info.autoReset;
715
+ const shadowMapEnabled = shadowMap.enabled;
716
+ const shadowMapAutoUpdate = shadowMap.autoUpdate;
717
+ const shadowMapNeedsUpdate = shadowMap.needsUpdate;
718
+ const shadowMapType = shadowMap.type;
657
719
 
658
- releaseMaterialProgramReferences( material );
720
+ initGLContext();
659
721
 
660
- properties.remove( material );
722
+ info.autoReset = infoAutoReset;
723
+ shadowMap.enabled = shadowMapEnabled;
724
+ shadowMap.autoUpdate = shadowMapAutoUpdate;
725
+ shadowMap.needsUpdate = shadowMapNeedsUpdate;
726
+ shadowMap.type = shadowMapType;
661
727
 
662
- }
728
+ }
729
+
730
+ function onContextCreationError( event ) {
663
731
 
732
+ console.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );
664
733
 
665
- function releaseMaterialProgramReferences( material ) {
734
+ }
666
735
 
667
- const programs = properties.get( material ).programs;
736
+ function onMaterialDispose( event ) {
668
737
 
669
- if ( programs !== undefined ) {
738
+ const material = event.target;
670
739
 
671
- programs.forEach( function ( program ) {
740
+ material.removeEventListener( 'dispose', onMaterialDispose );
672
741
 
673
- programCache.releaseProgram( program );
742
+ deallocateMaterial( material );
674
743
 
675
- } );
744
+ }
676
745
 
677
- if ( material.isShaderMaterial ) {
746
+ // Buffer deallocation
678
747
 
679
- programCache.releaseShaderCache( material );
748
+ function deallocateMaterial( material ) {
680
749
 
681
- }
750
+ releaseMaterialProgramReferences( material );
751
+
752
+ properties.remove( material );
682
753
 
683
754
  }
684
755
 
685
- }
686
756
 
687
- // Buffer rendering
757
+ function releaseMaterialProgramReferences( material ) {
688
758
 
689
- this.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {
759
+ const programs = properties.get( material ).programs;
690
760
 
691
- if ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)
761
+ if ( programs !== undefined ) {
692
762
 
693
- const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
763
+ programs.forEach( function ( program ) {
694
764
 
695
- const program = setProgram( camera, scene, geometry, material, object );
765
+ programCache.releaseProgram( program );
696
766
 
697
- state.setMaterial( material, frontFaceCW );
767
+ } );
698
768
 
699
- //
769
+ if ( material.isShaderMaterial ) {
700
770
 
701
- let index = geometry.index;
702
- let rangeFactor = 1;
771
+ programCache.releaseShaderCache( material );
703
772
 
704
- if ( material.wireframe === true ) {
773
+ }
705
774
 
706
- index = geometries.getWireframeAttribute( geometry );
707
- rangeFactor = 2;
775
+ }
708
776
 
709
777
  }
710
778
 
711
- //
779
+ // Buffer rendering
712
780
 
713
- const drawRange = geometry.drawRange;
714
- const position = geometry.attributes.position;
781
+ this.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {
715
782
 
716
- let drawStart = drawRange.start * rangeFactor;
717
- let drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;
783
+ if ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)
718
784
 
719
- if ( group !== null ) {
785
+ const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
720
786
 
721
- drawStart = Math.max( drawStart, group.start * rangeFactor );
722
- drawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );
787
+ const program = setProgram( camera, scene, geometry, material, object );
723
788
 
724
- }
789
+ state.setMaterial( material, frontFaceCW );
725
790
 
726
- if ( index !== null ) {
791
+ //
727
792
 
728
- drawStart = Math.max( drawStart, 0 );
729
- drawEnd = Math.min( drawEnd, index.count );
793
+ let index = geometry.index;
794
+ let rangeFactor = 1;
730
795
 
731
- } else if ( position !== undefined && position !== null ) {
796
+ if ( material.wireframe === true ) {
732
797
 
733
- drawStart = Math.max( drawStart, 0 );
734
- drawEnd = Math.min( drawEnd, position.count );
798
+ index = geometries.getWireframeAttribute( geometry );
799
+ rangeFactor = 2;
735
800
 
736
- }
801
+ }
737
802
 
738
- const drawCount = drawEnd - drawStart;
803
+ //
739
804
 
740
- if ( drawCount < 0 || drawCount === Infinity ) return;
805
+ const drawRange = geometry.drawRange;
806
+ const position = geometry.attributes.position;
741
807
 
742
- //
808
+ let drawStart = drawRange.start * rangeFactor;
809
+ let drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;
743
810
 
744
- bindingStates.setup( object, material, program, geometry, index );
811
+ if ( group !== null ) {
745
812
 
746
- let attribute;
747
- let renderer = bufferRenderer;
813
+ drawStart = Math.max( drawStart, group.start * rangeFactor );
814
+ drawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );
748
815
 
749
- if ( index !== null ) {
816
+ }
750
817
 
751
- attribute = attributes.get( index );
818
+ if ( index !== null ) {
752
819
 
753
- renderer = indexedBufferRenderer;
754
- renderer.setIndex( attribute );
820
+ drawStart = Math.max( drawStart, 0 );
821
+ drawEnd = Math.min( drawEnd, index.count );
755
822
 
756
- }
823
+ } else if ( position !== undefined && position !== null ) {
757
824
 
758
- //
825
+ drawStart = Math.max( drawStart, 0 );
826
+ drawEnd = Math.min( drawEnd, position.count );
759
827
 
760
- if ( object.isMesh ) {
828
+ }
761
829
 
762
- if ( material.wireframe === true ) {
830
+ const drawCount = drawEnd - drawStart;
763
831
 
764
- state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );
765
- renderer.setMode( _gl.LINES );
832
+ if ( drawCount < 0 || drawCount === Infinity ) return;
766
833
 
767
- } else {
834
+ //
768
835
 
769
- renderer.setMode( _gl.TRIANGLES );
836
+ bindingStates.setup( object, material, program, geometry, index );
770
837
 
771
- }
838
+ let attribute;
839
+ let renderer = bufferRenderer;
772
840
 
773
- } else if ( object.isLine ) {
841
+ if ( index !== null ) {
774
842
 
775
- let lineWidth = material.linewidth;
843
+ attribute = attributes.get( index );
776
844
 
777
- if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
845
+ renderer = indexedBufferRenderer;
846
+ renderer.setIndex( attribute );
778
847
 
779
- state.setLineWidth( lineWidth * getTargetPixelRatio() );
848
+ }
780
849
 
781
- if ( object.isLineSegments ) {
850
+ //
782
851
 
783
- renderer.setMode( _gl.LINES );
852
+ if ( object.isMesh ) {
784
853
 
785
- } else if ( object.isLineLoop ) {
854
+ if ( material.wireframe === true ) {
786
855
 
787
- renderer.setMode( _gl.LINE_LOOP );
856
+ state.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );
857
+ renderer.setMode( _gl.LINES );
788
858
 
789
- } else {
859
+ } else {
790
860
 
791
- renderer.setMode( _gl.LINE_STRIP );
861
+ renderer.setMode( _gl.TRIANGLES );
792
862
 
793
- }
863
+ }
794
864
 
795
- } else if ( object.isPoints ) {
865
+ } else if ( object.isLine ) {
796
866
 
797
- renderer.setMode( _gl.POINTS );
867
+ let lineWidth = material.linewidth;
798
868
 
799
- } else if ( object.isSprite ) {
869
+ if ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material
800
870
 
801
- renderer.setMode( _gl.TRIANGLES );
871
+ state.setLineWidth( lineWidth * getTargetPixelRatio() );
802
872
 
803
- }
873
+ if ( object.isLineSegments ) {
804
874
 
805
- if ( object.isInstancedMesh ) {
875
+ renderer.setMode( _gl.LINES );
806
876
 
807
- renderer.renderInstances( drawStart, drawCount, object.count );
877
+ } else if ( object.isLineLoop ) {
808
878
 
809
- } else if ( geometry.isInstancedBufferGeometry ) {
879
+ renderer.setMode( _gl.LINE_LOOP );
810
880
 
811
- const maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;
812
- const instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );
881
+ } else {
813
882
 
814
- renderer.renderInstances( drawStart, drawCount, instanceCount );
883
+ renderer.setMode( _gl.LINE_STRIP );
815
884
 
816
- } else {
885
+ }
817
886
 
818
- renderer.render( drawStart, drawCount );
887
+ } else if ( object.isPoints ) {
819
888
 
820
- }
889
+ renderer.setMode( _gl.POINTS );
821
890
 
822
- };
891
+ } else if ( object.isSprite ) {
823
892
 
824
- // Compile
893
+ renderer.setMode( _gl.TRIANGLES );
825
894
 
826
- this.compile = function ( scene, camera ) {
895
+ }
827
896
 
828
- function prepare( material, scene, object ) {
897
+ if ( object.isInstancedMesh ) {
829
898
 
830
- if ( material.transparent === true && material.side === DoubleSide ) {
899
+ renderer.renderInstances( drawStart, drawCount, object.count );
831
900
 
832
- material.side = BackSide;
833
- material.needsUpdate = true;
834
- getProgram( material, scene, object );
901
+ } else if ( geometry.isInstancedBufferGeometry ) {
835
902
 
836
- material.side = FrontSide;
837
- material.needsUpdate = true;
838
- getProgram( material, scene, object );
903
+ const maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;
904
+ const instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );
839
905
 
840
- material.side = DoubleSide;
906
+ renderer.renderInstances( drawStart, drawCount, instanceCount );
841
907
 
842
908
  } else {
843
909
 
844
- getProgram( material, scene, object );
910
+ renderer.render( drawStart, drawCount );
845
911
 
846
912
  }
847
913
 
848
- }
914
+ };
849
915
 
850
- currentRenderState = renderStates.get( scene );
851
- currentRenderState.init();
916
+ // Compile
852
917
 
853
- renderStateStack.push( currentRenderState );
918
+ this.compile = function ( scene, camera ) {
854
919
 
855
- scene.traverseVisible( function ( object ) {
920
+ function prepare( material, scene, object ) {
856
921
 
857
- if ( object.isLight && object.layers.test( camera.layers ) ) {
922
+ if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
858
923
 
859
- currentRenderState.pushLight( object );
924
+ material.side = BackSide;
925
+ material.needsUpdate = true;
926
+ getProgram( material, scene, object );
860
927
 
861
- if ( object.castShadow ) {
928
+ material.side = FrontSide;
929
+ material.needsUpdate = true;
930
+ getProgram( material, scene, object );
862
931
 
863
- currentRenderState.pushShadow( object );
932
+ material.side = DoubleSide;
933
+
934
+ } else {
935
+
936
+ getProgram( material, scene, object );
864
937
 
865
938
  }
866
939
 
867
940
  }
868
941
 
869
- } );
942
+ currentRenderState = renderStates.get( scene );
943
+ currentRenderState.init();
870
944
 
871
- currentRenderState.setupLights( _this.physicallyCorrectLights );
945
+ renderStateStack.push( currentRenderState );
872
946
 
873
- scene.traverse( function ( object ) {
947
+ scene.traverseVisible( function ( object ) {
874
948
 
875
- const material = object.material;
949
+ if ( object.isLight && object.layers.test( camera.layers ) ) {
876
950
 
877
- if ( material ) {
951
+ currentRenderState.pushLight( object );
878
952
 
879
- if ( Array.isArray( material ) ) {
953
+ if ( object.castShadow ) {
880
954
 
881
- for ( let i = 0; i < material.length; i ++ ) {
955
+ currentRenderState.pushShadow( object );
882
956
 
883
- const material2 = material[ i ];
957
+ }
884
958
 
885
- prepare( material2, scene, object );
959
+ }
886
960
 
887
- }
961
+ } );
888
962
 
889
- } else {
963
+ currentRenderState.setupLights( _this.useLegacyLights );
890
964
 
891
- prepare( material, scene, object );
965
+ scene.traverse( function ( object ) {
892
966
 
893
- }
967
+ const material = object.material;
894
968
 
895
- }
969
+ if ( material ) {
896
970
 
897
- } );
971
+ if ( Array.isArray( material ) ) {
898
972
 
899
- renderStateStack.pop();
900
- currentRenderState = null;
973
+ for ( let i = 0; i < material.length; i ++ ) {
901
974
 
902
- };
975
+ const material2 = material[ i ];
903
976
 
904
- // Animation Loop
977
+ prepare( material2, scene, object );
905
978
 
906
- let onAnimationFrameCallback = null;
979
+ }
907
980
 
908
- function onAnimationFrame( time ) {
981
+ } else {
909
982
 
910
- if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );
983
+ prepare( material, scene, object );
911
984
 
912
- }
985
+ }
913
986
 
914
- function onXRSessionStart() {
987
+ }
915
988
 
916
- animation.stop();
989
+ } );
917
990
 
918
- }
991
+ renderStateStack.pop();
992
+ currentRenderState = null;
919
993
 
920
- function onXRSessionEnd() {
994
+ };
921
995
 
922
- animation.start();
996
+ // Animation Loop
923
997
 
924
- }
998
+ let onAnimationFrameCallback = null;
925
999
 
926
- const animation = new WebGLAnimation();
927
- animation.setAnimationLoop( onAnimationFrame );
1000
+ function onAnimationFrame( time ) {
928
1001
 
929
- if ( typeof self !== 'undefined' ) animation.setContext( self );
1002
+ if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );
930
1003
 
931
- this.setAnimationLoop = function ( callback ) {
1004
+ }
932
1005
 
933
- onAnimationFrameCallback = callback;
934
- xr.setAnimationLoop( callback );
1006
+ function onXRSessionStart() {
935
1007
 
936
- ( callback === null ) ? animation.stop() : animation.start();
1008
+ animation.stop();
937
1009
 
938
- };
1010
+ }
939
1011
 
940
- xr.addEventListener( 'sessionstart', onXRSessionStart );
941
- xr.addEventListener( 'sessionend', onXRSessionEnd );
1012
+ function onXRSessionEnd() {
942
1013
 
943
- // Rendering
1014
+ animation.start();
944
1015
 
945
- this.render = function ( scene, camera ) {
1016
+ }
946
1017
 
947
- if ( camera !== undefined && camera.isCamera !== true ) {
1018
+ const animation = new WebGLAnimation();
1019
+ animation.setAnimationLoop( onAnimationFrame );
948
1020
 
949
- console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
950
- return;
1021
+ if ( typeof self !== 'undefined' ) animation.setContext( self );
951
1022
 
952
- }
1023
+ this.setAnimationLoop = function ( callback ) {
953
1024
 
954
- if ( _isContextLost === true ) return;
1025
+ onAnimationFrameCallback = callback;
1026
+ xr.setAnimationLoop( callback );
955
1027
 
956
- // update scene graph
1028
+ ( callback === null ) ? animation.stop() : animation.start();
957
1029
 
958
- if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
1030
+ };
959
1031
 
960
- // update camera matrices and frustum
1032
+ xr.addEventListener( 'sessionstart', onXRSessionStart );
1033
+ xr.addEventListener( 'sessionend', onXRSessionEnd );
961
1034
 
962
- if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
1035
+ // Rendering
963
1036
 
964
- if ( xr.enabled === true && xr.isPresenting === true ) {
1037
+ this.render = function ( scene, camera ) {
965
1038
 
966
- if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
1039
+ if ( camera !== undefined && camera.isCamera !== true ) {
967
1040
 
968
- camera = xr.getCamera(); // use XR camera for rendering
1041
+ console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );
1042
+ return;
969
1043
 
970
- }
1044
+ }
971
1045
 
972
- //
973
- if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );
1046
+ if ( _isContextLost === true ) return;
974
1047
 
975
- currentRenderState = renderStates.get( scene, renderStateStack.length );
976
- currentRenderState.init();
1048
+ // update scene graph
977
1049
 
978
- renderStateStack.push( currentRenderState );
1050
+ if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
979
1051
 
980
- _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
981
- _frustum.setFromProjectionMatrix( _projScreenMatrix );
1052
+ // update camera matrices and frustum
982
1053
 
983
- _localClippingEnabled = this.localClippingEnabled;
984
- _clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled, camera );
1054
+ if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
985
1055
 
986
- currentRenderList = renderLists.get( scene, renderListStack.length );
987
- currentRenderList.init();
1056
+ if ( xr.enabled === true && xr.isPresenting === true ) {
988
1057
 
989
- renderListStack.push( currentRenderList );
1058
+ if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
990
1059
 
991
- projectObject( scene, camera, 0, _this.sortObjects );
1060
+ camera = xr.getCamera(); // use XR camera for rendering
992
1061
 
993
- currentRenderList.finish();
1062
+ }
994
1063
 
995
- if ( _this.sortObjects === true ) {
1064
+ //
1065
+ if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );
996
1066
 
997
- currentRenderList.sort( _opaqueSort, _transparentSort );
1067
+ currentRenderState = renderStates.get( scene, renderStateStack.length );
1068
+ currentRenderState.init();
998
1069
 
999
- }
1070
+ renderStateStack.push( currentRenderState );
1000
1071
 
1001
- //
1072
+ _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
1073
+ _frustum.setFromProjectionMatrix( _projScreenMatrix );
1002
1074
 
1003
- if ( _clippingEnabled === true ) clipping.beginShadows();
1075
+ _localClippingEnabled = this.localClippingEnabled;
1076
+ _clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );
1004
1077
 
1005
- const shadowsArray = currentRenderState.state.shadowsArray;
1078
+ currentRenderList = renderLists.get( scene, renderListStack.length );
1079
+ currentRenderList.init();
1006
1080
 
1007
- shadowMap.render( shadowsArray, scene, camera );
1081
+ renderListStack.push( currentRenderList );
1008
1082
 
1009
- if ( _clippingEnabled === true ) clipping.endShadows();
1083
+ projectObject( scene, camera, 0, _this.sortObjects );
1010
1084
 
1011
- //
1085
+ currentRenderList.finish();
1012
1086
 
1013
- if ( this.info.autoReset === true ) this.info.reset();
1087
+ if ( _this.sortObjects === true ) {
1014
1088
 
1015
- //
1089
+ currentRenderList.sort( _opaqueSort, _transparentSort );
1016
1090
 
1017
- background.render( currentRenderList, scene );
1091
+ }
1018
1092
 
1019
- // render scene
1093
+ //
1020
1094
 
1021
- currentRenderState.setupLights( _this.physicallyCorrectLights );
1095
+ this.info.render.frame ++;
1022
1096
 
1023
- if ( camera.isArrayCamera ) {
1097
+ if ( _clippingEnabled === true ) clipping.beginShadows();
1024
1098
 
1025
- const cameras = camera.cameras;
1099
+ const shadowsArray = currentRenderState.state.shadowsArray;
1026
1100
 
1027
- for ( let i = 0, l = cameras.length; i < l; i ++ ) {
1101
+ shadowMap.render( shadowsArray, scene, camera );
1028
1102
 
1029
- const camera2 = cameras[ i ];
1103
+ if ( _clippingEnabled === true ) clipping.endShadows();
1030
1104
 
1031
- renderScene( currentRenderList, scene, camera2, camera2.viewport );
1105
+ //
1032
1106
 
1033
- }
1107
+ if ( this.info.autoReset === true ) this.info.reset();
1034
1108
 
1035
- } else {
1036
1109
 
1037
- renderScene( currentRenderList, scene, camera );
1110
+ //
1038
1111
 
1039
- }
1112
+ background.render( currentRenderList, scene );
1040
1113
 
1041
- //
1114
+ // render scene
1042
1115
 
1043
- if ( _currentRenderTarget !== null ) {
1116
+ currentRenderState.setupLights( _this.useLegacyLights );
1044
1117
 
1045
- // resolve multisample renderbuffers to a single-sample texture if necessary
1118
+ if ( camera.isArrayCamera ) {
1046
1119
 
1047
- textures.updateMultisampleRenderTarget( _currentRenderTarget );
1120
+ const cameras = camera.cameras;
1048
1121
 
1049
- // Generate mipmap if we're using any kind of mipmap filtering
1122
+ for ( let i = 0, l = cameras.length; i < l; i ++ ) {
1050
1123
 
1051
- textures.updateRenderTargetMipmap( _currentRenderTarget );
1124
+ const camera2 = cameras[ i ];
1052
1125
 
1053
- }
1126
+ renderScene( currentRenderList, scene, camera2, camera2.viewport );
1054
1127
 
1055
- //
1128
+ }
1129
+
1130
+ } else {
1056
1131
 
1057
- if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );
1132
+ renderScene( currentRenderList, scene, camera );
1058
1133
 
1059
- if ( xr.enabled && xr.submitFrame ) {
1134
+ }
1060
1135
 
1061
- xr.submitFrame();
1136
+ //
1062
1137
 
1063
- }
1064
- // _gl.finish();
1138
+ if ( _currentRenderTarget !== null ) {
1065
1139
 
1066
- bindingStates.resetDefaultState();
1067
- _currentMaterialId = - 1;
1068
- _currentCamera = null;
1140
+ // resolve multisample renderbuffers to a single-sample texture if necessary
1069
1141
 
1070
- renderStateStack.pop();
1142
+ textures.updateMultisampleRenderTarget( _currentRenderTarget );
1071
1143
 
1072
- if ( renderStateStack.length > 0 ) {
1144
+ // Generate mipmap if we're using any kind of mipmap filtering
1073
1145
 
1074
- currentRenderState = renderStateStack[ renderStateStack.length - 1 ];
1146
+ textures.updateRenderTargetMipmap( _currentRenderTarget );
1075
1147
 
1076
- } else {
1148
+ }
1077
1149
 
1078
- currentRenderState = null;
1150
+ //
1079
1151
 
1080
- }
1152
+ if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );
1081
1153
 
1082
- renderListStack.pop();
1154
+ if ( xr.enabled && xr.submitFrame ) {
1083
1155
 
1084
- if ( renderListStack.length > 0 ) {
1156
+ xr.submitFrame();
1085
1157
 
1086
- currentRenderList = renderListStack[ renderListStack.length - 1 ];
1158
+ }
1159
+ // _gl.finish();
1087
1160
 
1088
- } else {
1161
+ bindingStates.resetDefaultState();
1162
+ _currentMaterialId = - 1;
1163
+ _currentCamera = null;
1089
1164
 
1090
- currentRenderList = null;
1165
+ renderStateStack.pop();
1091
1166
 
1092
- }
1167
+ if ( renderStateStack.length > 0 ) {
1093
1168
 
1094
- };
1169
+ currentRenderState = renderStateStack[ renderStateStack.length - 1 ];
1095
1170
 
1096
- function projectObject( object, camera, groupOrder, sortObjects ) {
1171
+ } else {
1097
1172
 
1098
- if ( object.visible === false ) return;
1173
+ currentRenderState = null;
1099
1174
 
1100
- const visible = object.layers.test( camera.layers );
1175
+ }
1176
+
1177
+ renderListStack.pop();
1101
1178
 
1102
- if ( visible ) {
1179
+ if ( renderListStack.length > 0 ) {
1103
1180
 
1104
- if ( object.isGroup ) {
1181
+ currentRenderList = renderListStack[ renderListStack.length - 1 ];
1105
1182
 
1106
- groupOrder = object.renderOrder;
1183
+ } else {
1107
1184
 
1108
- } else if ( object.isLOD ) {
1185
+ currentRenderList = null;
1109
1186
 
1110
- if ( object.autoUpdate === true ) object.update( camera );
1187
+ }
1111
1188
 
1112
- } else if ( object.isLight ) {
1189
+ };
1113
1190
 
1114
- currentRenderState.pushLight( object );
1191
+ function projectObject( object, camera, groupOrder, sortObjects ) {
1115
1192
 
1116
- if ( object.castShadow ) {
1193
+ if ( object.visible === false ) return;
1117
1194
 
1118
- currentRenderState.pushShadow( object );
1195
+ const visible = object.layers.test( camera.layers );
1119
1196
 
1120
- }
1197
+ if ( visible ) {
1121
1198
 
1122
- } else if ( object.isSprite ) {
1199
+ if ( object.isGroup ) {
1123
1200
 
1124
- if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
1201
+ groupOrder = object.renderOrder;
1125
1202
 
1126
- if ( sortObjects ) {
1203
+ } else if ( object.isLOD ) {
1127
1204
 
1128
- _vector3.setFromMatrixPosition( object.matrixWorld )
1129
- .applyMatrix4( _projScreenMatrix );
1205
+ if ( object.autoUpdate === true ) object.update( camera );
1130
1206
 
1131
- }
1207
+ } else if ( object.isLight ) {
1132
1208
 
1133
- const geometry = objects.update( object );
1134
- const material = object.material;
1209
+ currentRenderState.pushLight( object );
1135
1210
 
1136
- if ( material.visible ) {
1211
+ if ( object.castShadow ) {
1137
1212
 
1138
- currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
1213
+ currentRenderState.pushShadow( object );
1139
1214
 
1140
1215
  }
1141
1216
 
1142
- }
1217
+ } else if ( object.isSprite ) {
1218
+
1219
+ if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {
1143
1220
 
1144
- } else if ( object.isMesh || object.isLine || object.isPoints ) {
1221
+ if ( sortObjects ) {
1145
1222
 
1146
- if ( object.isSkinnedMesh ) {
1223
+ _vector3.setFromMatrixPosition( object.matrixWorld )
1224
+ .applyMatrix4( _projScreenMatrix );
1147
1225
 
1148
- // update skeleton only once in a frame
1226
+ }
1227
+
1228
+ const geometry = objects.update( object );
1229
+ const material = object.material;
1149
1230
 
1150
- if ( object.skeleton.frame !== info.render.frame ) {
1231
+ if ( material.visible ) {
1151
1232
 
1152
- object.skeleton.update();
1153
- object.skeleton.frame = info.render.frame;
1233
+ currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
1234
+
1235
+ }
1154
1236
 
1155
1237
  }
1156
1238
 
1157
- }
1239
+ } else if ( object.isMesh || object.isLine || object.isPoints ) {
1158
1240
 
1159
- if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
1241
+ if ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {
1160
1242
 
1161
- if ( sortObjects ) {
1243
+ const geometry = objects.update( object );
1244
+ const material = object.material;
1162
1245
 
1163
- _vector3.setFromMatrixPosition( object.matrixWorld )
1164
- .applyMatrix4( _projScreenMatrix );
1246
+ if ( sortObjects ) {
1165
1247
 
1166
- }
1248
+ if ( object.boundingSphere !== undefined ) {
1167
1249
 
1168
- const geometry = objects.update( object );
1169
- const material = object.material;
1250
+ if ( object.boundingSphere === null ) object.computeBoundingSphere();
1251
+ _vector3.copy( object.boundingSphere.center );
1170
1252
 
1171
- if ( Array.isArray( material ) ) {
1253
+ } else {
1172
1254
 
1173
- const groups = geometry.groups;
1255
+ if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
1256
+ _vector3.copy( geometry.boundingSphere.center );
1174
1257
 
1175
- for ( let i = 0, l = groups.length; i < l; i ++ ) {
1258
+ }
1259
+
1260
+ _vector3
1261
+ .applyMatrix4( object.matrixWorld )
1262
+ .applyMatrix4( _projScreenMatrix );
1263
+
1264
+ }
1265
+
1266
+ if ( Array.isArray( material ) ) {
1267
+
1268
+ const groups = geometry.groups;
1269
+
1270
+ for ( let i = 0, l = groups.length; i < l; i ++ ) {
1176
1271
 
1177
- const group = groups[ i ];
1178
- const groupMaterial = material[ group.materialIndex ];
1272
+ const group = groups[ i ];
1273
+ const groupMaterial = material[ group.materialIndex ];
1179
1274
 
1180
- if ( groupMaterial && groupMaterial.visible ) {
1275
+ if ( groupMaterial && groupMaterial.visible ) {
1181
1276
 
1182
- currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );
1277
+ currentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );
1278
+
1279
+ }
1183
1280
 
1184
1281
  }
1185
1282
 
1186
- }
1283
+ } else if ( material.visible ) {
1187
1284
 
1188
- } else if ( material.visible ) {
1285
+ currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
1189
1286
 
1190
- currentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );
1287
+ }
1191
1288
 
1192
1289
  }
1193
1290
 
@@ -1195,1090 +1292,1180 @@ function WebGLRenderer( parameters = {} ) {
1195
1292
 
1196
1293
  }
1197
1294
 
1198
- }
1295
+ const children = object.children;
1199
1296
 
1200
- const children = object.children;
1297
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
1201
1298
 
1202
- for ( let i = 0, l = children.length; i < l; i ++ ) {
1299
+ projectObject( children[ i ], camera, groupOrder, sortObjects );
1203
1300
 
1204
- projectObject( children[ i ], camera, groupOrder, sortObjects );
1301
+ }
1205
1302
 
1206
1303
  }
1207
1304
 
1208
- }
1305
+ function renderScene( currentRenderList, scene, camera, viewport ) {
1209
1306
 
1210
- function renderScene( currentRenderList, scene, camera, viewport ) {
1307
+ const opaqueObjects = currentRenderList.opaque;
1308
+ const transmissiveObjects = currentRenderList.transmissive;
1309
+ const transparentObjects = currentRenderList.transparent;
1211
1310
 
1212
- const opaqueObjects = currentRenderList.opaque;
1213
- const transmissiveObjects = currentRenderList.transmissive;
1214
- const transparentObjects = currentRenderList.transparent;
1311
+ currentRenderState.setupLightsView( camera );
1215
1312
 
1216
- currentRenderState.setupLightsView( camera );
1313
+ if ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );
1217
1314
 
1218
- if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );
1315
+ if ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );
1219
1316
 
1220
- if ( viewport ) state.viewport( _currentViewport.copy( viewport ) );
1317
+ if ( viewport ) state.viewport( _currentViewport.copy( viewport ) );
1221
1318
 
1222
- if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );
1223
- if ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );
1224
- if ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );
1319
+ if ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );
1320
+ if ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );
1321
+ if ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );
1225
1322
 
1226
- // Ensure depth buffer writing is enabled so it can be cleared on next render
1323
+ // Ensure depth buffer writing is enabled so it can be cleared on next render
1227
1324
 
1228
- state.buffers.depth.setTest( true );
1229
- state.buffers.depth.setMask( true );
1230
- state.buffers.color.setMask( true );
1325
+ state.buffers.depth.setTest( true );
1326
+ state.buffers.depth.setMask( true );
1327
+ state.buffers.color.setMask( true );
1231
1328
 
1232
- state.setPolygonOffset( false );
1329
+ state.setPolygonOffset( false );
1233
1330
 
1234
- }
1331
+ }
1235
1332
 
1236
- function renderTransmissionPass( opaqueObjects, scene, camera ) {
1333
+ function renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {
1237
1334
 
1238
- const isWebGL2 = capabilities.isWebGL2;
1335
+ const isWebGL2 = capabilities.isWebGL2;
1239
1336
 
1240
- if ( _transmissionRenderTarget === null ) {
1337
+ if ( _transmissionRenderTarget === null ) {
1241
1338
 
1242
- _transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {
1243
- generateMipmaps: true,
1244
- type: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,
1245
- minFilter: LinearMipmapLinearFilter,
1246
- samples: ( isWebGL2 && _antialias === true ) ? 4 : 0
1247
- } );
1339
+ _transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {
1340
+ generateMipmaps: true,
1341
+ type: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,
1342
+ minFilter: LinearMipmapLinearFilter,
1343
+ samples: ( isWebGL2 ) ? 4 : 0
1344
+ } );
1248
1345
 
1249
- }
1346
+ // debug
1250
1347
 
1251
- _this.getDrawingBufferSize( _vector2 );
1348
+ /*
1349
+ const geometry = new PlaneGeometry();
1350
+ const material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );
1252
1351
 
1253
- if ( isWebGL2 ) {
1352
+ const mesh = new Mesh( geometry, material );
1353
+ scene.add( mesh );
1354
+ */
1254
1355
 
1255
- _transmissionRenderTarget.setSize( _vector2.x, _vector2.y );
1356
+ }
1256
1357
 
1257
- } else {
1358
+ _this.getDrawingBufferSize( _vector2 );
1258
1359
 
1259
- _transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) );
1360
+ if ( isWebGL2 ) {
1260
1361
 
1261
- }
1362
+ _transmissionRenderTarget.setSize( _vector2.x, _vector2.y );
1262
1363
 
1263
- //
1364
+ } else {
1264
1365
 
1265
- const currentRenderTarget = _this.getRenderTarget();
1266
- _this.setRenderTarget( _transmissionRenderTarget );
1267
- _this.clear();
1366
+ _transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) );
1268
1367
 
1269
- // Turn off the features which can affect the frag color for opaque objects pass.
1270
- // Otherwise they are applied twice in opaque objects pass and transmission objects pass.
1271
- const currentToneMapping = _this.toneMapping;
1272
- _this.toneMapping = NoToneMapping;
1368
+ }
1273
1369
 
1274
- renderObjects( opaqueObjects, scene, camera );
1370
+ //
1275
1371
 
1276
- _this.toneMapping = currentToneMapping;
1372
+ const currentRenderTarget = _this.getRenderTarget();
1373
+ _this.setRenderTarget( _transmissionRenderTarget );
1277
1374
 
1278
- textures.updateMultisampleRenderTarget( _transmissionRenderTarget );
1279
- textures.updateRenderTargetMipmap( _transmissionRenderTarget );
1375
+ _this.getClearColor( _currentClearColor );
1376
+ _currentClearAlpha = _this.getClearAlpha();
1377
+ if ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );
1280
1378
 
1281
- _this.setRenderTarget( currentRenderTarget );
1379
+ _this.clear();
1282
1380
 
1283
- }
1381
+ // Turn off the features which can affect the frag color for opaque objects pass.
1382
+ // Otherwise they are applied twice in opaque objects pass and transmission objects pass.
1383
+ const currentToneMapping = _this.toneMapping;
1384
+ _this.toneMapping = NoToneMapping;
1284
1385
 
1285
- function renderObjects( renderList, scene, camera ) {
1386
+ renderObjects( opaqueObjects, scene, camera );
1286
1387
 
1287
- const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;
1388
+ textures.updateMultisampleRenderTarget( _transmissionRenderTarget );
1389
+ textures.updateRenderTargetMipmap( _transmissionRenderTarget );
1288
1390
 
1289
- for ( let i = 0, l = renderList.length; i < l; i ++ ) {
1391
+ let renderTargetNeedsUpdate = false;
1290
1392
 
1291
- const renderItem = renderList[ i ];
1393
+ for ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {
1292
1394
 
1293
- const object = renderItem.object;
1294
- const geometry = renderItem.geometry;
1295
- const material = overrideMaterial === null ? renderItem.material : overrideMaterial;
1296
- const group = renderItem.group;
1395
+ const renderItem = transmissiveObjects[ i ];
1297
1396
 
1298
- if ( object.layers.test( camera.layers ) ) {
1397
+ const object = renderItem.object;
1398
+ const geometry = renderItem.geometry;
1399
+ const material = renderItem.material;
1400
+ const group = renderItem.group;
1299
1401
 
1300
- renderObject( object, scene, camera, geometry, material, group );
1402
+ if ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {
1301
1403
 
1302
- }
1404
+ const currentSide = material.side;
1303
1405
 
1304
- }
1406
+ material.side = BackSide;
1407
+ material.needsUpdate = true;
1305
1408
 
1306
- }
1409
+ renderObject( object, scene, camera, geometry, material, group );
1307
1410
 
1308
- function renderObject( object, scene, camera, geometry, material, group ) {
1411
+ material.side = currentSide;
1412
+ material.needsUpdate = true;
1309
1413
 
1310
- object.onBeforeRender( _this, scene, camera, geometry, material, group );
1414
+ renderTargetNeedsUpdate = true;
1311
1415
 
1312
- object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
1313
- object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
1416
+ }
1314
1417
 
1315
- material.onBeforeRender( _this, scene, camera, geometry, object, group );
1418
+ }
1316
1419
 
1317
- if ( material.transparent === true && material.side === DoubleSide ) {
1420
+ if ( renderTargetNeedsUpdate === true ) {
1318
1421
 
1319
- material.side = BackSide;
1320
- material.needsUpdate = true;
1321
- _this.renderBufferDirect( camera, scene, geometry, material, object, group );
1422
+ textures.updateMultisampleRenderTarget( _transmissionRenderTarget );
1423
+ textures.updateRenderTargetMipmap( _transmissionRenderTarget );
1322
1424
 
1323
- material.side = FrontSide;
1324
- material.needsUpdate = true;
1325
- _this.renderBufferDirect( camera, scene, geometry, material, object, group );
1425
+ }
1326
1426
 
1327
- material.side = DoubleSide;
1427
+ _this.setRenderTarget( currentRenderTarget );
1328
1428
 
1329
- } else {
1429
+ _this.setClearColor( _currentClearColor, _currentClearAlpha );
1330
1430
 
1331
- _this.renderBufferDirect( camera, scene, geometry, material, object, group );
1431
+ _this.toneMapping = currentToneMapping;
1332
1432
 
1333
1433
  }
1334
1434
 
1335
- object.onAfterRender( _this, scene, camera, geometry, material, group );
1435
+ function renderObjects( renderList, scene, camera ) {
1336
1436
 
1337
- }
1437
+ const overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;
1338
1438
 
1339
- function getProgram( material, scene, object ) {
1439
+ for ( let i = 0, l = renderList.length; i < l; i ++ ) {
1340
1440
 
1341
- if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...
1441
+ const renderItem = renderList[ i ];
1342
1442
 
1343
- const materialProperties = properties.get( material );
1443
+ const object = renderItem.object;
1444
+ const geometry = renderItem.geometry;
1445
+ const material = overrideMaterial === null ? renderItem.material : overrideMaterial;
1446
+ const group = renderItem.group;
1344
1447
 
1345
- const lights = currentRenderState.state.lights;
1346
- const shadowsArray = currentRenderState.state.shadowsArray;
1448
+ if ( object.layers.test( camera.layers ) ) {
1347
1449
 
1348
- const lightsStateVersion = lights.state.version;
1450
+ renderObject( object, scene, camera, geometry, material, group );
1349
1451
 
1350
- const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );
1351
- const programCacheKey = programCache.getProgramCacheKey( parameters );
1452
+ }
1352
1453
 
1353
- let programs = materialProperties.programs;
1454
+ }
1354
1455
 
1355
- // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change
1456
+ }
1356
1457
 
1357
- materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;
1358
- materialProperties.fog = scene.fog;
1359
- materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );
1458
+ function renderObject( object, scene, camera, geometry, material, group ) {
1360
1459
 
1361
- if ( programs === undefined ) {
1460
+ object.onBeforeRender( _this, scene, camera, geometry, material, group );
1362
1461
 
1363
- // new material
1462
+ object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
1463
+ object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
1364
1464
 
1365
- material.addEventListener( 'dispose', onMaterialDispose );
1465
+ material.onBeforeRender( _this, scene, camera, geometry, object, group );
1366
1466
 
1367
- programs = new Map();
1368
- materialProperties.programs = programs;
1467
+ if ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {
1369
1468
 
1370
- }
1469
+ material.side = BackSide;
1470
+ material.needsUpdate = true;
1471
+ _this.renderBufferDirect( camera, scene, geometry, material, object, group );
1371
1472
 
1372
- let program = programs.get( programCacheKey );
1473
+ material.side = FrontSide;
1474
+ material.needsUpdate = true;
1475
+ _this.renderBufferDirect( camera, scene, geometry, material, object, group );
1373
1476
 
1374
- if ( program !== undefined ) {
1477
+ material.side = DoubleSide;
1375
1478
 
1376
- // early out if program and light state is identical
1479
+ } else {
1377
1480
 
1378
- if ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {
1481
+ _this.renderBufferDirect( camera, scene, geometry, material, object, group );
1379
1482
 
1380
- updateCommonMaterialProperties( material, parameters );
1483
+ }
1381
1484
 
1382
- return program;
1485
+ object.onAfterRender( _this, scene, camera, geometry, material, group );
1383
1486
 
1384
- }
1487
+ }
1385
1488
 
1386
- } else {
1489
+ function getProgram( material, scene, object ) {
1387
1490
 
1388
- parameters.uniforms = programCache.getUniforms( material );
1491
+ if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...
1389
1492
 
1390
- material.onBuild( object, parameters, _this );
1493
+ const materialProperties = properties.get( material );
1391
1494
 
1392
- material.onBeforeCompile( parameters, _this );
1495
+ const lights = currentRenderState.state.lights;
1496
+ const shadowsArray = currentRenderState.state.shadowsArray;
1393
1497
 
1394
- program = programCache.acquireProgram( parameters, programCacheKey );
1395
- programs.set( programCacheKey, program );
1498
+ const lightsStateVersion = lights.state.version;
1396
1499
 
1397
- materialProperties.uniforms = parameters.uniforms;
1500
+ const parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );
1501
+ const programCacheKey = programCache.getProgramCacheKey( parameters );
1398
1502
 
1399
- }
1503
+ let programs = materialProperties.programs;
1400
1504
 
1401
- const uniforms = materialProperties.uniforms;
1505
+ // always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change
1402
1506
 
1403
- if ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {
1507
+ materialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;
1508
+ materialProperties.fog = scene.fog;
1509
+ materialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );
1404
1510
 
1405
- uniforms.clippingPlanes = clipping.uniform;
1511
+ if ( programs === undefined ) {
1406
1512
 
1407
- }
1513
+ // new material
1408
1514
 
1409
- updateCommonMaterialProperties( material, parameters );
1515
+ material.addEventListener( 'dispose', onMaterialDispose );
1410
1516
 
1411
- // store the light setup it was created for
1517
+ programs = new Map();
1518
+ materialProperties.programs = programs;
1412
1519
 
1413
- materialProperties.needsLights = materialNeedsLights( material );
1414
- materialProperties.lightsStateVersion = lightsStateVersion;
1520
+ }
1415
1521
 
1416
- if ( materialProperties.needsLights ) {
1522
+ let program = programs.get( programCacheKey );
1417
1523
 
1418
- // wire up the material to this renderer's lighting state
1524
+ if ( program !== undefined ) {
1419
1525
 
1420
- uniforms.ambientLightColor.value = lights.state.ambient;
1421
- uniforms.lightProbe.value = lights.state.probe;
1422
- uniforms.directionalLights.value = lights.state.directional;
1423
- uniforms.directionalLightShadows.value = lights.state.directionalShadow;
1424
- uniforms.spotLights.value = lights.state.spot;
1425
- uniforms.spotLightShadows.value = lights.state.spotShadow;
1426
- uniforms.rectAreaLights.value = lights.state.rectArea;
1427
- uniforms.ltc_1.value = lights.state.rectAreaLTC1;
1428
- uniforms.ltc_2.value = lights.state.rectAreaLTC2;
1429
- uniforms.pointLights.value = lights.state.point;
1430
- uniforms.pointLightShadows.value = lights.state.pointShadow;
1431
- uniforms.hemisphereLights.value = lights.state.hemi;
1526
+ // early out if program and light state is identical
1432
1527
 
1433
- uniforms.directionalShadowMap.value = lights.state.directionalShadowMap;
1434
- uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
1435
- uniforms.spotShadowMap.value = lights.state.spotShadowMap;
1436
- uniforms.spotLightMatrix.value = lights.state.spotLightMatrix;
1437
- uniforms.spotLightMap.value = lights.state.spotLightMap;
1438
- uniforms.pointShadowMap.value = lights.state.pointShadowMap;
1439
- uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
1440
- // TODO (abelnation): add area lights shadow info to uniforms
1528
+ if ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {
1441
1529
 
1442
- }
1530
+ updateCommonMaterialProperties( material, parameters );
1443
1531
 
1444
- const progUniforms = program.getUniforms();
1445
- const uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
1532
+ return program;
1446
1533
 
1447
- materialProperties.currentProgram = program;
1448
- materialProperties.uniformsList = uniformsList;
1534
+ }
1449
1535
 
1450
- return program;
1536
+ } else {
1451
1537
 
1452
- }
1538
+ parameters.uniforms = programCache.getUniforms( material );
1453
1539
 
1454
- function updateCommonMaterialProperties( material, parameters ) {
1540
+ material.onBuild( object, parameters, _this );
1455
1541
 
1456
- const materialProperties = properties.get( material );
1542
+ material.onBeforeCompile( parameters, _this );
1457
1543
 
1458
- materialProperties.outputEncoding = parameters.outputEncoding;
1459
- materialProperties.instancing = parameters.instancing;
1460
- materialProperties.skinning = parameters.skinning;
1461
- materialProperties.morphTargets = parameters.morphTargets;
1462
- materialProperties.morphNormals = parameters.morphNormals;
1463
- materialProperties.morphColors = parameters.morphColors;
1464
- materialProperties.morphTargetsCount = parameters.morphTargetsCount;
1465
- materialProperties.numClippingPlanes = parameters.numClippingPlanes;
1466
- materialProperties.numIntersection = parameters.numClipIntersection;
1467
- materialProperties.vertexAlphas = parameters.vertexAlphas;
1468
- materialProperties.vertexTangents = parameters.vertexTangents;
1469
- materialProperties.toneMapping = parameters.toneMapping;
1544
+ program = programCache.acquireProgram( parameters, programCacheKey );
1545
+ programs.set( programCacheKey, program );
1470
1546
 
1471
- }
1547
+ materialProperties.uniforms = parameters.uniforms;
1472
1548
 
1473
- function setProgram( camera, scene, geometry, material, object ) {
1549
+ }
1474
1550
 
1475
- if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...
1551
+ const uniforms = materialProperties.uniforms;
1476
1552
 
1477
- textures.resetTextureUnits();
1553
+ if ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {
1478
1554
 
1479
- const fog = scene.fog;
1480
- const environment = material.isMeshStandardMaterial ? scene.environment : null;
1481
- const encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );
1482
- const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );
1483
- const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;
1484
- const vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;
1485
- const morphTargets = !! geometry.morphAttributes.position;
1486
- const morphNormals = !! geometry.morphAttributes.normal;
1487
- const morphColors = !! geometry.morphAttributes.color;
1488
- const toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;
1555
+ uniforms.clippingPlanes = clipping.uniform;
1489
1556
 
1490
- const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
1491
- const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
1557
+ }
1492
1558
 
1493
- const materialProperties = properties.get( material );
1494
- const lights = currentRenderState.state.lights;
1559
+ updateCommonMaterialProperties( material, parameters );
1495
1560
 
1496
- if ( _clippingEnabled === true ) {
1561
+ // store the light setup it was created for
1497
1562
 
1498
- if ( _localClippingEnabled === true || camera !== _currentCamera ) {
1563
+ materialProperties.needsLights = materialNeedsLights( material );
1564
+ materialProperties.lightsStateVersion = lightsStateVersion;
1499
1565
 
1500
- const useCache =
1501
- camera === _currentCamera &&
1502
- material.id === _currentMaterialId;
1566
+ if ( materialProperties.needsLights ) {
1503
1567
 
1504
- // we might want to call this function with some ClippingGroup
1505
- // object instead of the material, once it becomes feasible
1506
- // (#8465, #8379)
1507
- clipping.setState( material, camera, useCache );
1568
+ // wire up the material to this renderer's lighting state
1569
+
1570
+ uniforms.ambientLightColor.value = lights.state.ambient;
1571
+ uniforms.lightProbe.value = lights.state.probe;
1572
+ uniforms.directionalLights.value = lights.state.directional;
1573
+ uniforms.directionalLightShadows.value = lights.state.directionalShadow;
1574
+ uniforms.spotLights.value = lights.state.spot;
1575
+ uniforms.spotLightShadows.value = lights.state.spotShadow;
1576
+ uniforms.rectAreaLights.value = lights.state.rectArea;
1577
+ uniforms.ltc_1.value = lights.state.rectAreaLTC1;
1578
+ uniforms.ltc_2.value = lights.state.rectAreaLTC2;
1579
+ uniforms.pointLights.value = lights.state.point;
1580
+ uniforms.pointLightShadows.value = lights.state.pointShadow;
1581
+ uniforms.hemisphereLights.value = lights.state.hemi;
1582
+
1583
+ uniforms.directionalShadowMap.value = lights.state.directionalShadowMap;
1584
+ uniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;
1585
+ uniforms.spotShadowMap.value = lights.state.spotShadowMap;
1586
+ uniforms.spotLightMatrix.value = lights.state.spotLightMatrix;
1587
+ uniforms.spotLightMap.value = lights.state.spotLightMap;
1588
+ uniforms.pointShadowMap.value = lights.state.pointShadowMap;
1589
+ uniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;
1590
+ // TODO (abelnation): add area lights shadow info to uniforms
1508
1591
 
1509
1592
  }
1510
1593
 
1511
- }
1594
+ const progUniforms = program.getUniforms();
1595
+ const uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );
1512
1596
 
1513
- //
1597
+ materialProperties.currentProgram = program;
1598
+ materialProperties.uniformsList = uniformsList;
1514
1599
 
1515
- let needsProgramChange = false;
1600
+ return program;
1516
1601
 
1517
- if ( material.version === materialProperties.__version ) {
1602
+ }
1518
1603
 
1519
- if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {
1604
+ function updateCommonMaterialProperties( material, parameters ) {
1520
1605
 
1521
- needsProgramChange = true;
1606
+ const materialProperties = properties.get( material );
1522
1607
 
1523
- } else if ( materialProperties.outputEncoding !== encoding ) {
1608
+ materialProperties.outputColorSpace = parameters.outputColorSpace;
1609
+ materialProperties.instancing = parameters.instancing;
1610
+ materialProperties.skinning = parameters.skinning;
1611
+ materialProperties.morphTargets = parameters.morphTargets;
1612
+ materialProperties.morphNormals = parameters.morphNormals;
1613
+ materialProperties.morphColors = parameters.morphColors;
1614
+ materialProperties.morphTargetsCount = parameters.morphTargetsCount;
1615
+ materialProperties.numClippingPlanes = parameters.numClippingPlanes;
1616
+ materialProperties.numIntersection = parameters.numClipIntersection;
1617
+ materialProperties.vertexAlphas = parameters.vertexAlphas;
1618
+ materialProperties.vertexTangents = parameters.vertexTangents;
1619
+ materialProperties.toneMapping = parameters.toneMapping;
1524
1620
 
1525
- needsProgramChange = true;
1621
+ }
1526
1622
 
1527
- } else if ( object.isInstancedMesh && materialProperties.instancing === false ) {
1623
+ function setProgram( camera, scene, geometry, material, object ) {
1528
1624
 
1529
- needsProgramChange = true;
1625
+ if ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...
1530
1626
 
1531
- } else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {
1627
+ textures.resetTextureUnits();
1532
1628
 
1533
- needsProgramChange = true;
1629
+ const fog = scene.fog;
1630
+ const environment = material.isMeshStandardMaterial ? scene.environment : null;
1631
+ const colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );
1632
+ const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );
1633
+ const vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;
1634
+ const vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );
1635
+ const morphTargets = !! geometry.morphAttributes.position;
1636
+ const morphNormals = !! geometry.morphAttributes.normal;
1637
+ const morphColors = !! geometry.morphAttributes.color;
1638
+ const toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;
1534
1639
 
1535
- } else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {
1640
+ const morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;
1641
+ const morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;
1536
1642
 
1537
- needsProgramChange = true;
1643
+ const materialProperties = properties.get( material );
1644
+ const lights = currentRenderState.state.lights;
1538
1645
 
1539
- } else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {
1646
+ if ( _clippingEnabled === true ) {
1540
1647
 
1541
- needsProgramChange = true;
1648
+ if ( _localClippingEnabled === true || camera !== _currentCamera ) {
1542
1649
 
1543
- } else if ( materialProperties.envMap !== envMap ) {
1650
+ const useCache =
1651
+ camera === _currentCamera &&
1652
+ material.id === _currentMaterialId;
1544
1653
 
1545
- needsProgramChange = true;
1654
+ // we might want to call this function with some ClippingGroup
1655
+ // object instead of the material, once it becomes feasible
1656
+ // (#8465, #8379)
1657
+ clipping.setState( material, camera, useCache );
1546
1658
 
1547
- } else if ( material.fog === true && materialProperties.fog !== fog ) {
1659
+ }
1548
1660
 
1549
- needsProgramChange = true;
1661
+ }
1550
1662
 
1551
- } else if ( materialProperties.numClippingPlanes !== undefined &&
1552
- ( materialProperties.numClippingPlanes !== clipping.numPlanes ||
1553
- materialProperties.numIntersection !== clipping.numIntersection ) ) {
1663
+ //
1554
1664
 
1555
- needsProgramChange = true;
1665
+ let needsProgramChange = false;
1556
1666
 
1557
- } else if ( materialProperties.vertexAlphas !== vertexAlphas ) {
1667
+ if ( material.version === materialProperties.__version ) {
1558
1668
 
1559
- needsProgramChange = true;
1669
+ if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {
1560
1670
 
1561
- } else if ( materialProperties.vertexTangents !== vertexTangents ) {
1671
+ needsProgramChange = true;
1562
1672
 
1563
- needsProgramChange = true;
1673
+ } else if ( materialProperties.outputColorSpace !== colorSpace ) {
1564
1674
 
1565
- } else if ( materialProperties.morphTargets !== morphTargets ) {
1675
+ needsProgramChange = true;
1566
1676
 
1567
- needsProgramChange = true;
1677
+ } else if ( object.isInstancedMesh && materialProperties.instancing === false ) {
1568
1678
 
1569
- } else if ( materialProperties.morphNormals !== morphNormals ) {
1679
+ needsProgramChange = true;
1570
1680
 
1571
- needsProgramChange = true;
1681
+ } else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {
1572
1682
 
1573
- } else if ( materialProperties.morphColors !== morphColors ) {
1683
+ needsProgramChange = true;
1574
1684
 
1575
- needsProgramChange = true;
1685
+ } else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {
1576
1686
 
1577
- } else if ( materialProperties.toneMapping !== toneMapping ) {
1687
+ needsProgramChange = true;
1578
1688
 
1579
- needsProgramChange = true;
1689
+ } else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {
1580
1690
 
1581
- } else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {
1691
+ needsProgramChange = true;
1582
1692
 
1583
- needsProgramChange = true;
1693
+ } else if ( materialProperties.envMap !== envMap ) {
1584
1694
 
1585
- }
1695
+ needsProgramChange = true;
1586
1696
 
1587
- } else {
1697
+ } else if ( material.fog === true && materialProperties.fog !== fog ) {
1588
1698
 
1589
- needsProgramChange = true;
1590
- materialProperties.__version = material.version;
1699
+ needsProgramChange = true;
1591
1700
 
1592
- }
1701
+ } else if ( materialProperties.numClippingPlanes !== undefined &&
1702
+ ( materialProperties.numClippingPlanes !== clipping.numPlanes ||
1703
+ materialProperties.numIntersection !== clipping.numIntersection ) ) {
1593
1704
 
1594
- //
1705
+ needsProgramChange = true;
1595
1706
 
1596
- let program = materialProperties.currentProgram;
1707
+ } else if ( materialProperties.vertexAlphas !== vertexAlphas ) {
1597
1708
 
1598
- if ( needsProgramChange === true ) {
1709
+ needsProgramChange = true;
1599
1710
 
1600
- program = getProgram( material, scene, object );
1711
+ } else if ( materialProperties.vertexTangents !== vertexTangents ) {
1601
1712
 
1602
- }
1713
+ needsProgramChange = true;
1603
1714
 
1604
- let refreshProgram = false;
1605
- let refreshMaterial = false;
1606
- let refreshLights = false;
1715
+ } else if ( materialProperties.morphTargets !== morphTargets ) {
1607
1716
 
1608
- const p_uniforms = program.getUniforms(),
1609
- m_uniforms = materialProperties.uniforms;
1717
+ needsProgramChange = true;
1610
1718
 
1611
- if ( state.useProgram( program.program ) ) {
1719
+ } else if ( materialProperties.morphNormals !== morphNormals ) {
1612
1720
 
1613
- refreshProgram = true;
1614
- refreshMaterial = true;
1615
- refreshLights = true;
1721
+ needsProgramChange = true;
1616
1722
 
1617
- }
1723
+ } else if ( materialProperties.morphColors !== morphColors ) {
1618
1724
 
1619
- if ( material.id !== _currentMaterialId ) {
1725
+ needsProgramChange = true;
1620
1726
 
1621
- _currentMaterialId = material.id;
1727
+ } else if ( materialProperties.toneMapping !== toneMapping ) {
1622
1728
 
1623
- refreshMaterial = true;
1729
+ needsProgramChange = true;
1624
1730
 
1625
- }
1731
+ } else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {
1626
1732
 
1627
- if ( refreshProgram || _currentCamera !== camera ) {
1733
+ needsProgramChange = true;
1628
1734
 
1629
- p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
1735
+ }
1630
1736
 
1631
- if ( capabilities.logarithmicDepthBuffer ) {
1737
+ } else {
1632
1738
 
1633
- p_uniforms.setValue( _gl, 'logDepthBufFC',
1634
- 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
1739
+ needsProgramChange = true;
1740
+ materialProperties.__version = material.version;
1635
1741
 
1636
1742
  }
1637
1743
 
1638
- if ( _currentCamera !== camera ) {
1744
+ //
1639
1745
 
1640
- _currentCamera = camera;
1746
+ let program = materialProperties.currentProgram;
1641
1747
 
1642
- // lighting uniforms depend on the camera so enforce an update
1643
- // now, in case this material supports lights - or later, when
1644
- // the next material that does gets activated:
1748
+ if ( needsProgramChange === true ) {
1645
1749
 
1646
- refreshMaterial = true; // set to true on material change
1647
- refreshLights = true; // remains set until update done
1750
+ program = getProgram( material, scene, object );
1648
1751
 
1649
1752
  }
1650
1753
 
1651
- // load material specific uniforms
1652
- // (shader material also gets them for the sake of genericity)
1754
+ let refreshProgram = false;
1755
+ let refreshMaterial = false;
1756
+ let refreshLights = false;
1653
1757
 
1654
- if ( material.isShaderMaterial ||
1655
- material.isMeshPhongMaterial ||
1656
- material.isMeshToonMaterial ||
1657
- material.isMeshStandardMaterial ||
1658
- material.envMap ) {
1758
+ const p_uniforms = program.getUniforms(),
1759
+ m_uniforms = materialProperties.uniforms;
1659
1760
 
1660
- const uCamPos = p_uniforms.map.cameraPosition;
1761
+ if ( state.useProgram( program.program ) ) {
1661
1762
 
1662
- if ( uCamPos !== undefined ) {
1763
+ refreshProgram = true;
1764
+ refreshMaterial = true;
1765
+ refreshLights = true;
1663
1766
 
1664
- uCamPos.setValue( _gl,
1665
- _vector3.setFromMatrixPosition( camera.matrixWorld ) );
1767
+ }
1666
1768
 
1667
- }
1769
+ if ( material.id !== _currentMaterialId ) {
1770
+
1771
+ _currentMaterialId = material.id;
1772
+
1773
+ refreshMaterial = true;
1668
1774
 
1669
1775
  }
1670
1776
 
1671
- if ( material.isMeshPhongMaterial ||
1672
- material.isMeshToonMaterial ||
1673
- material.isMeshLambertMaterial ||
1674
- material.isMeshBasicMaterial ||
1675
- material.isMeshStandardMaterial ||
1676
- material.isShaderMaterial ) {
1777
+ if ( refreshProgram || _currentCamera !== camera ) {
1677
1778
 
1678
- p_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );
1779
+ p_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );
1679
1780
 
1680
- }
1781
+ if ( capabilities.logarithmicDepthBuffer ) {
1681
1782
 
1682
- if ( material.isMeshPhongMaterial ||
1683
- material.isMeshToonMaterial ||
1684
- material.isMeshLambertMaterial ||
1685
- material.isMeshBasicMaterial ||
1686
- material.isMeshStandardMaterial ||
1687
- material.isShaderMaterial ||
1688
- material.isShadowMaterial ||
1689
- object.isSkinnedMesh ) {
1783
+ p_uniforms.setValue( _gl, 'logDepthBufFC',
1784
+ 2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );
1690
1785
 
1691
- p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
1786
+ }
1692
1787
 
1693
- }
1788
+ if ( _currentCamera !== camera ) {
1694
1789
 
1695
- }
1790
+ _currentCamera = camera;
1696
1791
 
1697
- // skinning and morph target uniforms must be set even if material didn't change
1698
- // auto-setting of texture unit for bone and morph texture must go before other textures
1699
- // otherwise textures used for skinning and morphing can take over texture units reserved for other material textures
1792
+ // lighting uniforms depend on the camera so enforce an update
1793
+ // now, in case this material supports lights - or later, when
1794
+ // the next material that does gets activated:
1700
1795
 
1701
- if ( object.isSkinnedMesh ) {
1796
+ refreshMaterial = true; // set to true on material change
1797
+ refreshLights = true; // remains set until update done
1702
1798
 
1703
- p_uniforms.setOptional( _gl, object, 'bindMatrix' );
1704
- p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );
1799
+ }
1705
1800
 
1706
- const skeleton = object.skeleton;
1801
+ // load material specific uniforms
1802
+ // (shader material also gets them for the sake of genericity)
1707
1803
 
1708
- if ( skeleton ) {
1804
+ if ( material.isShaderMaterial ||
1805
+ material.isMeshPhongMaterial ||
1806
+ material.isMeshToonMaterial ||
1807
+ material.isMeshStandardMaterial ||
1808
+ material.envMap ) {
1709
1809
 
1710
- if ( capabilities.floatVertexTextures ) {
1810
+ const uCamPos = p_uniforms.map.cameraPosition;
1711
1811
 
1712
- if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
1812
+ if ( uCamPos !== undefined ) {
1713
1813
 
1714
- p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );
1715
- p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
1814
+ uCamPos.setValue( _gl,
1815
+ _vector3.setFromMatrixPosition( camera.matrixWorld ) );
1716
1816
 
1717
- } else {
1817
+ }
1818
+
1819
+ }
1820
+
1821
+ if ( material.isMeshPhongMaterial ||
1822
+ material.isMeshToonMaterial ||
1823
+ material.isMeshLambertMaterial ||
1824
+ material.isMeshBasicMaterial ||
1825
+ material.isMeshStandardMaterial ||
1826
+ material.isShaderMaterial ) {
1827
+
1828
+ p_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );
1829
+
1830
+ }
1718
1831
 
1719
- console.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' );
1832
+ if ( material.isMeshPhongMaterial ||
1833
+ material.isMeshToonMaterial ||
1834
+ material.isMeshLambertMaterial ||
1835
+ material.isMeshBasicMaterial ||
1836
+ material.isMeshStandardMaterial ||
1837
+ material.isShaderMaterial ||
1838
+ material.isShadowMaterial ||
1839
+ object.isSkinnedMesh ) {
1840
+
1841
+ p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
1720
1842
 
1721
1843
  }
1722
1844
 
1723
1845
  }
1724
1846
 
1725
- }
1847
+ // skinning and morph target uniforms must be set even if material didn't change
1848
+ // auto-setting of texture unit for bone and morph texture must go before other textures
1849
+ // otherwise textures used for skinning and morphing can take over texture units reserved for other material textures
1726
1850
 
1727
- const morphAttributes = geometry.morphAttributes;
1851
+ if ( object.isSkinnedMesh ) {
1728
1852
 
1729
- if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) {
1853
+ p_uniforms.setOptional( _gl, object, 'bindMatrix' );
1854
+ p_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );
1730
1855
 
1731
- morphtargets.update( object, geometry, material, program );
1856
+ const skeleton = object.skeleton;
1732
1857
 
1733
- }
1858
+ if ( skeleton ) {
1734
1859
 
1735
- if ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {
1860
+ if ( capabilities.floatVertexTextures ) {
1736
1861
 
1737
- materialProperties.receiveShadow = object.receiveShadow;
1738
- p_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );
1862
+ if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
1739
1863
 
1740
- }
1864
+ p_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );
1865
+ p_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );
1741
1866
 
1742
- // https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512
1867
+ } else {
1743
1868
 
1744
- if ( material.isMeshGouraudMaterial && material.envMap !== null ) {
1869
+ console.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' );
1745
1870
 
1746
- m_uniforms.envMap.value = envMap;
1871
+ }
1747
1872
 
1748
- m_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;
1873
+ }
1749
1874
 
1750
- }
1875
+ }
1751
1876
 
1752
- if ( refreshMaterial ) {
1877
+ const morphAttributes = geometry.morphAttributes;
1753
1878
 
1754
- p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
1879
+ if ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) {
1755
1880
 
1756
- if ( materialProperties.needsLights ) {
1881
+ morphtargets.update( object, geometry, program );
1757
1882
 
1758
- // the current material requires lighting info
1883
+ }
1759
1884
 
1760
- // note: all lighting uniforms are always set correctly
1761
- // they simply reference the renderer's state for their
1762
- // values
1763
- //
1764
- // use the current material's .needsUpdate flags to set
1765
- // the GL state when required
1885
+ if ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {
1766
1886
 
1767
- markUniformsLightsNeedsUpdate( m_uniforms, refreshLights );
1887
+ materialProperties.receiveShadow = object.receiveShadow;
1888
+ p_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );
1768
1889
 
1769
1890
  }
1770
1891
 
1771
- // refresh uniforms common to several materials
1892
+ // https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512
1893
+
1894
+ if ( material.isMeshGouraudMaterial && material.envMap !== null ) {
1772
1895
 
1773
- if ( fog && material.fog === true ) {
1896
+ m_uniforms.envMap.value = envMap;
1774
1897
 
1775
- materials.refreshFogUniforms( m_uniforms, fog );
1898
+ m_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;
1776
1899
 
1777
1900
  }
1778
1901
 
1779
- materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );
1902
+ if ( refreshMaterial ) {
1780
1903
 
1781
- WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
1904
+ p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );
1782
1905
 
1783
- }
1906
+ if ( materialProperties.needsLights ) {
1784
1907
 
1785
- if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {
1908
+ // the current material requires lighting info
1786
1909
 
1787
- WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
1788
- material.uniformsNeedUpdate = false;
1910
+ // note: all lighting uniforms are always set correctly
1911
+ // they simply reference the renderer's state for their
1912
+ // values
1913
+ //
1914
+ // use the current material's .needsUpdate flags to set
1915
+ // the GL state when required
1789
1916
 
1790
- }
1917
+ markUniformsLightsNeedsUpdate( m_uniforms, refreshLights );
1918
+
1919
+ }
1791
1920
 
1792
- if ( material.isSpriteMaterial ) {
1921
+ // refresh uniforms common to several materials
1793
1922
 
1794
- p_uniforms.setValue( _gl, 'center', object.center );
1923
+ if ( fog && material.fog === true ) {
1795
1924
 
1796
- }
1925
+ materials.refreshFogUniforms( m_uniforms, fog );
1797
1926
 
1798
- // common matrices
1927
+ }
1799
1928
 
1800
- p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
1801
- p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
1802
- p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
1929
+ materials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );
1803
1930
 
1804
- // UBOs
1931
+ WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
1805
1932
 
1806
- if ( material.isShaderMaterial || material.isRawShaderMaterial ) {
1933
+ }
1807
1934
 
1808
- const groups = material.uniformsGroups;
1935
+ if ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {
1809
1936
 
1810
- for ( let i = 0, l = groups.length; i < l; i ++ ) {
1937
+ WebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );
1938
+ material.uniformsNeedUpdate = false;
1811
1939
 
1812
- if ( capabilities.isWebGL2 ) {
1940
+ }
1813
1941
 
1814
- const group = groups[ i ];
1942
+ if ( material.isSpriteMaterial ) {
1815
1943
 
1816
- uniformsGroups.update( group, program );
1817
- uniformsGroups.bind( group, program );
1944
+ p_uniforms.setValue( _gl, 'center', object.center );
1818
1945
 
1819
- } else {
1946
+ }
1820
1947
 
1821
- console.warn( 'THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.' );
1948
+ // common matrices
1949
+
1950
+ p_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );
1951
+ p_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );
1952
+ p_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );
1953
+
1954
+ // UBOs
1955
+
1956
+ if ( material.isShaderMaterial || material.isRawShaderMaterial ) {
1957
+
1958
+ const groups = material.uniformsGroups;
1959
+
1960
+ for ( let i = 0, l = groups.length; i < l; i ++ ) {
1961
+
1962
+ if ( capabilities.isWebGL2 ) {
1963
+
1964
+ const group = groups[ i ];
1965
+
1966
+ uniformsGroups.update( group, program );
1967
+ uniformsGroups.bind( group, program );
1968
+
1969
+ } else {
1970
+
1971
+ console.warn( 'THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.' );
1972
+
1973
+ }
1822
1974
 
1823
1975
  }
1824
1976
 
1825
1977
  }
1826
1978
 
1979
+ return program;
1980
+
1827
1981
  }
1828
1982
 
1829
- return program;
1983
+ // If uniforms are marked as clean, they don't need to be loaded to the GPU.
1830
1984
 
1831
- }
1985
+ function markUniformsLightsNeedsUpdate( uniforms, value ) {
1832
1986
 
1833
- // If uniforms are marked as clean, they don't need to be loaded to the GPU.
1987
+ uniforms.ambientLightColor.needsUpdate = value;
1988
+ uniforms.lightProbe.needsUpdate = value;
1834
1989
 
1835
- function markUniformsLightsNeedsUpdate( uniforms, value ) {
1990
+ uniforms.directionalLights.needsUpdate = value;
1991
+ uniforms.directionalLightShadows.needsUpdate = value;
1992
+ uniforms.pointLights.needsUpdate = value;
1993
+ uniforms.pointLightShadows.needsUpdate = value;
1994
+ uniforms.spotLights.needsUpdate = value;
1995
+ uniforms.spotLightShadows.needsUpdate = value;
1996
+ uniforms.rectAreaLights.needsUpdate = value;
1997
+ uniforms.hemisphereLights.needsUpdate = value;
1836
1998
 
1837
- uniforms.ambientLightColor.needsUpdate = value;
1838
- uniforms.lightProbe.needsUpdate = value;
1999
+ }
1839
2000
 
1840
- uniforms.directionalLights.needsUpdate = value;
1841
- uniforms.directionalLightShadows.needsUpdate = value;
1842
- uniforms.pointLights.needsUpdate = value;
1843
- uniforms.pointLightShadows.needsUpdate = value;
1844
- uniforms.spotLights.needsUpdate = value;
1845
- uniforms.spotLightShadows.needsUpdate = value;
1846
- uniforms.rectAreaLights.needsUpdate = value;
1847
- uniforms.hemisphereLights.needsUpdate = value;
2001
+ function materialNeedsLights( material ) {
1848
2002
 
1849
- }
2003
+ return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||
2004
+ material.isMeshStandardMaterial || material.isShadowMaterial ||
2005
+ ( material.isShaderMaterial && material.lights === true );
1850
2006
 
1851
- function materialNeedsLights( material ) {
2007
+ }
1852
2008
 
1853
- return material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||
1854
- material.isMeshStandardMaterial || material.isShadowMaterial ||
1855
- ( material.isShaderMaterial && material.lights === true );
2009
+ this.setTexture2D = ( function () {
1856
2010
 
1857
- }
2011
+ var warned = false;
1858
2012
 
1859
- this.setTexture2D = ( function () {
2013
+ // backwards compatibility: peel texture.texture
2014
+ return function setTexture2D( texture, slot ) {
1860
2015
 
1861
- var warned = false;
2016
+ if ( texture && texture.isWebGLRenderTarget ) {
1862
2017
 
1863
- // backwards compatibility: peel texture.texture
1864
- return function setTexture2D( texture, slot ) {
2018
+ if ( ! warned ) {
1865
2019
 
1866
- if ( texture && texture.isWebGLRenderTarget ) {
2020
+ console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." );
2021
+ warned = true;
1867
2022
 
1868
- if ( ! warned ) {
2023
+ }
1869
2024
 
1870
- console.warn( "THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead." );
1871
- warned = true;
2025
+ texture = texture.texture;
1872
2026
 
1873
2027
  }
1874
2028
 
1875
- texture = texture.texture;
1876
-
1877
- }
2029
+ textures.setTexture2D( texture, slot );
1878
2030
 
1879
- textures.setTexture2D( texture, slot );
2031
+ };
1880
2032
 
1881
- };
2033
+ }() );
1882
2034
 
1883
- }() );
2035
+ this.getActiveCubeFace = function () {
1884
2036
 
1885
- this.getActiveCubeFace = function () {
2037
+ return _currentActiveCubeFace;
1886
2038
 
1887
- return _currentActiveCubeFace;
2039
+ };
1888
2040
 
1889
- };
2041
+ this.getActiveMipmapLevel = function () {
1890
2042
 
1891
- this.getActiveMipmapLevel = function () {
2043
+ return _currentActiveMipmapLevel;
1892
2044
 
1893
- return _currentActiveMipmapLevel;
2045
+ };
1894
2046
 
1895
- };
2047
+ this.getRenderTarget = function () {
1896
2048
 
1897
- this.getRenderTarget = function () {
2049
+ return _currentRenderTarget;
1898
2050
 
1899
- return _currentRenderTarget;
2051
+ };
1900
2052
 
1901
- };
2053
+ this.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {
1902
2054
 
1903
- this.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {
2055
+ properties.get( renderTarget.texture ).__webglTexture = colorTexture;
2056
+ properties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;
1904
2057
 
1905
- properties.get( renderTarget.texture ).__webglTexture = colorTexture;
1906
- properties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;
2058
+ const renderTargetProperties = properties.get( renderTarget );
2059
+ renderTargetProperties.__hasExternalTextures = true;
1907
2060
 
1908
- const renderTargetProperties = properties.get( renderTarget );
1909
- renderTargetProperties.__hasExternalTextures = true;
2061
+ if ( renderTargetProperties.__hasExternalTextures ) {
1910
2062
 
1911
- if ( renderTargetProperties.__hasExternalTextures ) {
2063
+ renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;
1912
2064
 
1913
- renderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;
2065
+ if ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {
1914
2066
 
1915
- if ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {
2067
+ // The multisample_render_to_texture extension doesn't work properly if there
2068
+ // are midframe flushes and an external depth buffer. Disable use of the extension.
2069
+ if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {
1916
2070
 
1917
- // The multisample_render_to_texture extension doesn't work properly if there
1918
- // are midframe flushes and an external depth buffer. Disable use of the extension.
1919
- if ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {
2071
+ console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );
2072
+ renderTargetProperties.__useRenderToTexture = false;
1920
2073
 
1921
- console.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );
1922
- renderTargetProperties.__useRenderToTexture = false;
2074
+ }
1923
2075
 
1924
2076
  }
1925
2077
 
1926
2078
  }
1927
2079
 
1928
- }
2080
+ };
1929
2081
 
1930
- };
2082
+ this.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {
1931
2083
 
1932
- this.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {
2084
+ const renderTargetProperties = properties.get( renderTarget );
2085
+ renderTargetProperties.__webglFramebuffer = defaultFramebuffer;
2086
+ renderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;
1933
2087
 
1934
- const renderTargetProperties = properties.get( renderTarget );
1935
- renderTargetProperties.__webglFramebuffer = defaultFramebuffer;
1936
- renderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;
2088
+ };
1937
2089
 
1938
- };
2090
+ this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {
1939
2091
 
1940
- this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {
2092
+ _currentRenderTarget = renderTarget;
2093
+ _currentActiveCubeFace = activeCubeFace;
2094
+ _currentActiveMipmapLevel = activeMipmapLevel;
1941
2095
 
1942
- _currentRenderTarget = renderTarget;
1943
- _currentActiveCubeFace = activeCubeFace;
1944
- _currentActiveMipmapLevel = activeMipmapLevel;
2096
+ let useDefaultFramebuffer = true;
2097
+ let framebuffer = null;
2098
+ let isCube = false;
2099
+ let isRenderTarget3D = false;
1945
2100
 
1946
- let useDefaultFramebuffer = true;
1947
- let framebuffer = null;
1948
- let isCube = false;
1949
- let isRenderTarget3D = false;
2101
+ if ( renderTarget ) {
1950
2102
 
1951
- if ( renderTarget ) {
2103
+ const renderTargetProperties = properties.get( renderTarget );
1952
2104
 
1953
- const renderTargetProperties = properties.get( renderTarget );
2105
+ if ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {
1954
2106
 
1955
- if ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {
2107
+ // We need to make sure to rebind the framebuffer.
2108
+ state.bindFramebuffer( _gl.FRAMEBUFFER, null );
2109
+ useDefaultFramebuffer = false;
1956
2110
 
1957
- // We need to make sure to rebind the framebuffer.
1958
- state.bindFramebuffer( _gl.FRAMEBUFFER, null );
1959
- useDefaultFramebuffer = false;
2111
+ } else if ( renderTargetProperties.__webglFramebuffer === undefined ) {
1960
2112
 
1961
- } else if ( renderTargetProperties.__webglFramebuffer === undefined ) {
2113
+ textures.setupRenderTarget( renderTarget );
1962
2114
 
1963
- textures.setupRenderTarget( renderTarget );
2115
+ } else if ( renderTargetProperties.__hasExternalTextures ) {
1964
2116
 
1965
- } else if ( renderTargetProperties.__hasExternalTextures ) {
2117
+ // Color and depth texture must be rebound in order for the swapchain to update.
2118
+ textures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );
1966
2119
 
1967
- // Color and depth texture must be rebound in order for the swapchain to update.
1968
- textures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );
2120
+ }
1969
2121
 
1970
- }
2122
+ const texture = renderTarget.texture;
2123
+
2124
+ if ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {
1971
2125
 
1972
- const texture = renderTarget.texture;
2126
+ isRenderTarget3D = true;
1973
2127
 
1974
- if ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {
2128
+ }
1975
2129
 
1976
- isRenderTarget3D = true;
2130
+ const __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;
1977
2131
 
1978
- }
2132
+ if ( renderTarget.isWebGLCubeRenderTarget ) {
1979
2133
 
1980
- const __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;
2134
+ framebuffer = __webglFramebuffer[ activeCubeFace ];
2135
+ isCube = true;
1981
2136
 
1982
- if ( renderTarget.isWebGLCubeRenderTarget ) {
2137
+ } else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {
2138
+
2139
+ framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;
2140
+
2141
+ } else {
1983
2142
 
1984
- framebuffer = __webglFramebuffer[ activeCubeFace ];
1985
- isCube = true;
2143
+ framebuffer = __webglFramebuffer;
1986
2144
 
1987
- } else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {
2145
+ }
1988
2146
 
1989
- framebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;
2147
+ _currentViewport.copy( renderTarget.viewport );
2148
+ _currentScissor.copy( renderTarget.scissor );
2149
+ _currentScissorTest = renderTarget.scissorTest;
1990
2150
 
1991
2151
  } else {
1992
2152
 
1993
- framebuffer = __webglFramebuffer;
2153
+ _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();
2154
+ _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();
2155
+ _currentScissorTest = _scissorTest;
1994
2156
 
1995
2157
  }
1996
2158
 
1997
- _currentViewport.copy( renderTarget.viewport );
1998
- _currentScissor.copy( renderTarget.scissor );
1999
- _currentScissorTest = renderTarget.scissorTest;
2159
+ const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2000
2160
 
2001
- } else {
2161
+ if ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {
2002
2162
 
2003
- _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();
2004
- _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();
2005
- _currentScissorTest = _scissorTest;
2163
+ state.drawBuffers( renderTarget, framebuffer );
2006
2164
 
2007
- }
2165
+ }
2008
2166
 
2009
- const framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2167
+ state.viewport( _currentViewport );
2168
+ state.scissor( _currentScissor );
2169
+ state.setScissorTest( _currentScissorTest );
2010
2170
 
2011
- if ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {
2171
+ if ( isCube ) {
2012
2172
 
2013
- state.drawBuffers( renderTarget, framebuffer );
2173
+ const textureProperties = properties.get( renderTarget.texture );
2174
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );
2014
2175
 
2015
- }
2176
+ } else if ( isRenderTarget3D ) {
2177
+
2178
+ const textureProperties = properties.get( renderTarget.texture );
2179
+ const layer = activeCubeFace || 0;
2180
+ _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );
2016
2181
 
2017
- state.viewport( _currentViewport );
2018
- state.scissor( _currentScissor );
2019
- state.setScissorTest( _currentScissorTest );
2182
+ }
2020
2183
 
2021
- if ( isCube ) {
2184
+ _currentMaterialId = - 1; // reset current material to ensure correct uniform bindings
2022
2185
 
2023
- const textureProperties = properties.get( renderTarget.texture );
2024
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );
2186
+ };
2025
2187
 
2026
- } else if ( isRenderTarget3D ) {
2188
+ this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {
2027
2189
 
2028
- const textureProperties = properties.get( renderTarget.texture );
2029
- const layer = activeCubeFace || 0;
2030
- _gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );
2190
+ if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2031
2191
 
2032
- }
2192
+ console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
2193
+ return;
2033
2194
 
2034
- _currentMaterialId = - 1; // reset current material to ensure correct uniform bindings
2195
+ }
2035
2196
 
2036
- };
2197
+ let framebuffer = properties.get( renderTarget ).__webglFramebuffer;
2037
2198
 
2038
- this.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {
2199
+ if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {
2039
2200
 
2040
- if ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {
2201
+ framebuffer = framebuffer[ activeCubeFaceIndex ];
2041
2202
 
2042
- console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );
2043
- return;
2203
+ }
2044
2204
 
2045
- }
2205
+ if ( framebuffer ) {
2046
2206
 
2047
- let framebuffer = properties.get( renderTarget ).__webglFramebuffer;
2207
+ state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2048
2208
 
2049
- if ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {
2209
+ try {
2050
2210
 
2051
- framebuffer = framebuffer[ activeCubeFaceIndex ];
2211
+ const texture = renderTarget.texture;
2212
+ const textureFormat = texture.format;
2213
+ const textureType = texture.type;
2052
2214
 
2053
- }
2215
+ if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
2054
2216
 
2055
- if ( framebuffer ) {
2217
+ console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
2218
+ return;
2056
2219
 
2057
- state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2220
+ }
2058
2221
 
2059
- try {
2222
+ const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );
2060
2223
 
2061
- const texture = renderTarget.texture;
2062
- const textureFormat = texture.format;
2063
- const textureType = texture.type;
2224
+ if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
2225
+ ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox
2226
+ ! halfFloatSupportedByExt ) {
2064
2227
 
2065
- if ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {
2228
+ console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
2229
+ return;
2066
2230
 
2067
- console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );
2068
- return;
2231
+ }
2069
2232
 
2070
- }
2233
+ // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)
2234
+
2235
+ if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
2236
+
2237
+ _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );
2238
+
2239
+ }
2071
2240
 
2072
- const halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );
2241
+ } finally {
2073
2242
 
2074
- if ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)
2075
- ! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox
2076
- ! halfFloatSupportedByExt ) {
2243
+ // restore framebuffer of current render target if necessary
2077
2244
 
2078
- console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );
2079
- return;
2245
+ const framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;
2246
+ state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2080
2247
 
2081
2248
  }
2082
2249
 
2083
- // the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)
2250
+ }
2084
2251
 
2085
- if ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {
2252
+ };
2086
2253
 
2087
- _gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );
2254
+ this.copyFramebufferToTexture = function ( position, texture, level = 0 ) {
2088
2255
 
2089
- }
2256
+ const levelScale = Math.pow( 2, - level );
2257
+ const width = Math.floor( texture.image.width * levelScale );
2258
+ const height = Math.floor( texture.image.height * levelScale );
2090
2259
 
2091
- } finally {
2260
+ textures.setTexture2D( texture, 0 );
2092
2261
 
2093
- // restore framebuffer of current render target if necessary
2262
+ _gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );
2094
2263
 
2095
- const framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;
2096
- state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );
2264
+ state.unbindTexture();
2097
2265
 
2098
- }
2266
+ };
2099
2267
 
2100
- }
2268
+ this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {
2101
2269
 
2102
- };
2270
+ const width = srcTexture.image.width;
2271
+ const height = srcTexture.image.height;
2272
+ const glFormat = utils.convert( dstTexture.format );
2273
+ const glType = utils.convert( dstTexture.type );
2103
2274
 
2104
- this.copyFramebufferToTexture = function ( position, texture, level = 0 ) {
2275
+ textures.setTexture2D( dstTexture, 0 );
2105
2276
 
2106
- const levelScale = Math.pow( 2, - level );
2107
- const width = Math.floor( texture.image.width * levelScale );
2108
- const height = Math.floor( texture.image.height * levelScale );
2277
+ // As another texture upload may have changed pixelStorei
2278
+ // parameters, make sure they are correct for the dstTexture
2279
+ _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
2280
+ _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2281
+ _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2109
2282
 
2110
- textures.setTexture2D( texture, 0 );
2283
+ if ( srcTexture.isDataTexture ) {
2111
2284
 
2112
- _gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, position.x, position.y, width, height );
2285
+ _gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );
2113
2286
 
2114
- state.unbindTexture();
2287
+ } else {
2115
2288
 
2116
- };
2289
+ if ( srcTexture.isCompressedTexture ) {
2117
2290
 
2118
- this.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {
2291
+ _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );
2119
2292
 
2120
- const width = srcTexture.image.width;
2121
- const height = srcTexture.image.height;
2122
- const glFormat = utils.convert( dstTexture.format );
2123
- const glType = utils.convert( dstTexture.type );
2293
+ } else {
2124
2294
 
2125
- textures.setTexture2D( dstTexture, 0 );
2295
+ _gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );
2126
2296
 
2127
- // As another texture upload may have changed pixelStorei
2128
- // parameters, make sure they are correct for the dstTexture
2129
- _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
2130
- _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2131
- _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2297
+ }
2132
2298
 
2133
- if ( srcTexture.isDataTexture ) {
2299
+ }
2134
2300
 
2135
- _gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );
2301
+ // Generate mipmaps only when copying level 0
2302
+ if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );
2136
2303
 
2137
- } else {
2304
+ state.unbindTexture();
2138
2305
 
2139
- if ( srcTexture.isCompressedTexture ) {
2306
+ };
2140
2307
 
2141
- _gl.compressedTexSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );
2308
+ this.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {
2142
2309
 
2143
- } else {
2310
+ if ( _this.isWebGL1Renderer ) {
2144
2311
 
2145
- _gl.texSubImage2D( _gl.TEXTURE_2D, level, position.x, position.y, glFormat, glType, srcTexture.image );
2312
+ console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );
2313
+ return;
2146
2314
 
2147
2315
  }
2148
2316
 
2149
- }
2317
+ const width = sourceBox.max.x - sourceBox.min.x + 1;
2318
+ const height = sourceBox.max.y - sourceBox.min.y + 1;
2319
+ const depth = sourceBox.max.z - sourceBox.min.z + 1;
2320
+ const glFormat = utils.convert( dstTexture.format );
2321
+ const glType = utils.convert( dstTexture.type );
2322
+ let glTarget;
2150
2323
 
2151
- // Generate mipmaps only when copying level 0
2152
- if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( _gl.TEXTURE_2D );
2324
+ if ( dstTexture.isData3DTexture ) {
2153
2325
 
2154
- state.unbindTexture();
2326
+ textures.setTexture3D( dstTexture, 0 );
2327
+ glTarget = _gl.TEXTURE_3D;
2155
2328
 
2156
- };
2329
+ } else if ( dstTexture.isDataArrayTexture ) {
2157
2330
 
2158
- this.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {
2331
+ textures.setTexture2DArray( dstTexture, 0 );
2332
+ glTarget = _gl.TEXTURE_2D_ARRAY;
2159
2333
 
2160
- if ( _this.isWebGL1Renderer ) {
2334
+ } else {
2161
2335
 
2162
- console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );
2163
- return;
2336
+ console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );
2337
+ return;
2164
2338
 
2165
- }
2339
+ }
2166
2340
 
2167
- const width = sourceBox.max.x - sourceBox.min.x + 1;
2168
- const height = sourceBox.max.y - sourceBox.min.y + 1;
2169
- const depth = sourceBox.max.z - sourceBox.min.z + 1;
2170
- const glFormat = utils.convert( dstTexture.format );
2171
- const glType = utils.convert( dstTexture.type );
2172
- let glTarget;
2341
+ _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
2342
+ _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2343
+ _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2173
2344
 
2174
- if ( dstTexture.isData3DTexture ) {
2345
+ const unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
2346
+ const unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
2347
+ const unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
2348
+ const unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
2349
+ const unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
2175
2350
 
2176
- textures.setTexture3D( dstTexture, 0 );
2177
- glTarget = _gl.TEXTURE_3D;
2351
+ const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;
2178
2352
 
2179
- } else if ( dstTexture.isDataArrayTexture ) {
2353
+ _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
2354
+ _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
2355
+ _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );
2356
+ _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );
2357
+ _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );
2180
2358
 
2181
- textures.setTexture2DArray( dstTexture, 0 );
2182
- glTarget = _gl.TEXTURE_2D_ARRAY;
2359
+ if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
2183
2360
 
2184
- } else {
2361
+ _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );
2185
2362
 
2186
- console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );
2187
- return;
2363
+ } else {
2188
2364
 
2189
- }
2365
+ if ( srcTexture.isCompressedArrayTexture ) {
2190
2366
 
2191
- _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );
2192
- _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );
2193
- _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );
2367
+ console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );
2368
+ _gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );
2194
2369
 
2195
- const unpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );
2196
- const unpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );
2197
- const unpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );
2198
- const unpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );
2199
- const unpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );
2370
+ } else {
2200
2371
 
2201
- const image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;
2372
+ _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );
2202
2373
 
2203
- _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );
2204
- _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );
2205
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, sourceBox.min.x );
2206
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, sourceBox.min.y );
2207
- _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, sourceBox.min.z );
2374
+ }
2208
2375
 
2209
- if ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {
2376
+ }
2210
2377
 
2211
- _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );
2378
+ _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );
2379
+ _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );
2380
+ _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );
2381
+ _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );
2382
+ _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );
2212
2383
 
2213
- } else {
2384
+ // Generate mipmaps only when copying level 0
2385
+ if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );
2386
+
2387
+ state.unbindTexture();
2388
+
2389
+ };
2390
+
2391
+ this.initTexture = function ( texture ) {
2392
+
2393
+ if ( texture.isCubeTexture ) {
2394
+
2395
+ textures.setTextureCube( texture, 0 );
2396
+
2397
+ } else if ( texture.isData3DTexture ) {
2398
+
2399
+ textures.setTexture3D( texture, 0 );
2214
2400
 
2215
- if ( srcTexture.isCompressedArrayTexture ) {
2401
+ } else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {
2216
2402
 
2217
- console.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );
2218
- _gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );
2403
+ textures.setTexture2DArray( texture, 0 );
2219
2404
 
2220
2405
  } else {
2221
2406
 
2222
- _gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );
2407
+ textures.setTexture2D( texture, 0 );
2223
2408
 
2224
2409
  }
2225
2410
 
2226
- }
2411
+ state.unbindTexture();
2227
2412
 
2228
- _gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, unpackRowLen );
2229
- _gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, unpackImageHeight );
2230
- _gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, unpackSkipPixels );
2231
- _gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, unpackSkipRows );
2232
- _gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, unpackSkipImages );
2413
+ };
2233
2414
 
2234
- // Generate mipmaps only when copying level 0
2235
- if ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );
2415
+ this.resetState = function () {
2236
2416
 
2237
- state.unbindTexture();
2417
+ _currentActiveCubeFace = 0;
2418
+ _currentActiveMipmapLevel = 0;
2419
+ _currentRenderTarget = null;
2238
2420
 
2239
- };
2421
+ state.reset();
2422
+ bindingStates.reset();
2240
2423
 
2241
- this.initTexture = function ( texture ) {
2424
+ };
2242
2425
 
2243
- if ( texture.isCubeTexture ) {
2426
+ if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
2244
2427
 
2245
- textures.setTextureCube( texture, 0 );
2428
+ __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );
2246
2429
 
2247
- } else if ( texture.isData3DTexture ) {
2430
+ }
2248
2431
 
2249
- textures.setTexture3D( texture, 0 );
2432
+ }
2250
2433
 
2251
- } else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {
2434
+ get coordinateSystem() {
2252
2435
 
2253
- textures.setTexture2DArray( texture, 0 );
2436
+ return WebGLCoordinateSystem;
2254
2437
 
2255
- } else {
2438
+ }
2256
2439
 
2257
- textures.setTexture2D( texture, 0 );
2440
+ get physicallyCorrectLights() { // @deprecated, r150
2258
2441
 
2259
- }
2442
+ console.warn( 'THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead.' );
2443
+ return ! this.useLegacyLights;
2260
2444
 
2261
- state.unbindTexture();
2445
+ }
2262
2446
 
2263
- };
2447
+ set physicallyCorrectLights( value ) { // @deprecated, r150
2264
2448
 
2265
- this.resetState = function () {
2449
+ console.warn( 'THREE.WebGLRenderer: the property .physicallyCorrectLights has been removed. Set renderer.useLegacyLights instead.' );
2450
+ this.useLegacyLights = ! value;
2266
2451
 
2267
- _currentActiveCubeFace = 0;
2268
- _currentActiveMipmapLevel = 0;
2269
- _currentRenderTarget = null;
2452
+ }
2270
2453
 
2271
- state.reset();
2272
- bindingStates.reset();
2454
+ get outputEncoding() { // @deprecated, r152
2273
2455
 
2274
- };
2456
+ console.warn( 'THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.' );
2457
+ return this.outputColorSpace === SRGBColorSpace ? sRGBEncoding : LinearEncoding;
2275
2458
 
2276
- if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {
2459
+ }
2460
+
2461
+ set outputEncoding( encoding ) { // @deprecated, r152
2277
2462
 
2278
- __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );
2463
+ console.warn( 'THREE.WebGLRenderer: Property .outputEncoding has been removed. Use .outputColorSpace instead.' );
2464
+ this.outputColorSpace = encoding === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;
2279
2465
 
2280
2466
  }
2281
2467
 
2282
2468
  }
2283
2469
 
2470
+
2284
2471
  export { WebGLRenderer };