super-three 0.172.0 → 0.173.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 (178) hide show
  1. package/LICENSE +1 -1
  2. package/build/three.cjs +439 -380
  3. package/build/three.core.js +413 -41
  4. package/build/three.core.min.js +2 -2
  5. package/build/three.module.js +28 -344
  6. package/build/three.module.min.js +2 -2
  7. package/build/three.tsl.js +11 -3
  8. package/build/three.tsl.min.js +2 -2
  9. package/build/three.webgpu.js +7550 -1798
  10. package/build/three.webgpu.min.js +2 -2
  11. package/build/three.webgpu.nodes.js +7551 -1798
  12. package/build/three.webgpu.nodes.min.js +2 -2
  13. package/examples/jsm/animation/CCDIKSolver.js +6 -5
  14. package/examples/jsm/capabilities/WebGPU.js +1 -1
  15. package/examples/jsm/controls/ArcballControls.js +23 -21
  16. package/examples/jsm/exporters/GLTFExporter.js +26 -25
  17. package/examples/jsm/geometries/TextGeometry.js +1 -12
  18. package/examples/jsm/interactive/InteractiveGroup.js +108 -51
  19. package/examples/jsm/libs/demuxer_mp4.js +109 -0
  20. package/examples/jsm/loaders/GCodeLoader.js +3 -1
  21. package/examples/jsm/loaders/GLTFLoader.js +0 -2
  22. package/examples/jsm/loaders/TDSLoader.js +0 -1
  23. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  24. package/examples/jsm/misc/GPUComputationRenderer.js +6 -7
  25. package/examples/jsm/misc/ProgressiveLightMap.js +4 -3
  26. package/examples/jsm/misc/ProgressiveLightMapGPU.js +4 -3
  27. package/examples/jsm/misc/Volume.js +7 -5
  28. package/examples/jsm/misc/VolumeSlice.js +5 -3
  29. package/examples/jsm/objects/WaterMesh.js +25 -20
  30. package/examples/jsm/physics/JoltPhysics.js +7 -7
  31. package/examples/jsm/physics/RapierPhysics.js +4 -4
  32. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  33. package/examples/jsm/shaders/OutputShader.js +5 -1
  34. package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
  35. package/examples/jsm/transpiler/TSLEncoder.js +2 -0
  36. package/package.json +1 -1
  37. package/src/Three.Core.js +2 -0
  38. package/src/Three.TSL.js +9 -1
  39. package/src/cameras/ArrayCamera.js +1 -0
  40. package/src/constants.js +6 -1
  41. package/src/core/BufferAttribute.js +4 -0
  42. package/src/core/EventDispatcher.js +8 -6
  43. package/src/extras/ImageUtils.js +1 -11
  44. package/src/loaders/nodes/NodeObjectLoader.js +1 -1
  45. package/src/materials/nodes/MeshBasicNodeMaterial.js +1 -1
  46. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +1 -1
  47. package/src/materials/nodes/NodeMaterial.js +5 -5
  48. package/src/materials/nodes/NodeMaterials.js +0 -1
  49. package/src/materials/nodes/PointsNodeMaterial.js +109 -7
  50. package/src/materials/nodes/SpriteNodeMaterial.js +1 -1
  51. package/src/materials/nodes/VolumeNodeMaterial.js +3 -3
  52. package/src/materials/nodes/manager/NodeMaterialObserver.js +8 -0
  53. package/src/nodes/Nodes.js +4 -0
  54. package/src/nodes/TSL.js +4 -0
  55. package/src/nodes/accessors/Arrays.js +30 -8
  56. package/src/nodes/accessors/BatchNode.js +3 -3
  57. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  58. package/src/nodes/accessors/Camera.js +64 -3
  59. package/src/nodes/accessors/InstanceNode.js +1 -1
  60. package/src/nodes/accessors/MaterialNode.js +9 -9
  61. package/src/nodes/accessors/ModelViewProjectionNode.js +1 -1
  62. package/src/nodes/accessors/Normal.js +6 -2
  63. package/src/nodes/accessors/Object3DNode.js +0 -1
  64. package/src/nodes/accessors/Position.js +6 -6
  65. package/src/nodes/accessors/ReferenceBaseNode.js +2 -4
  66. package/src/nodes/accessors/ReferenceNode.js +2 -3
  67. package/src/nodes/accessors/StorageBufferNode.js +42 -5
  68. package/src/nodes/accessors/Tangent.js +2 -2
  69. package/src/nodes/accessors/Texture3DNode.js +1 -1
  70. package/src/nodes/accessors/TextureNode.js +12 -5
  71. package/src/nodes/accessors/UniformArrayNode.js +9 -3
  72. package/src/nodes/accessors/VelocityNode.js +0 -2
  73. package/src/nodes/code/ScriptableNode.js +3 -3
  74. package/src/nodes/core/ArrayNode.js +125 -0
  75. package/src/nodes/core/ConstNode.js +8 -0
  76. package/src/nodes/core/Node.js +14 -1
  77. package/src/nodes/core/NodeBuilder.js +229 -19
  78. package/src/nodes/core/NodeUtils.js +11 -1
  79. package/src/nodes/core/NodeVar.js +17 -1
  80. package/src/nodes/core/OutputStructNode.js +19 -9
  81. package/src/nodes/core/StackNode.js +20 -1
  82. package/src/nodes/core/StructNode.js +121 -0
  83. package/src/nodes/core/StructType.js +13 -0
  84. package/src/nodes/core/StructTypeNode.js +82 -21
  85. package/src/nodes/core/TempNode.js +1 -1
  86. package/src/nodes/core/VarNode.js +94 -7
  87. package/src/nodes/core/VaryingNode.js +19 -3
  88. package/src/nodes/display/BlendModes.js +88 -1
  89. package/src/nodes/display/BumpMapNode.js +6 -6
  90. package/src/nodes/display/NormalMapNode.js +6 -6
  91. package/src/nodes/display/PassNode.js +3 -1
  92. package/src/nodes/display/ScreenNode.js +9 -0
  93. package/src/nodes/fog/Fog.js +17 -0
  94. package/src/nodes/gpgpu/AtomicFunctionNode.js +20 -4
  95. package/src/nodes/gpgpu/ComputeBuiltinNode.js +8 -0
  96. package/src/nodes/gpgpu/WorkgroupInfoNode.js +1 -1
  97. package/src/nodes/lighting/ShadowNode.js +1 -1
  98. package/src/nodes/math/ConditionalNode.js +8 -1
  99. package/src/nodes/math/MathNode.js +14 -1
  100. package/src/nodes/math/OperatorNode.js +96 -18
  101. package/src/nodes/pmrem/PMREMUtils.js +1 -1
  102. package/src/nodes/shapes/Shapes.js +33 -0
  103. package/src/nodes/tsl/TSLBase.js +1 -0
  104. package/src/nodes/tsl/TSLCore.js +22 -2
  105. package/src/nodes/utils/ArrayElementNode.js +1 -1
  106. package/src/nodes/utils/LoopNode.js +8 -1
  107. package/src/nodes/utils/MemberNode.js +68 -0
  108. package/src/nodes/utils/StorageArrayElementNode.js +14 -0
  109. package/src/nodes/utils/Timer.js +21 -0
  110. package/src/objects/BatchedMesh.js +1 -1
  111. package/src/objects/Line.js +6 -6
  112. package/src/renderers/WebGLRenderer.js +7 -0
  113. package/src/renderers/common/Animation.js +23 -1
  114. package/src/renderers/common/Backend.js +58 -15
  115. package/src/renderers/common/Background.js +14 -0
  116. package/src/renderers/common/Binding.js +1 -1
  117. package/src/renderers/common/BufferUtils.js +1 -1
  118. package/src/renderers/common/BundleGroup.js +1 -1
  119. package/src/renderers/common/ChainMap.js +9 -7
  120. package/src/renderers/common/ClippingContext.js +1 -1
  121. package/src/renderers/common/Color4.js +7 -3
  122. package/src/renderers/common/Geometries.js +2 -23
  123. package/src/renderers/common/Info.js +1 -45
  124. package/src/renderers/common/Lighting.js +8 -6
  125. package/src/renderers/common/Pipelines.js +3 -3
  126. package/src/renderers/common/PostProcessing.js +24 -8
  127. package/src/renderers/common/QuadMesh.js +1 -1
  128. package/src/renderers/common/RenderBundles.js +9 -3
  129. package/src/renderers/common/RenderContext.js +37 -3
  130. package/src/renderers/common/RenderContexts.js +30 -17
  131. package/src/renderers/common/RenderList.js +2 -2
  132. package/src/renderers/common/RenderLists.js +9 -3
  133. package/src/renderers/common/RenderObject.js +76 -17
  134. package/src/renderers/common/RenderObjects.js +9 -7
  135. package/src/renderers/common/Renderer.js +86 -67
  136. package/src/renderers/common/SampledTexture.js +0 -1
  137. package/src/renderers/common/StorageBufferAttribute.js +1 -1
  138. package/src/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  139. package/src/renderers/common/StorageTexture.js +1 -1
  140. package/src/renderers/common/Textures.js +14 -7
  141. package/src/renderers/common/TimestampQueryPool.js +39 -0
  142. package/src/renderers/common/Uniform.js +37 -1
  143. package/src/renderers/common/UniformsGroup.js +2 -0
  144. package/src/renderers/common/XRManager.js +1193 -0
  145. package/src/renderers/common/XRRenderTarget.js +74 -0
  146. package/src/renderers/common/extras/PMREMGenerator.js +53 -8
  147. package/src/renderers/common/nodes/NodeBuilderState.js +4 -4
  148. package/src/renderers/common/nodes/NodeLibrary.js +5 -5
  149. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -1
  150. package/src/renderers/common/nodes/NodeUniform.js +54 -2
  151. package/src/renderers/common/nodes/Nodes.js +25 -18
  152. package/src/renderers/webgl/WebGLBackground.js +4 -0
  153. package/src/renderers/webgl-fallback/WebGLBackend.js +295 -110
  154. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +347 -17
  155. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +57 -0
  156. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
  157. package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
  158. package/src/renderers/webgl-fallback/utils/WebGLState.js +323 -11
  159. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +167 -21
  160. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +359 -0
  161. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +43 -0
  162. package/src/renderers/webgpu/WebGPUBackend.js +132 -149
  163. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +6 -4
  164. package/src/renderers/webgpu/WebGPURenderer.js +5 -4
  165. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +615 -41
  166. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +85 -6
  167. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +85 -0
  168. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +102 -3
  169. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +98 -1
  170. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +257 -9
  171. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +274 -0
  172. package/src/renderers/webgpu/utils/WebGPUUtils.js +86 -4
  173. package/src/renderers/webxr/WebXRManager.js +13 -2
  174. package/src/textures/VideoFrameTexture.js +35 -0
  175. package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -176
  176. package/examples/jsm/objects/InstancedPoints.js +0 -19
  177. package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -209
  178. package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -37
@@ -131,6 +131,14 @@ class RenderContext {
131
131
  */
132
132
  this.scissorValue = new Vector4();
133
133
 
134
+ /**
135
+ * The active render target.
136
+ *
137
+ * @type {RenderTarget?}
138
+ * @default null
139
+ */
140
+ this.renderTarget = null;
141
+
134
142
  /**
135
143
  * The textures of the active render target.
136
144
  * `null` when no render target is set.
@@ -157,6 +165,14 @@ class RenderContext {
157
165
  */
158
166
  this.activeCubeFace = 0;
159
167
 
168
+ /**
169
+ * The active mipmap level.
170
+ *
171
+ * @type {Number}
172
+ * @default 0
173
+ */
174
+ this.activeMipmapLevel = 0;
175
+
160
176
  /**
161
177
  * The number of MSAA samples. This value is always `1` when
162
178
  * MSAA isn't used.
@@ -167,7 +183,7 @@ class RenderContext {
167
183
  this.sampleCount = 1;
168
184
 
169
185
  /**
170
- * The framebuffers width in physical pixels.
186
+ * The active render target's width in physical pixels.
171
187
  *
172
188
  * @type {Number}
173
189
  * @default 0
@@ -175,13 +191,29 @@ class RenderContext {
175
191
  this.width = 0;
176
192
 
177
193
  /**
178
- * The framebuffers height in physical pixels.
194
+ * The active render target's height in physical pixels.
179
195
  *
180
196
  * @type {Number}
181
197
  * @default 0
182
198
  */
183
199
  this.height = 0;
184
200
 
201
+ /**
202
+ * The occlusion query count.
203
+ *
204
+ * @type {Number}
205
+ * @default 0
206
+ */
207
+ this.occlusionQueryCount = 0;
208
+
209
+ /**
210
+ * The current clipping context.
211
+ *
212
+ * @type {ClippingContext?}
213
+ * @default null
214
+ */
215
+ this.clippingContext = null;
216
+
185
217
  /**
186
218
  * This flag can be used for type testing.
187
219
  *
@@ -207,7 +239,9 @@ class RenderContext {
207
239
  }
208
240
 
209
241
  /**
210
- * Computes a cache key for the given render context.
242
+ * Computes a cache key for the given render context. This key
243
+ * should identify the render target state so it is possible to
244
+ * configure the correct attachments in the respective backend.
211
245
  *
212
246
  * @param {RenderContext} renderContext - The render context.
213
247
  * @return {Number} The cache key.
@@ -1,5 +1,11 @@
1
1
  import ChainMap from './ChainMap.js';
2
2
  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();
3
9
 
4
10
  /**
5
11
  * This module manages the render contexts of the renderer.
@@ -26,23 +32,15 @@ class RenderContexts {
26
32
  /**
27
33
  * Returns a render context for the given scene, camera and render target.
28
34
  *
29
- * @param {Scene?} [scene=null] - The scene. The parameter can become `null` e.g. when the renderer clears a render target.
30
- * @param {Camera?} [camera=null] - The camera that is used to render the scene. The parameter can become `null` e.g. when the renderer clears a render target.
35
+ * @param {Scene} scene - The scene.
36
+ * @param {Camera} camera - The camera that is used to render the scene.
31
37
  * @param {RenderTarget?} [renderTarget=null] - The active render target.
32
38
  * @return {RenderContext} The render context.
33
39
  */
34
- get( scene = null, camera = null, renderTarget = null ) {
35
-
36
- const chainKey = [];
37
- if ( scene !== null ) chainKey.push( scene );
38
- if ( camera !== null ) chainKey.push( camera );
39
-
40
- if ( chainKey.length === 0 ) {
41
-
42
- chainKey.push( { id: 'default' } );
43
-
44
- }
40
+ get( scene, camera, renderTarget = null ) {
45
41
 
42
+ _chainKeys[ 0 ] = scene;
43
+ _chainKeys[ 1 ] = camera;
46
44
 
47
45
  let attachmentState;
48
46
 
@@ -59,31 +57,46 @@ class RenderContexts {
59
57
 
60
58
  }
61
59
 
62
- const chainMap = this.getChainMap( attachmentState );
60
+ const chainMap = this._getChainMap( attachmentState );
63
61
 
64
- let renderState = chainMap.get( chainKey );
62
+ let renderState = chainMap.get( _chainKeys );
65
63
 
66
64
  if ( renderState === undefined ) {
67
65
 
68
66
  renderState = new RenderContext();
69
67
 
70
- chainMap.set( chainKey, renderState );
68
+ chainMap.set( _chainKeys, renderState );
71
69
 
72
70
  }
73
71
 
72
+ _chainKeys.length = 0;
73
+
74
74
  if ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;
75
75
 
76
76
  return renderState;
77
77
 
78
78
  }
79
79
 
80
+ /**
81
+ * Returns a render context intended for clear operations.
82
+ *
83
+ * @param {RenderTarget?} [renderTarget=null] - The active render target.
84
+ * @return {RenderContext} The render context.
85
+ */
86
+ getForClear( renderTarget = null ) {
87
+
88
+ return this.get( _defaultScene, _defaultCamera, renderTarget );
89
+
90
+ }
91
+
80
92
  /**
81
93
  * Returns a chain map for the given attachment state.
82
94
  *
95
+ * @private
83
96
  * @param {String} attachmentState - The attachment state.
84
97
  * @return {ChainMap} The chain map.
85
98
  */
86
- getChainMap( attachmentState ) {
99
+ _getChainMap( attachmentState ) {
87
100
 
88
101
  return this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );
89
102
 
@@ -356,8 +356,8 @@ class RenderList {
356
356
  /**
357
357
  * Sorts the internal render lists.
358
358
  *
359
- * @param {Function} customOpaqueSort - A custom sort function for opaque objects.
360
- * @param {Function} customTransparentSort - A custom sort function for transparent objects.
359
+ * @param {function(Any, Any): Number} customOpaqueSort - A custom sort function for opaque objects.
360
+ * @param {function(Any, Any): Number} customTransparentSort - A custom sort function for transparent objects.
361
361
  */
362
362
  sort( customOpaqueSort, customTransparentSort ) {
363
363
 
@@ -1,6 +1,8 @@
1
1
  import ChainMap from './ChainMap.js';
2
2
  import RenderList from './RenderList.js';
3
3
 
4
+ const _chainKeys = [];
5
+
4
6
  /**
5
7
  * This renderer module manages the render lists which are unique
6
8
  * per scene and camera combination.
@@ -42,17 +44,21 @@ class RenderLists {
42
44
  get( scene, camera ) {
43
45
 
44
46
  const lists = this.lists;
45
- const keys = [ scene, camera ];
46
47
 
47
- let list = lists.get( keys );
48
+ _chainKeys[ 0 ] = scene;
49
+ _chainKeys[ 1 ] = camera;
50
+
51
+ let list = lists.get( _chainKeys );
48
52
 
49
53
  if ( list === undefined ) {
50
54
 
51
55
  list = new RenderList( this.lighting, scene, camera );
52
- lists.set( keys, list );
56
+ lists.set( _chainKeys, list );
53
57
 
54
58
  }
55
59
 
60
+ _chainKeys.length = 0;
61
+
56
62
  return list;
57
63
 
58
64
  }
@@ -1,4 +1,4 @@
1
- import { hashString } from '../../nodes/core/NodeUtils.js';
1
+ import { hash, hashString } from '../../nodes/core/NodeUtils.js';
2
2
 
3
3
  let _id = 0;
4
4
 
@@ -54,7 +54,7 @@ function getKeys( obj ) {
54
54
  *
55
55
  * @private
56
56
  */
57
- export default class RenderObject {
57
+ class RenderObject {
58
58
 
59
59
  /**
60
60
  * Constructs a new render object.
@@ -180,6 +180,16 @@ export default class RenderObject {
180
180
  */
181
181
  this.pipeline = null;
182
182
 
183
+ /**
184
+ * Only relevant for objects using
185
+ * multiple materials. This represents a group entry
186
+ * from the respective `BufferGeometry`.
187
+ *
188
+ * @type {{start: Number, count: Number}?}
189
+ * @default null
190
+ */
191
+ this.group = null;
192
+
183
193
  /**
184
194
  * An array holding the vertex buffers which can
185
195
  * be buffer attributes but also interleaved buffers.
@@ -336,7 +346,7 @@ export default class RenderObject {
336
346
  /**
337
347
  * Returns the node builder state of this render object.
338
348
  *
339
- * @return {NodeBuilderState} The node buider state.
349
+ * @return {NodeBuilderState} The node builder state.
340
350
  */
341
351
  getNodeBuilderState() {
342
352
 
@@ -351,7 +361,7 @@ export default class RenderObject {
351
361
  */
352
362
  getMonitor() {
353
363
 
354
- return this._monitor || ( this._monitor = this.getNodeBuilderState().monitor );
364
+ return this._monitor || ( this._monitor = this.getNodeBuilderState().observer );
355
365
 
356
366
  }
357
367
 
@@ -366,6 +376,26 @@ export default class RenderObject {
366
376
 
367
377
  }
368
378
 
379
+ /**
380
+ * Returns a binding group by group name of this render object.
381
+ *
382
+ * @param {String} name - The name of the binding group.
383
+ * @return {BindGroup?} The bindings.
384
+ */
385
+ getBindingGroup( name ) {
386
+
387
+ for ( const bindingGroup of this.getBindings() ) {
388
+
389
+ if ( bindingGroup.name === name ) {
390
+
391
+ return bindingGroup;
392
+
393
+ }
394
+
395
+ }
396
+
397
+ }
398
+
369
399
  /**
370
400
  * Returns the index of the render object's geometry.
371
401
  *
@@ -558,6 +588,26 @@ export default class RenderObject {
558
588
 
559
589
  }
560
590
 
591
+ // structural equality isn't sufficient for morph targets since the
592
+ // data are maintained in textures. only if the targets are all equal
593
+ // the texture and thus the instance of `MorphNode` can be shared.
594
+
595
+ for ( const name of Object.keys( geometry.morphAttributes ).sort() ) {
596
+
597
+ const targets = geometry.morphAttributes[ name ];
598
+
599
+ cacheKey += 'morph-' + name + ',';
600
+
601
+ for ( let i = 0, l = targets.length; i < l; i ++ ) {
602
+
603
+ const attribute = targets[ i ];
604
+
605
+ cacheKey += attribute.id + ',';
606
+
607
+ }
608
+
609
+ }
610
+
561
611
  if ( geometry.index ) {
562
612
 
563
613
  cacheKey += 'index,';
@@ -573,7 +623,7 @@ export default class RenderObject {
573
623
  *
574
624
  * The material cache key is part of the render object cache key.
575
625
  *
576
- * @return {String} The material cache key.
626
+ * @return {Number} The material cache key.
577
627
  */
578
628
  getMaterialCacheKey() {
579
629
 
@@ -641,12 +691,6 @@ export default class RenderObject {
641
691
 
642
692
  }
643
693
 
644
- if ( object.morphTargetInfluences ) {
645
-
646
- cacheKey += object.morphTargetInfluences.length + ',';
647
-
648
- }
649
-
650
694
  if ( object.isBatchedMesh ) {
651
695
 
652
696
  cacheKey += object._matricesTexture.uuid + ',';
@@ -696,7 +740,7 @@ export default class RenderObject {
696
740
  * `RenderObjects.get()`. The render object's NodeMaterialObserver is then used to detect
697
741
  * a need for a refresh due to material, geometry or object related value changes.
698
742
  *
699
- * TODO: Investigate if it's possible to merge boths steps so there is only a single place
743
+ * TODO: Investigate if it's possible to merge both steps so there is only a single place
700
744
  * that performs the 'needsUpdate' check.
701
745
  *
702
746
  * @type {Boolean}
@@ -711,17 +755,30 @@ export default class RenderObject {
711
755
  /**
712
756
  * Returns the dynamic cache key which represents a key that is computed per draw command.
713
757
  *
714
- * @return {String} The cache key.
758
+ * @return {Number} The cache key.
715
759
  */
716
760
  getDynamicCacheKey() {
717
761
 
718
- // Environment Nodes Cache Key
762
+ let cacheKey = 0;
763
+
764
+ // `Nodes.getCacheKey()` returns an environment cache key which is not relevant when
765
+ // the renderer is inside a shadow pass.
766
+
767
+ if ( this.material.isShadowPassMaterial !== true ) {
768
+
769
+ cacheKey = this._nodes.getCacheKey( this.scene, this.lightsNode );
770
+
771
+ }
772
+
773
+ if ( this.camera.isArrayCamera ) {
719
774
 
720
- let cacheKey = this._nodes.getCacheKey( this.scene, this.lightsNode );
775
+ cacheKey = hash( cacheKey, this.camera.cameras.length );
776
+
777
+ }
721
778
 
722
779
  if ( this.object.receiveShadow ) {
723
780
 
724
- cacheKey += 1;
781
+ cacheKey = hash( cacheKey, 1 );
725
782
 
726
783
  }
727
784
 
@@ -732,7 +789,7 @@ export default class RenderObject {
732
789
  /**
733
790
  * Returns the render object's cache key.
734
791
  *
735
- * @return {String} The cache key.
792
+ * @return {Number} The cache key.
736
793
  */
737
794
  getCacheKey() {
738
795
 
@@ -752,3 +809,5 @@ export default class RenderObject {
752
809
  }
753
810
 
754
811
  }
812
+
813
+ export default RenderObject;
@@ -1,7 +1,7 @@
1
1
  import ChainMap from './ChainMap.js';
2
2
  import RenderObject from './RenderObject.js';
3
3
 
4
- const _chainArray = [];
4
+ const _chainKeys = [];
5
5
 
6
6
  /**
7
7
  * This module manages the render objects of the renderer.
@@ -92,18 +92,18 @@ class RenderObjects {
92
92
  const chainMap = this.getChainMap( passId );
93
93
 
94
94
  // reuse chainArray
95
- _chainArray[ 0 ] = object;
96
- _chainArray[ 1 ] = material;
97
- _chainArray[ 2 ] = renderContext;
98
- _chainArray[ 3 ] = lightsNode;
95
+ _chainKeys[ 0 ] = object;
96
+ _chainKeys[ 1 ] = material;
97
+ _chainKeys[ 2 ] = renderContext;
98
+ _chainKeys[ 3 ] = lightsNode;
99
99
 
100
- let renderObject = chainMap.get( _chainArray );
100
+ let renderObject = chainMap.get( _chainKeys );
101
101
 
102
102
  if ( renderObject === undefined ) {
103
103
 
104
104
  renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext, passId );
105
105
 
106
- chainMap.set( _chainArray, renderObject );
106
+ chainMap.set( _chainKeys, renderObject );
107
107
 
108
108
  } else {
109
109
 
@@ -133,6 +133,8 @@ class RenderObjects {
133
133
 
134
134
  }
135
135
 
136
+ _chainKeys.length = 0;
137
+
136
138
  return renderObject;
137
139
 
138
140
  }