@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
@@ -1,8 +1,7 @@
1
1
  import { LightsNode } from '../../nodes/Nodes.js';
2
- import ChainMap from './ChainMap.js';
3
2
 
4
3
  const _defaultLights = /*@__PURE__*/ new LightsNode();
5
- const _chainKeys = [];
4
+ const _weakMap = /*@__PURE__*/ new WeakMap();
6
5
 
7
6
  /**
8
7
  * This renderer module manages the lights nodes which are unique
@@ -12,18 +11,8 @@ const _chainKeys = [];
12
11
  * with the actual lights from the scene.
13
12
  *
14
13
  * @private
15
- * @augments ChainMap
16
14
  */
17
- class Lighting extends ChainMap {
18
-
19
- /**
20
- * Constructs a lighting management component.
21
- */
22
- constructor() {
23
-
24
- super();
25
-
26
- }
15
+ class Lighting {
27
16
 
28
17
  /**
29
18
  * Creates a new lights node for the given array of lights.
@@ -44,26 +33,21 @@ class Lighting extends ChainMap {
44
33
  * @param {Camera} camera - The camera.
45
34
  * @return {LightsNode} The lights node.
46
35
  */
47
- getNode( scene, camera ) {
36
+ getNode( scene ) {
48
37
 
49
38
  // ignore post-processing
50
39
 
51
40
  if ( scene.isQuadMesh ) return _defaultLights;
52
41
 
53
- _chainKeys[ 0 ] = scene;
54
- _chainKeys[ 1 ] = camera;
55
-
56
- let node = this.get( _chainKeys );
42
+ let node = _weakMap.get( scene );
57
43
 
58
44
  if ( node === undefined ) {
59
45
 
60
46
  node = this.createNode();
61
- this.set( _chainKeys, node );
47
+ _weakMap.set( scene, node );
62
48
 
63
49
  }
64
50
 
65
- _chainKeys.length = 0;
66
-
67
51
  return node;
68
52
 
69
53
  }
@@ -1,5 +1,5 @@
1
1
  import DataMap from './DataMap.js';
2
- import RenderPipeline from './RenderPipeline.js';
2
+ import RenderObjectPipeline from './RenderObjectPipeline.js';
3
3
  import ComputePipeline from './ComputePipeline.js';
4
4
  import ProgrammableStage from './ProgrammableStage.js';
5
5
 
@@ -146,7 +146,7 @@ class Pipelines extends DataMap {
146
146
  *
147
147
  * @param {RenderObject} renderObject - The render object.
148
148
  * @param {?Array<Promise>} [promises=null] - An array of compilation promises which is only relevant in context of `Renderer.compileAsync()`.
149
- * @return {RenderPipeline} The render pipeline.
149
+ * @return {RenderObjectPipeline} The render pipeline.
150
150
  */
151
151
  getForRender( renderObject, promises = null ) {
152
152
 
@@ -344,7 +344,7 @@ class Pipelines extends DataMap {
344
344
  * @param {ProgrammableStage} stageFragment - The programmable stage representing the fragment shader.
345
345
  * @param {string} cacheKey - The cache key.
346
346
  * @param {?Array<Promise>} promises - An array of compilation promises which is only relevant in context of `Renderer.compileAsync()`.
347
- * @return {ComputePipeline} The compute pipeline.
347
+ * @return {RenderObjectPipeline} The render pipeline.
348
348
  */
349
349
  _getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey, promises ) {
350
350
 
@@ -356,7 +356,7 @@ class Pipelines extends DataMap {
356
356
 
357
357
  if ( pipeline === undefined ) {
358
358
 
359
- pipeline = new RenderPipeline( cacheKey, stageVertex, stageFragment );
359
+ pipeline = new RenderObjectPipeline( cacheKey, stageVertex, stageFragment );
360
360
 
361
361
  this.caches.set( cacheKey, pipeline );
362
362
 
@@ -1,223 +1,25 @@
1
- import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
2
- import { ColorManagement } from '../../math/ColorManagement.js';
3
- import { vec4, renderOutput } from '../../nodes/TSL.js';
4
- import { NoToneMapping } from '../../constants.js';
5
- import QuadMesh from '../../renderers/common/QuadMesh.js';
1
+ import RenderPipeline from './RenderPipeline.js';
6
2
  import { warnOnce } from '../../utils.js';
7
3
 
8
4
  /**
9
- * This module is responsible to manage the post processing setups in apps.
10
- * You usually create a single instance of this class and use it to define
11
- * the output of your post processing effect chain.
12
- * ```js
13
- * const postProcessing = new PostProcessing( renderer );
5
+ * @deprecated since r183. Use {@link RenderPipeline} instead. PostProcessing has been renamed to RenderPipeline.
14
6
  *
15
- * const scenePass = pass( scene, camera );
16
- *
17
- * postProcessing.outputNode = scenePass;
18
- * ```
19
- *
20
- * Note: This module can only be used with `WebGPURenderer`.
7
+ * This class is a wrapper for backward compatibility and will be removed in a future version.
21
8
  */
22
- class PostProcessing {
9
+ class PostProcessing extends RenderPipeline {
23
10
 
24
11
  /**
25
12
  * Constructs a new post processing management module.
26
13
  *
27
14
  * @param {Renderer} renderer - A reference to the renderer.
28
15
  * @param {Node<vec4>} outputNode - An optional output node.
16
+ * @deprecated since r183. Use {@link RenderPipeline} instead.
29
17
  */
30
- constructor( renderer, outputNode = vec4( 0, 0, 1, 1 ) ) {
31
-
32
- /**
33
- * A reference to the renderer.
34
- *
35
- * @type {Renderer}
36
- */
37
- this.renderer = renderer;
38
-
39
- /**
40
- * A node which defines the final output of the post
41
- * processing. This is usually the last node in a chain
42
- * of effect nodes.
43
- *
44
- * @type {Node<vec4>}
45
- */
46
- this.outputNode = outputNode;
47
-
48
- /**
49
- * Whether the default output tone mapping and color
50
- * space transformation should be enabled or not.
51
- *
52
- * It is enabled by default by it must be disabled when
53
- * effects must be executed after tone mapping and color
54
- * space conversion. A typical example is FXAA which
55
- * requires sRGB input.
56
- *
57
- * When set to `false`, the app must control the output
58
- * transformation with `RenderOutputNode`.
59
- *
60
- * ```js
61
- * const outputPass = renderOutput( scenePass );
62
- * ```
63
- *
64
- * @type {boolean}
65
- */
66
- this.outputColorTransform = true;
67
-
68
- /**
69
- * Must be set to `true` when the output node changes.
70
- *
71
- * @type {Node<vec4>}
72
- */
73
- this.needsUpdate = true;
74
-
75
- const material = new NodeMaterial();
76
- material.name = 'PostProcessing';
77
-
78
- /**
79
- * The full screen quad that is used to render
80
- * the effects.
81
- *
82
- * @private
83
- * @type {QuadMesh}
84
- */
85
- this._quadMesh = new QuadMesh( material );
86
- this._quadMesh.name = 'Post-Processing';
87
-
88
- /**
89
- * The context of the post processing stack.
90
- *
91
- * @private
92
- * @type {?Object}
93
- * @default null
94
- */
95
- this._context = null;
96
-
97
- }
98
-
99
- /**
100
- * When `PostProcessing` is used to apply post processing effects,
101
- * the application must use this version of `render()` inside
102
- * its animation loop (not the one from the renderer).
103
- */
104
- render() {
105
-
106
- const renderer = this.renderer;
107
-
108
- this._update();
109
-
110
- if ( this._context.onBeforePostProcessing !== null ) this._context.onBeforePostProcessing();
111
-
112
- const toneMapping = renderer.toneMapping;
113
- const outputColorSpace = renderer.outputColorSpace;
114
-
115
- renderer.toneMapping = NoToneMapping;
116
- renderer.outputColorSpace = ColorManagement.workingColorSpace;
117
-
118
- //
119
-
120
- const currentXR = renderer.xr.enabled;
121
- renderer.xr.enabled = false;
122
-
123
- this._quadMesh.render( renderer );
124
-
125
- renderer.xr.enabled = currentXR;
126
-
127
- //
128
-
129
- renderer.toneMapping = toneMapping;
130
- renderer.outputColorSpace = outputColorSpace;
131
-
132
- if ( this._context.onAfterPostProcessing !== null ) this._context.onAfterPostProcessing();
133
-
134
- }
135
-
136
- /**
137
- * Returns the current context of the post processing stack.
138
- *
139
- * @readonly
140
- * @type {?Object}
141
- */
142
- get context() {
143
-
144
- return this._context;
145
-
146
- }
147
-
148
- /**
149
- * Frees internal resources.
150
- */
151
- dispose() {
152
-
153
- this._quadMesh.material.dispose();
154
-
155
- }
156
-
157
- /**
158
- * Updates the state of the module.
159
- *
160
- * @private
161
- */
162
- _update() {
163
-
164
- if ( this.needsUpdate === true ) {
165
-
166
- const renderer = this.renderer;
167
-
168
- const toneMapping = renderer.toneMapping;
169
- const outputColorSpace = renderer.outputColorSpace;
170
-
171
- const context = {
172
- postProcessing: this,
173
- onBeforePostProcessing: null,
174
- onAfterPostProcessing: null
175
- };
176
-
177
- let outputNode = this.outputNode;
178
-
179
- if ( this.outputColorTransform === true ) {
180
-
181
- outputNode = outputNode.context( context );
182
-
183
- outputNode = renderOutput( outputNode, toneMapping, outputColorSpace );
184
-
185
- } else {
186
-
187
- context.toneMapping = toneMapping;
188
- context.outputColorSpace = outputColorSpace;
189
-
190
- outputNode = outputNode.context( context );
191
-
192
- }
193
-
194
- this._context = context;
195
-
196
- this._quadMesh.material.fragmentNode = outputNode;
197
- this._quadMesh.material.needsUpdate = true;
198
-
199
- this.needsUpdate = false;
200
-
201
- }
202
-
203
- }
204
-
205
- /**
206
- * When `PostProcessing` is used to apply post processing effects,
207
- * the application must use this version of `renderAsync()` inside
208
- * its animation loop (not the one from the renderer).
209
- *
210
- * @async
211
- * @deprecated
212
- * @return {Promise} A Promise that resolves when the render has been finished.
213
- */
214
- async renderAsync() {
215
-
216
- warnOnce( 'PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.' ); // @deprecated r181
18
+ constructor( renderer, outputNode ) {
217
19
 
218
- await this.renderer.init();
20
+ warnOnce( 'PostProcessing: "PostProcessing" has been renamed to "RenderPipeline". Please update your code to use "THREE.RenderPipeline" instead.' ); // @deprecated, r183
219
21
 
220
- this.render();
22
+ super( renderer, outputNode );
221
23
 
222
24
  }
223
25
 
@@ -47,7 +47,8 @@ class RenderBundles {
47
47
 
48
48
  }
49
49
 
50
- _chainKeys.length = 0;
50
+ _chainKeys[ 0 ] = null;
51
+ _chainKeys[ 1 ] = null;
51
52
 
52
53
  return bundle;
53
54
 
@@ -25,6 +25,14 @@ class RenderContext {
25
25
  */
26
26
  this.id = _id ++;
27
27
 
28
+ /**
29
+ * The MRT configuration.
30
+ *
31
+ * @type {?MRTNode}
32
+ * @default null
33
+ */
34
+ this.mrt = null;
35
+
28
36
  /**
29
37
  * Whether the current active framebuffer has a color attachment.
30
38
  *
@@ -214,6 +222,14 @@ class RenderContext {
214
222
  */
215
223
  this.clippingContext = null;
216
224
 
225
+ /**
226
+ * The current camera.
227
+ *
228
+ * @type {?Camera}
229
+ * @default null
230
+ */
231
+ this.camera = null;
232
+
217
233
  /**
218
234
  * This flag can be used for type testing.
219
235
  *
@@ -1,11 +1,4 @@
1
- import ChainMap from './ChainMap.js';
2
1
  import RenderContext from './RenderContext.js';
3
- import { Scene } from '../../scenes/Scene.js';
4
- import { Camera } from '../../cameras/Camera.js';
5
-
6
- const _chainKeys = [];
7
- const _defaultScene = /*@__PURE__*/ new Scene();
8
- const _defaultCamera = /*@__PURE__*/ new Camera();
9
2
 
10
3
  /**
11
4
  * This module manages the render contexts of the renderer.
@@ -16,38 +9,38 @@ class RenderContexts {
16
9
 
17
10
  /**
18
11
  * Constructs a new render context management component.
12
+ *
13
+ * @param {Renderer} renderer - The renderer.
19
14
  */
20
- constructor() {
15
+ constructor( renderer ) {
16
+
17
+ /**
18
+ * The renderer.
19
+ *
20
+ * @type {Renderer}
21
+ */
22
+ this.renderer = renderer;
21
23
 
22
24
  /**
23
- * A dictionary that manages render contexts in chain maps
24
- * for each attachment state.
25
+ * A dictionary that manages render contexts.
25
26
  *
26
- * @type {Object<string,ChainMap>}
27
+ * @type {Object<string,RenderContext>}
27
28
  */
28
- this.chainMaps = {};
29
+ this._renderContexts = {};
29
30
 
30
31
  }
31
32
 
32
33
  /**
33
34
  * Returns a render context for the given scene, camera and render target.
34
35
  *
35
- * @param {Scene} scene - The scene.
36
- * @param {Camera} camera - The camera that is used to render the scene.
37
36
  * @param {?RenderTarget} [renderTarget=null] - The active render target.
38
- * @param {?MRT} [mrt=null] - The active multiple render target.
37
+ * @param {?MRTNode} [mrt=null] - The MRT configuration
38
+ * @param {?number} [callDepth=0] - The call depth of the renderer.
39
39
  * @return {RenderContext} The render context.
40
40
  */
41
- get( scene, camera, renderTarget = null, mrt = null ) {
42
-
43
- _chainKeys[ 0 ] = scene;
44
- _chainKeys[ 1 ] = camera;
45
-
46
- if ( mrt !== null ) {
41
+ get( renderTarget = null, mrt = null, callDepth = 0 ) {
47
42
 
48
- _chainKeys[ 2 ] = mrt;
49
-
50
- }
43
+ //
51
44
 
52
45
  let attachmentState;
53
46
 
@@ -58,54 +51,38 @@ class RenderContexts {
58
51
  } else {
59
52
 
60
53
  const format = renderTarget.texture.format;
54
+ const type = renderTarget.texture.type;
61
55
  const count = renderTarget.textures.length;
62
56
 
63
- attachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
57
+ attachmentState = `${ count }:${ format }:${ type }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
64
58
 
65
59
  }
66
60
 
67
- const chainMap = this._getChainMap( attachmentState );
61
+ //
62
+
63
+ const mrtState = ( mrt !== null ) ? mrt.id : 'default';
64
+
65
+ //
68
66
 
69
- let renderState = chainMap.get( _chainKeys );
67
+ const renderStateKey = attachmentState + '-' + mrtState + '-' + callDepth;
68
+
69
+ let renderState = this._renderContexts[ renderStateKey ];
70
70
 
71
71
  if ( renderState === undefined ) {
72
72
 
73
73
  renderState = new RenderContext();
74
+ renderState.mrt = mrt;
74
75
 
75
- chainMap.set( _chainKeys, renderState );
76
+ this._renderContexts[ renderStateKey ] = renderState;
76
77
 
77
78
  }
78
79
 
79
- _chainKeys.length = 0;
80
-
81
80
  if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
82
81
 
83
- return renderState;
82
+ renderState.clearDepthValue = this.renderer.getClearDepth();
83
+ renderState.clearStencilValue = this.renderer.getClearStencil();
84
84
 
85
- }
86
-
87
- /**
88
- * Returns a render context intended for clear operations.
89
- *
90
- * @param {?RenderTarget} [renderTarget=null] - The active render target.
91
- * @return {RenderContext} The render context.
92
- */
93
- getForClear( renderTarget = null ) {
94
-
95
- return this.get( _defaultScene, _defaultCamera, renderTarget );
96
-
97
- }
98
-
99
- /**
100
- * Returns a chain map for the given attachment state.
101
- *
102
- * @private
103
- * @param {string} attachmentState - The attachment state.
104
- * @return {ChainMap} The chain map.
105
- */
106
- _getChainMap( attachmentState ) {
107
-
108
- return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
85
+ return renderState;
109
86
 
110
87
  }
111
88
 
@@ -114,7 +91,7 @@ class RenderContexts {
114
91
  */
115
92
  dispose() {
116
93
 
117
- this.chainMaps = {};
94
+ this._renderContexts = {};
118
95
 
119
96
  }
120
97
 
@@ -57,7 +57,8 @@ class RenderLists {
57
57
 
58
58
  }
59
59
 
60
- _chainKeys.length = 0;
60
+ _chainKeys[ 0 ] = null;
61
+ _chainKeys[ 1 ] = null;
61
62
 
62
63
  return list;
63
64
 
@@ -511,8 +511,7 @@ class RenderObject {
511
511
 
512
512
  // geometry attribute
513
513
  attribute = geometry.getAttribute( nodeAttribute.name );
514
-
515
- attributesId[ nodeAttribute.name ] = attribute.version;
514
+ attributesId[ nodeAttribute.name ] = attribute.id;
516
515
 
517
516
  }
518
517
 
@@ -882,7 +881,7 @@ class RenderObject {
882
881
 
883
882
  }
884
883
 
885
- cacheKey = hash( cacheKey, this.camera.id, this.renderer.contextNode.id, this.renderer.contextNode.version );
884
+ cacheKey = hash( cacheKey, this.renderer.contextNode.id, this.renderer.contextNode.version );
886
885
 
887
886
  return cacheKey;
888
887
 
@@ -0,0 +1,40 @@
1
+ import Pipeline from './Pipeline.js';
2
+
3
+ /**
4
+ * Class for representing render pipelines.
5
+ *
6
+ * @private
7
+ * @augments Pipeline
8
+ */
9
+ class RenderObjectPipeline extends Pipeline {
10
+
11
+ /**
12
+ * Constructs a new render object pipeline.
13
+ *
14
+ * @param {string} cacheKey - The pipeline's cache key.
15
+ * @param {ProgrammableStage} vertexProgram - The pipeline's vertex shader.
16
+ * @param {ProgrammableStage} fragmentProgram - The pipeline's fragment shader.
17
+ */
18
+ constructor( cacheKey, vertexProgram, fragmentProgram ) {
19
+
20
+ super( cacheKey );
21
+
22
+ /**
23
+ * The pipeline's vertex shader.
24
+ *
25
+ * @type {ProgrammableStage}
26
+ */
27
+ this.vertexProgram = vertexProgram;
28
+
29
+ /**
30
+ * The pipeline's fragment shader.
31
+ *
32
+ * @type {ProgrammableStage}
33
+ */
34
+ this.fragmentProgram = fragmentProgram;
35
+
36
+ }
37
+
38
+ }
39
+
40
+ export default RenderObjectPipeline;
@@ -91,12 +91,15 @@ class RenderObjects {
91
91
 
92
92
  const chainMap = this.getChainMap( passId );
93
93
 
94
- // reuse chainArray
94
+ // set chain keys
95
+
95
96
  _chainKeys[ 0 ] = object;
96
97
  _chainKeys[ 1 ] = material;
97
98
  _chainKeys[ 2 ] = renderContext;
98
99
  _chainKeys[ 3 ] = lightsNode;
99
100
 
101
+ //
102
+
100
103
  let renderObject = chainMap.get( _chainKeys );
101
104
 
102
105
  if ( renderObject === undefined ) {
@@ -107,6 +110,12 @@ class RenderObjects {
107
110
 
108
111
  } else {
109
112
 
113
+ // update references
114
+
115
+ renderObject.camera = camera;
116
+
117
+ //
118
+
110
119
  renderObject.updateClipping( clippingContext );
111
120
 
112
121
  if ( renderObject.needsGeometryUpdate ) {
@@ -133,7 +142,14 @@ class RenderObjects {
133
142
 
134
143
  }
135
144
 
136
- _chainKeys.length = 0;
145
+ // reset chain array
146
+
147
+ _chainKeys[ 0 ] = null;
148
+ _chainKeys[ 1 ] = null;
149
+ _chainKeys[ 2 ] = null;
150
+ _chainKeys[ 3 ] = null;
151
+
152
+ //
137
153
 
138
154
  return renderObject;
139
155