@plastic-software/three 0.182.0 → 0.183.1

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 (299) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +11521 -10878
  3. package/build/three.core.js +11732 -11340
  4. package/build/three.core.min.js +2 -2
  5. package/build/three.module.js +510 -263
  6. package/build/three.module.min.js +2 -2
  7. package/build/three.tsl.js +7 -11
  8. package/build/three.tsl.min.js +2 -2
  9. package/build/three.webgpu.js +3072 -2607
  10. package/build/three.webgpu.min.js +2 -2
  11. package/build/three.webgpu.nodes.js +3071 -2607
  12. package/build/three.webgpu.nodes.min.js +2 -2
  13. package/examples/jsm/Addons.js +0 -3
  14. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  15. package/examples/jsm/controls/ArcballControls.js +3 -3
  16. package/examples/jsm/controls/OrbitControls.js +103 -0
  17. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  18. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  19. package/examples/jsm/environments/RoomEnvironment.js +1 -0
  20. package/examples/jsm/exporters/EXRExporter.js +1 -1
  21. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  22. package/examples/jsm/exporters/USDZExporter.js +22 -3
  23. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  24. package/examples/jsm/helpers/ViewHelper.js +67 -8
  25. package/examples/jsm/inspector/Inspector.js +21 -5
  26. package/examples/jsm/inspector/tabs/Console.js +39 -5
  27. package/examples/jsm/inspector/tabs/Parameters.js +16 -0
  28. package/examples/jsm/inspector/ui/Style.js +25 -1
  29. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  30. package/examples/jsm/lines/LineMaterial.js +6 -0
  31. package/examples/jsm/loaders/3MFLoader.js +2 -2
  32. package/examples/jsm/loaders/AMFLoader.js +2 -2
  33. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  34. package/examples/jsm/loaders/EXRLoader.js +5 -5
  35. package/examples/jsm/loaders/FBXLoader.js +2 -2
  36. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  37. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  38. package/examples/jsm/loaders/KMZLoader.js +5 -5
  39. package/examples/jsm/loaders/KTX2Loader.js +5 -5
  40. package/examples/jsm/loaders/LWOLoader.js +7 -39
  41. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  42. package/examples/jsm/loaders/PCDLoader.js +3 -2
  43. package/examples/jsm/loaders/USDLoader.js +100 -40
  44. package/examples/jsm/loaders/UltraHDRLoader.js +182 -30
  45. package/examples/jsm/loaders/VRMLLoader.js +77 -0
  46. package/examples/jsm/loaders/VTKLoader.js +37 -24
  47. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  48. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  49. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  50. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  51. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  52. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  53. package/examples/jsm/objects/LensflareMesh.js +1 -1
  54. package/examples/jsm/objects/Sky.js +76 -4
  55. package/examples/jsm/objects/SkyMesh.js +114 -7
  56. package/examples/jsm/objects/Water.js +4 -3
  57. package/examples/jsm/objects/Water2.js +5 -3
  58. package/examples/jsm/objects/WaterMesh.js +5 -7
  59. package/examples/jsm/physics/JoltPhysics.js +7 -5
  60. package/examples/jsm/physics/RapierPhysics.js +6 -4
  61. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  62. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  63. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  64. package/examples/jsm/renderers/SVGRenderer.js +2 -2
  65. package/examples/jsm/shaders/GTAOShader.js +19 -6
  66. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  67. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  68. package/examples/jsm/shaders/SAOShader.js +17 -4
  69. package/examples/jsm/shaders/SSAOShader.js +11 -1
  70. package/examples/jsm/shaders/SSRShader.js +6 -5
  71. package/examples/jsm/shaders/VignetteShader.js +1 -1
  72. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  73. package/examples/jsm/tsl/display/AnaglyphPassNode.js +456 -16
  74. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  75. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  76. package/examples/jsm/tsl/display/BloomNode.js +5 -5
  77. package/examples/jsm/tsl/display/CRT.js +150 -0
  78. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  79. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  80. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  81. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  82. package/examples/jsm/tsl/display/GTAONode.js +2 -2
  83. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  84. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  85. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  86. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  87. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  88. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  89. package/examples/jsm/tsl/display/PixelationPassNode.js +5 -5
  90. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  91. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  92. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  93. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  94. package/examples/jsm/tsl/display/SSGINode.js +2 -2
  95. package/examples/jsm/tsl/display/SSRNode.js +7 -7
  96. package/examples/jsm/tsl/display/SSSNode.js +2 -2
  97. package/examples/jsm/tsl/display/Shape.js +29 -0
  98. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  99. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  100. package/examples/jsm/tsl/display/TRAANode.js +9 -12
  101. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  102. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  103. package/examples/jsm/tsl/math/Bayer.js +40 -1
  104. package/examples/jsm/utils/LDrawUtils.js +1 -1
  105. package/package.json +11 -19
  106. package/src/Three.Core.js +1 -1
  107. package/src/Three.TSL.js +5 -9
  108. package/src/Three.WebGPU.Nodes.js +2 -0
  109. package/src/Three.WebGPU.js +3 -0
  110. package/src/Three.js +1 -0
  111. package/src/animation/AnimationAction.js +1 -1
  112. package/src/animation/AnimationClip.js +1 -1
  113. package/src/animation/AnimationMixer.js +6 -0
  114. package/src/animation/KeyframeTrack.js +46 -7
  115. package/src/animation/PropertyMixer.js +4 -4
  116. package/src/audio/Audio.js +1 -1
  117. package/src/audio/AudioListener.js +5 -3
  118. package/src/cameras/Camera.js +32 -2
  119. package/src/cameras/CubeCamera.js +20 -0
  120. package/src/constants.js +30 -1
  121. package/src/core/Clock.js +7 -0
  122. package/src/core/Object3D.js +56 -4
  123. package/src/core/RenderTarget.js +3 -4
  124. package/src/extras/PMREMGenerator.js +4 -8
  125. package/src/geometries/TorusGeometry.js +8 -3
  126. package/src/helpers/CameraHelper.js +3 -0
  127. package/src/helpers/DirectionalLightHelper.js +4 -1
  128. package/src/helpers/HemisphereLightHelper.js +3 -0
  129. package/src/helpers/PointLightHelper.js +0 -24
  130. package/src/helpers/SpotLightHelper.js +3 -0
  131. package/src/lights/LightShadow.js +15 -3
  132. package/src/lights/webgpu/IESSpotLight.js +2 -1
  133. package/src/loaders/Cache.js +28 -0
  134. package/src/loaders/FileLoader.js +1 -1
  135. package/src/loaders/ImageBitmapLoader.js +8 -3
  136. package/src/loaders/Loader.js +6 -0
  137. package/src/loaders/ObjectLoader.js +18 -1
  138. package/src/materials/MeshLambertMaterial.js +9 -0
  139. package/src/materials/MeshPhongMaterial.js +9 -0
  140. package/src/materials/nodes/Line2NodeMaterial.js +5 -5
  141. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -0
  142. package/src/materials/nodes/NodeMaterial.js +15 -24
  143. package/src/materials/nodes/manager/NodeMaterialObserver.js +9 -3
  144. package/src/math/Line3.js +3 -5
  145. package/src/math/MathUtils.js +10 -10
  146. package/src/math/Matrix4.js +35 -26
  147. package/src/math/Quaternion.js +3 -29
  148. package/src/math/Vector3.js +3 -3
  149. package/src/math/interpolants/BezierInterpolant.js +108 -0
  150. package/src/nodes/Nodes.js +87 -68
  151. package/src/nodes/TSL.js +2 -5
  152. package/src/nodes/accessors/Arrays.js +1 -1
  153. package/src/nodes/accessors/Bitangent.js +5 -5
  154. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  155. package/src/nodes/accessors/Camera.js +149 -28
  156. package/src/nodes/accessors/InstanceNode.js +105 -40
  157. package/src/nodes/accessors/Normal.js +9 -9
  158. package/src/nodes/accessors/Position.js +34 -2
  159. package/src/nodes/accessors/SceneProperties.js +53 -0
  160. package/src/nodes/accessors/SkinningNode.js +12 -24
  161. package/src/nodes/accessors/StorageBufferNode.js +0 -19
  162. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  163. package/src/nodes/accessors/Tangent.js +3 -3
  164. package/src/nodes/accessors/Texture3DNode.js +6 -34
  165. package/src/nodes/accessors/TextureNode.js +58 -22
  166. package/src/nodes/accessors/UniformArrayNode.js +2 -0
  167. package/src/nodes/core/MRTNode.js +48 -2
  168. package/src/nodes/core/Node.js +29 -3
  169. package/src/nodes/core/NodeBuilder.js +115 -40
  170. package/src/nodes/core/NodeError.js +28 -0
  171. package/src/nodes/core/NodeUtils.js +5 -3
  172. package/src/nodes/core/OutputStructNode.js +12 -10
  173. package/src/nodes/core/ParameterNode.js +2 -1
  174. package/src/nodes/core/StackNode.js +9 -8
  175. package/src/nodes/core/StackTrace.js +139 -0
  176. package/src/nodes/core/StructNode.js +15 -0
  177. package/src/nodes/core/SubBuildNode.js +1 -1
  178. package/src/nodes/core/UniformNode.js +2 -1
  179. package/src/nodes/core/VarNode.js +1 -1
  180. package/src/nodes/core/VaryingNode.js +1 -18
  181. package/src/nodes/display/BlendModes.js +0 -64
  182. package/src/nodes/display/ColorAdjustment.js +17 -0
  183. package/src/nodes/display/ColorSpaceNode.js +3 -3
  184. package/src/nodes/display/NormalMapNode.js +2 -2
  185. package/src/nodes/display/PassNode.js +21 -2
  186. package/src/nodes/display/RenderOutputNode.js +3 -3
  187. package/src/nodes/display/ScreenNode.js +2 -1
  188. package/src/nodes/display/ToneMappingNode.js +1 -1
  189. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  190. package/src/nodes/display/ViewportDepthNode.js +52 -4
  191. package/src/nodes/display/ViewportTextureNode.js +21 -4
  192. package/src/nodes/fog/Fog.js +18 -35
  193. package/src/nodes/functions/PhysicalLightingModel.js +25 -3
  194. package/src/nodes/geometry/RangeNode.js +4 -2
  195. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  196. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  197. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  198. package/src/nodes/lighting/PointShadowNode.js +24 -12
  199. package/src/nodes/lighting/ShadowFilterNode.js +15 -43
  200. package/src/nodes/lighting/ShadowNode.js +54 -32
  201. package/src/nodes/math/ConditionalNode.js +2 -2
  202. package/src/nodes/math/MathNode.js +3 -40
  203. package/src/nodes/math/OperatorNode.js +2 -1
  204. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  205. package/src/nodes/tsl/TSLCore.js +13 -10
  206. package/src/nodes/utils/DebugNode.js +11 -11
  207. package/src/nodes/utils/JoinNode.js +2 -2
  208. package/src/nodes/utils/LoopNode.js +1 -1
  209. package/src/nodes/utils/MemberNode.js +1 -1
  210. package/src/nodes/utils/RTTNode.js +1 -1
  211. package/src/nodes/utils/ReflectorNode.js +2 -3
  212. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  213. package/src/nodes/utils/UVUtils.js +4 -2
  214. package/src/objects/BatchedMesh.js +22 -12
  215. package/src/objects/InstancedMesh.js +11 -0
  216. package/src/renderers/WebGLRenderer.js +34 -60
  217. package/src/renderers/common/Backend.js +21 -0
  218. package/src/renderers/common/Background.js +7 -4
  219. package/src/renderers/common/BindGroup.js +1 -9
  220. package/src/renderers/common/Bindings.js +20 -5
  221. package/src/renderers/common/BlendMode.js +143 -0
  222. package/src/renderers/common/BundleGroup.js +1 -1
  223. package/src/renderers/common/CubeRenderTarget.js +50 -6
  224. package/src/renderers/common/Geometries.js +17 -3
  225. package/src/renderers/common/Lighting.js +5 -21
  226. package/src/renderers/common/Pipelines.js +4 -4
  227. package/src/renderers/common/PostProcessing.js +8 -206
  228. package/src/renderers/common/RenderBundles.js +2 -1
  229. package/src/renderers/common/RenderContext.js +16 -0
  230. package/src/renderers/common/RenderContexts.js +33 -56
  231. package/src/renderers/common/RenderLists.js +2 -1
  232. package/src/renderers/common/RenderObject.js +2 -3
  233. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  234. package/src/renderers/common/RenderObjects.js +18 -2
  235. package/src/renderers/common/RenderPipeline.js +203 -17
  236. package/src/renderers/common/Renderer.js +207 -40
  237. package/src/renderers/common/Sampler.js +4 -4
  238. package/src/renderers/common/StorageBuffer.js +13 -1
  239. package/src/renderers/common/Textures.js +16 -0
  240. package/src/renderers/common/TimestampQueryPool.js +5 -3
  241. package/src/renderers/common/Uniform.js +8 -0
  242. package/src/renderers/common/UniformsGroup.js +60 -0
  243. package/src/renderers/common/XRManager.js +2 -2
  244. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  245. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  246. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  247. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  248. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  249. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  250. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  251. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  252. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +4 -4
  253. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  254. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  255. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  256. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +23 -1
  257. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  258. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +55 -24
  259. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  260. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  261. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  262. package/src/renderers/shaders/ShaderLib.js +4 -2
  263. package/src/renderers/shaders/UniformsLib.js +0 -3
  264. package/src/renderers/webgl/WebGLBackground.js +2 -2
  265. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  266. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  267. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  268. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  269. package/src/renderers/webgl/WebGLObjects.js +3 -1
  270. package/src/renderers/webgl/WebGLProgram.js +2 -2
  271. package/src/renderers/webgl/WebGLPrograms.js +10 -4
  272. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  273. package/src/renderers/webgl/WebGLShadowMap.js +5 -4
  274. package/src/renderers/webgl/WebGLState.js +12 -17
  275. package/src/renderers/webgl-fallback/WebGLBackend.js +71 -7
  276. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +98 -29
  277. package/src/renderers/webgl-fallback/utils/WebGLState.js +168 -7
  278. package/src/renderers/webgpu/WebGPUBackend.js +58 -9
  279. package/src/renderers/webgpu/WebGPURenderer.js +1 -0
  280. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +257 -45
  281. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +8 -19
  282. package/src/renderers/webgpu/utils/WebGPUConstants.js +1 -1
  283. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -31
  284. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  285. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +25 -25
  286. package/src/renderers/webgpu/utils/WebGPUUtils.js +10 -6
  287. package/src/renderers/webxr/WebXRManager.js +2 -2
  288. package/src/textures/Texture.js +2 -2
  289. package/src/utils.js +246 -3
  290. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -433
  291. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  292. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  293. package/src/nodes/accessors/SceneNode.js +0 -145
  294. package/src/nodes/code/ScriptableNode.js +0 -726
  295. package/src/nodes/code/ScriptableValueNode.js +0 -253
  296. package/src/nodes/display/PosterizeNode.js +0 -65
  297. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  298. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  299. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -39,7 +39,8 @@ const ShaderLib = {
39
39
  UniformsLib.fog,
40
40
  UniformsLib.lights,
41
41
  {
42
- emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }
42
+ emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },
43
+ envMapIntensity: { value: 1 }
43
44
  }
44
45
  ] ),
45
46
 
@@ -65,7 +66,8 @@ const ShaderLib = {
65
66
  {
66
67
  emissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },
67
68
  specular: { value: /*@__PURE__*/ new Color( 0x111111 ) },
68
- shininess: { value: 30 }
69
+ shininess: { value: 30 },
70
+ envMapIntensity: { value: 1 }
69
71
  }
70
72
  ] ),
71
73
 
@@ -139,7 +139,6 @@ const UniformsLib = {
139
139
  shadowMapSize: {}
140
140
  } },
141
141
 
142
- directionalShadowMap: { value: [] },
143
142
  directionalShadowMatrix: { value: [] },
144
143
 
145
144
  spotLights: { value: [], properties: {
@@ -161,7 +160,6 @@ const UniformsLib = {
161
160
  } },
162
161
 
163
162
  spotLightMap: { value: [] },
164
- spotShadowMap: { value: [] },
165
163
  spotLightMatrix: { value: [] },
166
164
 
167
165
  pointLights: { value: [], properties: {
@@ -181,7 +179,6 @@ const UniformsLib = {
181
179
  shadowCameraFar: {}
182
180
  } },
183
181
 
184
- pointShadowMap: { value: [] },
185
182
  pointShadowMatrix: { value: [] },
186
183
 
187
184
  hemisphereLights: { value: [], properties: {
@@ -14,7 +14,7 @@ const _rgb = { r: 0, b: 0, g: 0 };
14
14
  const _e1 = /*@__PURE__*/ new Euler();
15
15
  const _m1 = /*@__PURE__*/ new Matrix4();
16
16
 
17
- function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {
17
+ function WebGLBackground( renderer, environments, state, objects, alpha, premultipliedAlpha ) {
18
18
 
19
19
  const clearColor = new Color( 0x000000 );
20
20
  let clearAlpha = alpha === true ? 0 : 1;
@@ -33,7 +33,7 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
33
33
  if ( background && background.isTexture ) {
34
34
 
35
35
  const usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background
36
- background = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );
36
+ background = environments.get( background, usePMREM );
37
37
 
38
38
  }
39
39
 
@@ -14,7 +14,7 @@ function WebGLBindingStates( gl, attributes ) {
14
14
 
15
15
  let updateBuffers = false;
16
16
 
17
- const state = getBindingState( geometry, program, material );
17
+ const state = getBindingState( object, geometry, program, material );
18
18
 
19
19
  if ( currentState !== state ) {
20
20
 
@@ -67,16 +67,28 @@ function WebGLBindingStates( gl, attributes ) {
67
67
 
68
68
  }
69
69
 
70
- function getBindingState( geometry, program, material ) {
70
+ function getBindingState( object, geometry, program, material ) {
71
71
 
72
72
  const wireframe = ( material.wireframe === true );
73
73
 
74
- let programMap = bindingStates[ geometry.id ];
74
+ let objectMap = bindingStates[ geometry.id ];
75
+
76
+ if ( objectMap === undefined ) {
77
+
78
+ objectMap = {};
79
+ bindingStates[ geometry.id ] = objectMap;
80
+
81
+ }
82
+
83
+ // Each InstancedMesh requires unique binding states because it contains instanced attributes.
84
+ const objectId = ( object.isInstancedMesh === true ) ? object.id : 0;
85
+
86
+ let programMap = objectMap[ objectId ];
75
87
 
76
88
  if ( programMap === undefined ) {
77
89
 
78
90
  programMap = {};
79
- bindingStates[ geometry.id ] = programMap;
91
+ objectMap[ objectId ] = programMap;
80
92
 
81
93
  }
82
94
 
@@ -477,21 +489,27 @@ function WebGLBindingStates( gl, attributes ) {
477
489
 
478
490
  for ( const geometryId in bindingStates ) {
479
491
 
480
- const programMap = bindingStates[ geometryId ];
492
+ const objectMap = bindingStates[ geometryId ];
481
493
 
482
- for ( const programId in programMap ) {
494
+ for ( const objectId in objectMap ) {
483
495
 
484
- const stateMap = programMap[ programId ];
496
+ const programMap = objectMap[ objectId ];
485
497
 
486
- for ( const wireframe in stateMap ) {
498
+ for ( const programId in programMap ) {
487
499
 
488
- deleteVertexArrayObject( stateMap[ wireframe ].object );
500
+ const stateMap = programMap[ programId ];
489
501
 
490
- delete stateMap[ wireframe ];
502
+ for ( const wireframe in stateMap ) {
491
503
 
492
- }
504
+ deleteVertexArrayObject( stateMap[ wireframe ].object );
493
505
 
494
- delete programMap[ programId ];
506
+ delete stateMap[ wireframe ];
507
+
508
+ }
509
+
510
+ delete programMap[ programId ];
511
+
512
+ }
495
513
 
496
514
  }
497
515
 
@@ -505,21 +523,27 @@ function WebGLBindingStates( gl, attributes ) {
505
523
 
506
524
  if ( bindingStates[ geometry.id ] === undefined ) return;
507
525
 
508
- const programMap = bindingStates[ geometry.id ];
526
+ const objectMap = bindingStates[ geometry.id ];
509
527
 
510
- for ( const programId in programMap ) {
528
+ for ( const objectId in objectMap ) {
511
529
 
512
- const stateMap = programMap[ programId ];
530
+ const programMap = objectMap[ objectId ];
513
531
 
514
- for ( const wireframe in stateMap ) {
532
+ for ( const programId in programMap ) {
515
533
 
516
- deleteVertexArrayObject( stateMap[ wireframe ].object );
534
+ const stateMap = programMap[ programId ];
517
535
 
518
- delete stateMap[ wireframe ];
536
+ for ( const wireframe in stateMap ) {
519
537
 
520
- }
538
+ deleteVertexArrayObject( stateMap[ wireframe ].object );
521
539
 
522
- delete programMap[ programId ];
540
+ delete stateMap[ wireframe ];
541
+
542
+ }
543
+
544
+ delete programMap[ programId ];
545
+
546
+ }
523
547
 
524
548
  }
525
549
 
@@ -531,26 +555,73 @@ function WebGLBindingStates( gl, attributes ) {
531
555
 
532
556
  for ( const geometryId in bindingStates ) {
533
557
 
534
- const programMap = bindingStates[ geometryId ];
558
+ const objectMap = bindingStates[ geometryId ];
559
+
560
+ for ( const objectId in objectMap ) {
561
+
562
+ const programMap = objectMap[ objectId ];
563
+
564
+ if ( programMap[ program.id ] === undefined ) continue;
565
+
566
+ const stateMap = programMap[ program.id ];
567
+
568
+ for ( const wireframe in stateMap ) {
569
+
570
+ deleteVertexArrayObject( stateMap[ wireframe ].object );
571
+
572
+ delete stateMap[ wireframe ];
573
+
574
+ }
575
+
576
+ delete programMap[ program.id ];
577
+
578
+ }
579
+
580
+ }
581
+
582
+ }
583
+
584
+ function releaseStatesOfObject( object ) {
585
+
586
+ for ( const geometryId in bindingStates ) {
587
+
588
+ const objectMap = bindingStates[ geometryId ];
535
589
 
536
- if ( programMap[ program.id ] === undefined ) continue;
590
+ const objectId = ( object.isInstancedMesh === true ) ? object.id : 0;
537
591
 
538
- const stateMap = programMap[ program.id ];
592
+ const programMap = objectMap[ objectId ];
539
593
 
540
- for ( const wireframe in stateMap ) {
594
+ if ( programMap === undefined ) continue;
541
595
 
542
- deleteVertexArrayObject( stateMap[ wireframe ].object );
596
+ for ( const programId in programMap ) {
543
597
 
544
- delete stateMap[ wireframe ];
598
+ const stateMap = programMap[ programId ];
599
+
600
+ for ( const wireframe in stateMap ) {
601
+
602
+ deleteVertexArrayObject( stateMap[ wireframe ].object );
603
+
604
+ delete stateMap[ wireframe ];
605
+
606
+ }
607
+
608
+ delete programMap[ programId ];
545
609
 
546
610
  }
547
611
 
548
- delete programMap[ program.id ];
612
+ delete objectMap[ objectId ];
613
+
614
+ if ( Object.keys( objectMap ).length === 0 ) {
615
+
616
+ delete bindingStates[ geometryId ];
617
+
618
+ }
549
619
 
550
620
  }
551
621
 
552
622
  }
553
623
 
624
+
554
625
  function reset() {
555
626
 
556
627
  resetDefaultState();
@@ -580,6 +651,7 @@ function WebGLBindingStates( gl, attributes ) {
580
651
  resetDefaultState: resetDefaultState,
581
652
  dispose: dispose,
582
653
  releaseStatesOfGeometry: releaseStatesOfGeometry,
654
+ releaseStatesOfObject: releaseStatesOfObject,
583
655
  releaseStatesOfProgram: releaseStatesOfProgram,
584
656
 
585
657
  initAttributes: initAttributes,
@@ -0,0 +1,228 @@
1
+ import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js';
2
+ import { PMREMGenerator } from '../../extras/PMREMGenerator.js';
3
+ import { WebGLCubeRenderTarget } from '../WebGLCubeRenderTarget.js';
4
+
5
+ function WebGLEnvironments( renderer ) {
6
+
7
+ let cubeMaps = new WeakMap();
8
+ let pmremMaps = new WeakMap();
9
+
10
+ let pmremGenerator = null;
11
+
12
+ function get( texture, usePMREM = false ) {
13
+
14
+ if ( texture === null || texture === undefined ) return null;
15
+
16
+ if ( usePMREM ) {
17
+
18
+ return getPMREM( texture );
19
+
20
+ }
21
+
22
+ return getCube( texture );
23
+
24
+ }
25
+
26
+ function getCube( texture ) {
27
+
28
+ if ( texture && texture.isTexture ) {
29
+
30
+ const mapping = texture.mapping;
31
+
32
+ if ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {
33
+
34
+ if ( cubeMaps.has( texture ) ) {
35
+
36
+ const cubemap = cubeMaps.get( texture ).texture;
37
+ return mapTextureMapping( cubemap, texture.mapping );
38
+
39
+ } else {
40
+
41
+ const image = texture.image;
42
+
43
+ if ( image && image.height > 0 ) {
44
+
45
+ const renderTarget = new WebGLCubeRenderTarget( image.height );
46
+ renderTarget.fromEquirectangularTexture( renderer, texture );
47
+ cubeMaps.set( texture, renderTarget );
48
+
49
+ texture.addEventListener( 'dispose', onCubemapDispose );
50
+
51
+ return mapTextureMapping( renderTarget.texture, texture.mapping );
52
+
53
+ } else {
54
+
55
+ // image not yet ready. try the conversion next frame
56
+
57
+ return null;
58
+
59
+ }
60
+
61
+ }
62
+
63
+ }
64
+
65
+ }
66
+
67
+ return texture;
68
+
69
+ }
70
+
71
+ function getPMREM( texture ) {
72
+
73
+ if ( texture && texture.isTexture ) {
74
+
75
+ const mapping = texture.mapping;
76
+
77
+ const isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );
78
+ const isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );
79
+
80
+ // equirect/cube map to cubeUV conversion
81
+
82
+ if ( isEquirectMap || isCubeMap ) {
83
+
84
+ let renderTarget = pmremMaps.get( texture );
85
+
86
+ const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;
87
+
88
+ if ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {
89
+
90
+ if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );
91
+
92
+ renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );
93
+ renderTarget.texture.pmremVersion = texture.pmremVersion;
94
+
95
+ pmremMaps.set( texture, renderTarget );
96
+
97
+ return renderTarget.texture;
98
+
99
+ } else {
100
+
101
+ if ( renderTarget !== undefined ) {
102
+
103
+ return renderTarget.texture;
104
+
105
+ } else {
106
+
107
+ const image = texture.image;
108
+
109
+ if ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {
110
+
111
+ if ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );
112
+
113
+ renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );
114
+ renderTarget.texture.pmremVersion = texture.pmremVersion;
115
+
116
+ pmremMaps.set( texture, renderTarget );
117
+
118
+ texture.addEventListener( 'dispose', onPMREMDispose );
119
+
120
+ return renderTarget.texture;
121
+
122
+ } else {
123
+
124
+ // image not yet ready. try the conversion next frame
125
+
126
+ return null;
127
+
128
+ }
129
+
130
+ }
131
+
132
+ }
133
+
134
+ }
135
+
136
+ }
137
+
138
+ return texture;
139
+
140
+ }
141
+
142
+ function mapTextureMapping( texture, mapping ) {
143
+
144
+ if ( mapping === EquirectangularReflectionMapping ) {
145
+
146
+ texture.mapping = CubeReflectionMapping;
147
+
148
+ } else if ( mapping === EquirectangularRefractionMapping ) {
149
+
150
+ texture.mapping = CubeRefractionMapping;
151
+
152
+ }
153
+
154
+ return texture;
155
+
156
+ }
157
+
158
+ function isCubeTextureComplete( image ) {
159
+
160
+ let count = 0;
161
+ const length = 6;
162
+
163
+ for ( let i = 0; i < length; i ++ ) {
164
+
165
+ if ( image[ i ] !== undefined ) count ++;
166
+
167
+ }
168
+
169
+ return count === length;
170
+
171
+ }
172
+
173
+ function onCubemapDispose( event ) {
174
+
175
+ const texture = event.target;
176
+
177
+ texture.removeEventListener( 'dispose', onCubemapDispose );
178
+
179
+ const cubemap = cubeMaps.get( texture );
180
+
181
+ if ( cubemap !== undefined ) {
182
+
183
+ cubeMaps.delete( texture );
184
+ cubemap.dispose();
185
+
186
+ }
187
+
188
+ }
189
+
190
+ function onPMREMDispose( event ) {
191
+
192
+ const texture = event.target;
193
+
194
+ texture.removeEventListener( 'dispose', onPMREMDispose );
195
+
196
+ const pmrem = pmremMaps.get( texture );
197
+
198
+ if ( pmrem !== undefined ) {
199
+
200
+ pmremMaps.delete( texture );
201
+ pmrem.dispose();
202
+
203
+ }
204
+
205
+ }
206
+
207
+ function dispose() {
208
+
209
+ cubeMaps = new WeakMap();
210
+ pmremMaps = new WeakMap();
211
+
212
+ if ( pmremGenerator !== null ) {
213
+
214
+ pmremGenerator.dispose();
215
+ pmremGenerator = null;
216
+
217
+ }
218
+
219
+ }
220
+
221
+ return {
222
+ get: get,
223
+ dispose: dispose
224
+ };
225
+
226
+ }
227
+
228
+ export { WebGLEnvironments };
@@ -1,5 +1,4 @@
1
1
  import { Uint16BufferAttribute, Uint32BufferAttribute } from '../../core/BufferAttribute.js';
2
- import { arrayNeedsUint32 } from '../../utils.js';
3
2
 
4
3
  function WebGLGeometries( gl, attributes, info, bindingStates ) {
5
4
 
@@ -85,6 +84,12 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
85
84
  const geometryPosition = geometry.attributes.position;
86
85
  let version = 0;
87
86
 
87
+ if ( geometryPosition === undefined ) {
88
+
89
+ return;
90
+
91
+ }
92
+
88
93
  if ( geometryIndex !== null ) {
89
94
 
90
95
  const array = geometryIndex.array;
@@ -100,7 +105,7 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
100
105
 
101
106
  }
102
107
 
103
- } else if ( geometryPosition !== undefined ) {
108
+ } else {
104
109
 
105
110
  const array = geometryPosition.array;
106
111
  version = geometryPosition.version;
@@ -115,13 +120,11 @@ function WebGLGeometries( gl, attributes, info, bindingStates ) {
115
120
 
116
121
  }
117
122
 
118
- } else {
119
-
120
- return;
121
-
122
123
  }
123
124
 
124
- const attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
125
+ // check whether a 32 bit or 16 bit buffer is required to store the indices
126
+ // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565
127
+ const attribute = new ( geometryPosition.count >= 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
125
128
  attribute.version = version;
126
129
 
127
130
  // Updating index buffer in VAO now. See WebGLBindingStates
@@ -47,6 +47,12 @@ function WebGLMaterials( renderer, properties ) {
47
47
 
48
48
  refreshUniformsCommon( uniforms, material );
49
49
 
50
+ if ( material.envMap ) {
51
+
52
+ uniforms.envMapIntensity.value = material.envMapIntensity;
53
+
54
+ }
55
+
50
56
  } else if ( material.isMeshToonMaterial ) {
51
57
 
52
58
  refreshUniformsCommon( uniforms, material );
@@ -57,6 +63,12 @@ function WebGLMaterials( renderer, properties ) {
57
63
  refreshUniformsCommon( uniforms, material );
58
64
  refreshUniformsPhong( uniforms, material );
59
65
 
66
+ if ( material.envMap ) {
67
+
68
+ uniforms.envMapIntensity.value = material.envMapIntensity;
69
+
70
+ }
71
+
60
72
  } else if ( material.isMeshStandardMaterial ) {
61
73
 
62
74
  refreshUniformsCommon( uniforms, material );
@@ -1,4 +1,4 @@
1
- function WebGLObjects( gl, geometries, attributes, info ) {
1
+ function WebGLObjects( gl, geometries, attributes, bindingStates, info ) {
2
2
 
3
3
  let updateMap = new WeakMap();
4
4
 
@@ -73,6 +73,8 @@ function WebGLObjects( gl, geometries, attributes, info ) {
73
73
 
74
74
  instancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );
75
75
 
76
+ bindingStates.releaseStatesOfObject( instancedMesh );
77
+
76
78
  attributes.remove( instancedMesh.instanceMatrix );
77
79
 
78
80
  if ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );
@@ -751,8 +751,8 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
751
751
  parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',
752
752
 
753
753
  parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',
754
- parameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',
755
- parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',
754
+ parameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',
755
+ parameters.vertexAlphas || parameters.batchingColor ? '#define USE_COLOR_ALPHA' : '',
756
756
  parameters.vertexUv1s ? '#define USE_UV1' : '',
757
757
  parameters.vertexUv2s ? '#define USE_UV2' : '',
758
758
  parameters.vertexUv3s ? '#define USE_UV3' : '',
@@ -7,7 +7,7 @@ import { UniformsUtils } from '../shaders/UniformsUtils.js';
7
7
  import { ColorManagement } from '../../math/ColorManagement.js';
8
8
  import { warn } from '../../utils.js';
9
9
 
10
- function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {
10
+ function WebGLPrograms( renderer, environments, extensions, capabilities, bindingStates, clipping ) {
11
11
 
12
12
  const _programLayers = new Layers();
13
13
  const _customShaders = new WebGLShaderCache();
@@ -51,9 +51,10 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
51
51
 
52
52
  const fog = scene.fog;
53
53
  const geometry = object.geometry;
54
- const environment = material.isMeshStandardMaterial ? scene.environment : null;
54
+ const environment = ( material.isMeshStandardMaterial || material.isMeshLambertMaterial || material.isMeshPhongMaterial ) ? scene.environment : null;
55
55
 
56
- const envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );
56
+ const usePMREM = material.isMeshStandardMaterial || ( material.isMeshLambertMaterial && ! material.envMap ) || ( material.isMeshPhongMaterial && ! material.envMap );
57
+ const envMap = environments.get( material.envMap || environment, usePMREM );
57
58
  const envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;
58
59
 
59
60
  const shaderID = shaderIDs[ material.type ];
@@ -310,7 +311,12 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
310
311
  useFog: material.fog === true,
311
312
  fogExp2: ( !! fog && fog.isFogExp2 ),
312
313
 
313
- flatShading: ( material.flatShading === true && material.wireframe === false ),
314
+ flatShading: material.wireframe === false && (
315
+ material.flatShading === true ||
316
+ ( geometry.attributes.normal === undefined && HAS_NORMALMAP === false &&
317
+ ( material.isMeshLambertMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.isMeshPhysicalMaterial )
318
+ )
319
+ ),
314
320
 
315
321
  sizeAttenuation: material.sizeAttenuation === true,
316
322
  logarithmicDepthBuffer: logarithmicDepthBuffer,
@@ -12,6 +12,10 @@ function painterSortStable( a, b ) {
12
12
 
13
13
  return a.material.id - b.material.id;
14
14
 
15
+ } else if ( a.materialVariant !== b.materialVariant ) {
16
+
17
+ return a.materialVariant - b.materialVariant;
18
+
15
19
  } else if ( a.z !== b.z ) {
16
20
 
17
21
  return a.z - b.z;
@@ -66,6 +70,15 @@ function WebGLRenderList() {
66
70
 
67
71
  }
68
72
 
73
+ function materialVariant( object ) {
74
+
75
+ let variant = 0;
76
+ if ( object.isInstancedMesh ) variant += 2;
77
+ if ( object.isSkinnedMesh ) variant += 1;
78
+ return variant;
79
+
80
+ }
81
+
69
82
  function getNextRenderItem( object, geometry, material, groupOrder, z, group ) {
70
83
 
71
84
  let renderItem = renderItems[ renderItemsIndex ];
@@ -77,6 +90,7 @@ function WebGLRenderList() {
77
90
  object: object,
78
91
  geometry: geometry,
79
92
  material: material,
93
+ materialVariant: materialVariant( object ),
80
94
  groupOrder: groupOrder,
81
95
  renderOrder: object.renderOrder,
82
96
  z: z,
@@ -91,6 +105,7 @@ function WebGLRenderList() {
91
105
  renderItem.object = object;
92
106
  renderItem.geometry = geometry;
93
107
  renderItem.material = material;
108
+ renderItem.materialVariant = materialVariant( object );
94
109
  renderItem.groupOrder = groupOrder;
95
110
  renderItem.renderOrder = object.renderOrder;
96
111
  renderItem.z = z;