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