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
@@ -0,0 +1,74 @@
1
+ import { RenderTarget } from '../../core/RenderTarget.js';
2
+
3
+ /**
4
+ * A special type of render target that is used when rendering
5
+ * with the WebXR Device API.
6
+ *
7
+ * @private
8
+ * @augments RenderTarget
9
+ */
10
+ class XRRenderTarget extends RenderTarget {
11
+
12
+ /**
13
+ * Constructs a new XR render target.
14
+ *
15
+ * @param {Number} [width=1] - The width of the render target.
16
+ * @param {Number} [height=1] - The height of the render target.
17
+ * @param {Object} [options={}] - The configuration options.
18
+ */
19
+ constructor( width = 1, height = 1, options = {} ) {
20
+
21
+ super( width, height, options );
22
+
23
+ /**
24
+ * This flag can be used for type testing.
25
+ *
26
+ * @type {Boolean}
27
+ * @readonly
28
+ * @default true
29
+ */
30
+ this.isXRRenderTarget = true;
31
+
32
+ /**
33
+ * Whether the attachments of the render target
34
+ * are defined by external textures. This flag is
35
+ * set to `true` when using the WebXR Layers API.
36
+ *
37
+ * @type {Boolean}
38
+ * @default false
39
+ */
40
+ this.hasExternalTextures = false;
41
+
42
+ /**
43
+ * Whether a depth buffer should automatically be allocated
44
+ * for this XR render target or not.
45
+ *
46
+ * Allocating a depth buffer is the default behavior of XR render
47
+ * targets. However, when using the WebXR Layers API, this flag
48
+ * must be set to `false` when the `ignoreDepthValues` property of
49
+ * the projection layers evaluates to `false`.
50
+ *
51
+ * Reference: {@link https://www.w3.org/TR/webxrlayers-1/#dom-xrprojectionlayer-ignoredepthvalues}.
52
+ *
53
+ * @type {Boolean}
54
+ * @default true
55
+ */
56
+ this.autoAllocateDepthBuffer = true;
57
+
58
+ }
59
+
60
+ copy( source ) {
61
+
62
+ super.copy( source );
63
+
64
+ this.hasExternalTextures = source.hasExternalTextures;
65
+ this.autoAllocateDepthBuffer = source.autoAllocateDepthBuffer;
66
+
67
+ return this;
68
+
69
+ }
70
+
71
+
72
+ }
73
+
74
+ export { XRRenderTarget };
@@ -69,7 +69,9 @@ const _axisDirections = [
69
69
  /*@__PURE__*/ new Vector3( 1, 1, 1 )
70
70
  ];
71
71
 
72
- //
72
+ // maps blur materials to their uniforms dictionary
73
+
74
+ const _uniformsMap = new WeakMap();
73
75
 
74
76
  // WebGPU Face indices
75
77
  const _faceLib = [
@@ -77,8 +79,8 @@ const _faceLib = [
77
79
  0, 4, 2
78
80
  ];
79
81
 
80
- const direction = getDirection( uv(), attribute( 'faceIndex' ) ).normalize();
81
- const outputDirection = vec3( direction.x, direction.y, direction.z );
82
+ const _direction = /*@__PURE__*/ getDirection( uv(), attribute( 'faceIndex' ) ).normalize();
83
+ const _outputDirection = /*@__PURE__*/ vec3( _direction.x, _direction.y, _direction.z );
82
84
 
83
85
  /**
84
86
  * This class generates a Prefiltered, Mipmapped Radiance Environment Map
@@ -135,6 +137,7 @@ class PMREMGenerator {
135
137
  * @param {Number} [far=100] - The far plane distance.
136
138
  * @param {RenderTarget?} [renderTarget=null] - The render target to use.
137
139
  * @return {RenderTarget} The resulting PMREM.
140
+ * @see fromSceneAsync
138
141
  */
139
142
  fromScene( scene, sigma = 0, near = 0.1, far = 100, renderTarget = null ) {
140
143
 
@@ -175,6 +178,21 @@ class PMREMGenerator {
175
178
 
176
179
  }
177
180
 
181
+ /**
182
+ * Generates a PMREM from a supplied Scene, which can be faster than using an
183
+ * image if networking bandwidth is low. Optional sigma specifies a blur radius
184
+ * in radians to be applied to the scene before PMREM generation. Optional near
185
+ * and far planes ensure the scene is rendered in its entirety (the cubeCamera
186
+ * is placed at the origin).
187
+ *
188
+ * @param {Scene} scene - The scene to be captured.
189
+ * @param {Number} [sigma=0] - The blur radius in radians.
190
+ * @param {Number} [near=0.1] - The near plane distance.
191
+ * @param {Number} [far=100] - The far plane distance.
192
+ * @param {RenderTarget?} [renderTarget=null] - The render target to use.
193
+ * @return {Promise<RenderTarget>} The resulting PMREM.
194
+ * @see fromScene
195
+ */
178
196
  async fromSceneAsync( scene, sigma = 0, near = 0.1, far = 100, renderTarget = null ) {
179
197
 
180
198
  if ( this._hasInitialized === false ) await this._renderer.init();
@@ -191,6 +209,7 @@ class PMREMGenerator {
191
209
  * @param {Texture} equirectangular - The equirectangular texture to be converted.
192
210
  * @param {RenderTarget?} [renderTarget=null] - The render target to use.
193
211
  * @return {RenderTarget} The resulting PMREM.
212
+ * @see fromEquirectangularAsync
194
213
  */
195
214
  fromEquirectangular( equirectangular, renderTarget = null ) {
196
215
 
@@ -212,6 +231,16 @@ class PMREMGenerator {
212
231
 
213
232
  }
214
233
 
234
+ /**
235
+ * Generates a PMREM from an equirectangular texture, which can be either LDR
236
+ * or HDR. The ideal input image size is 1k (1024 x 512),
237
+ * as this matches best with the 256 x 256 cubemap output.
238
+ *
239
+ * @param {Texture} equirectangular - The equirectangular texture to be converted.
240
+ * @param {RenderTarget?} [renderTarget=null] - The render target to use.
241
+ * @return {Promise<RenderTarget>} The resulting PMREM.
242
+ * @see fromEquirectangular
243
+ */
215
244
  async fromEquirectangularAsync( equirectangular, renderTarget = null ) {
216
245
 
217
246
  if ( this._hasInitialized === false ) await this._renderer.init();
@@ -228,6 +257,7 @@ class PMREMGenerator {
228
257
  * @param {Texture} cubemap - The cubemap texture to be converted.
229
258
  * @param {RenderTarget?} [renderTarget=null] - The render target to use.
230
259
  * @return {RenderTarget} The resulting PMREM.
260
+ * @see fromCubemapAsync
231
261
  */
232
262
  fromCubemap( cubemap, renderTarget = null ) {
233
263
 
@@ -249,6 +279,16 @@ class PMREMGenerator {
249
279
 
250
280
  }
251
281
 
282
+ /**
283
+ * Generates a PMREM from an cubemap texture, which can be either LDR
284
+ * or HDR. The ideal input cube size is 256 x 256,
285
+ * with the 256 x 256 cubemap output.
286
+ *
287
+ * @param {Texture} cubemap - The cubemap texture to be converted.
288
+ * @param {RenderTarget?} [renderTarget=null] - The render target to use.
289
+ * @return {Promise<RenderTarget>} The resulting PMREM.
290
+ * @see fromCubemap
291
+ */
252
292
  async fromCubemapAsync( cubemap, renderTarget = null ) {
253
293
 
254
294
  if ( this._hasInitialized === false ) await this._renderer.init();
@@ -260,6 +300,8 @@ class PMREMGenerator {
260
300
  /**
261
301
  * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during
262
302
  * your texture's network fetch for increased concurrency.
303
+ *
304
+ * @returns {Promise}
263
305
  */
264
306
  async compileCubemapShader() {
265
307
 
@@ -275,6 +317,8 @@ class PMREMGenerator {
275
317
  /**
276
318
  * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during
277
319
  * your texture's network fetch for increased concurrency.
320
+ *
321
+ * @returns {Promise}
278
322
  */
279
323
  async compileEquirectangularShader() {
280
324
 
@@ -625,7 +669,7 @@ class PMREMGenerator {
625
669
  const blurMesh = this._lodMeshes[ lodOut ];
626
670
  blurMesh.material = blurMaterial;
627
671
 
628
- const blurUniforms = blurMaterial.uniforms;
672
+ const blurUniforms = _uniformsMap.get( blurMaterial );
629
673
 
630
674
  const pixels = this._sizeLods[ lodIn ] - 1;
631
675
  const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );
@@ -829,7 +873,7 @@ function _getBlurShader( lodMax, width, height ) {
829
873
  latitudinal,
830
874
  weights,
831
875
  poleAxis,
832
- outputDirection,
876
+ outputDirection: _outputDirection,
833
877
  dTheta,
834
878
  samples,
835
879
  envMap,
@@ -840,9 +884,10 @@ function _getBlurShader( lodMax, width, height ) {
840
884
  };
841
885
 
842
886
  const material = _getMaterial( 'blur' );
843
- material.uniforms = materialUniforms; // TODO: Move to outside of the material
844
887
  material.fragmentNode = blur( { ...materialUniforms, latitudinal: latitudinal.equal( 1 ) } );
845
888
 
889
+ _uniformsMap.set( material, materialUniforms );
890
+
846
891
  return material;
847
892
 
848
893
  }
@@ -850,7 +895,7 @@ function _getBlurShader( lodMax, width, height ) {
850
895
  function _getCubemapMaterial( envTexture ) {
851
896
 
852
897
  const material = _getMaterial( 'cubemap' );
853
- material.fragmentNode = cubeTexture( envTexture, outputDirection );
898
+ material.fragmentNode = cubeTexture( envTexture, _outputDirection );
854
899
 
855
900
  return material;
856
901
 
@@ -859,7 +904,7 @@ function _getCubemapMaterial( envTexture ) {
859
904
  function _getEquirectMaterial( envTexture ) {
860
905
 
861
906
  const material = _getMaterial( 'equirect' );
862
- material.fragmentNode = texture( envTexture, equirectUV( outputDirection ), 0 );
907
+ material.fragmentNode = texture( envTexture, equirectUV( _outputDirection ), 0 );
863
908
 
864
909
  return material;
865
910
 
@@ -22,10 +22,10 @@ class NodeBuilderState {
22
22
  * @param {Array<Node>} updateNodes - An array of nodes that implement their `update()` method.
23
23
  * @param {Array<Node>} updateBeforeNodes - An array of nodes that implement their `updateBefore()` method.
24
24
  * @param {Array<Node>} updateAfterNodes - An array of nodes that implement their `updateAfter()` method.
25
- * @param {NodeMaterialObserver} monitor - A node material observer.
25
+ * @param {NodeMaterialObserver} observer - A node material observer.
26
26
  * @param {Array<Object>} transforms - An array with transform attribute objects. Only relevant when using compute shaders with WebGL 2.
27
27
  */
28
- constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, monitor, transforms = [] ) {
28
+ constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, observer, transforms = [] ) {
29
29
 
30
30
  /**
31
31
  * The native vertex shader code.
@@ -98,7 +98,7 @@ class NodeBuilderState {
98
98
  *
99
99
  * @type {NodeMaterialObserver}
100
100
  */
101
- this.monitor = monitor;
101
+ this.observer = observer;
102
102
 
103
103
  /**
104
104
  * How often this state is used by render objects.
@@ -122,7 +122,7 @@ class NodeBuilderState {
122
122
 
123
123
  for ( const instanceGroup of this.bindings ) {
124
124
 
125
- const shared = instanceGroup.bindings[ 0 ].groupNode.shared; // TODO: Is it safe to always check the first binding in the group?
125
+ const shared = instanceGroup.bindings[ 0 ].groupNode.shared; // All bindings in the group must have the same groupNode.
126
126
 
127
127
  if ( shared !== true ) {
128
128
 
@@ -23,7 +23,7 @@ class NodeLibrary {
23
23
  /**
24
24
  * A map that maps materials to node materials.
25
25
  *
26
- * @type {WeakMap<String,NodeMaterial.constructor>}
26
+ * @type {Map<String,NodeMaterial.constructor>}
27
27
  */
28
28
  this.materialNodes = new Map();
29
29
 
@@ -31,7 +31,7 @@ class NodeLibrary {
31
31
  * A map that maps tone mapping techniques (constants)
32
32
  * to tone mapping node functions.
33
33
  *
34
- * @type {WeakMap<Number,Function>}
34
+ * @type {Map<Number,Function>}
35
35
  */
36
36
  this.toneMappingNodes = new Map();
37
37
 
@@ -98,7 +98,7 @@ class NodeLibrary {
98
98
  /**
99
99
  * Returns a node material class definition for a material type.
100
100
  *
101
- * @param {Sring} materialType - The material type.
101
+ * @param {String} materialType - The material type.
102
102
  * @return {NodeMaterial.constructor?} The node material class definition. Returns `null` if no node material is found.
103
103
  */
104
104
  getMaterialNodeClass( materialType ) {
@@ -111,7 +111,7 @@ class NodeLibrary {
111
111
  * Adds a node material class definition for a given material type.
112
112
  *
113
113
  * @param {NodeMaterial.constructor} materialNodeClass - The node material class definition.
114
- * @param {Sring} materialClassType - The material type.
114
+ * @param {String} materialClassType - The material type.
115
115
  */
116
116
  addMaterial( materialNodeClass, materialClassType ) {
117
117
 
@@ -147,7 +147,7 @@ class NodeLibrary {
147
147
  * Adds a node class definition for the given type to the provided type library.
148
148
  *
149
149
  * @param {Any} nodeClass - The node class definition.
150
- * @param {String} type - The object type.
150
+ * @param {Number|String} type - The object type.
151
151
  * @param {Map} library - The type library.
152
152
  */
153
153
  addType( nodeClass, type, library ) {
@@ -60,7 +60,6 @@ class NodeSampledTexture extends SampledTexture {
60
60
  /**
61
61
  * Updates the binding.
62
62
  *
63
- * @param {Number} generation - The generation.
64
63
  * @return {Boolean} Whether the texture has been updated and must be
65
64
  * uploaded to the GPU.
66
65
  */
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  NumberUniform, Vector2Uniform, Vector3Uniform, Vector4Uniform,
3
- ColorUniform, Matrix3Uniform, Matrix4Uniform
3
+ ColorUniform, Matrix2Uniform, Matrix3Uniform, Matrix4Uniform
4
4
  } from '../Uniform.js';
5
5
 
6
6
  /**
@@ -258,6 +258,58 @@ class ColorNodeUniform extends ColorUniform {
258
258
 
259
259
  }
260
260
 
261
+
262
+ /**
263
+ * A special form of Matrix2 uniform binding type.
264
+ * It's value is managed by a node object.
265
+ *
266
+ * @private
267
+ * @augments Matrix2Uniform
268
+ */
269
+ class Matrix2NodeUniform extends Matrix2Uniform {
270
+
271
+ /**
272
+ * Constructs a new node-based Matrix2 uniform.
273
+ *
274
+ * @param {NodeUniform} nodeUniform - The node uniform.
275
+ */
276
+ constructor( nodeUniform ) {
277
+
278
+ super( nodeUniform.name, nodeUniform.value );
279
+
280
+ /**
281
+ * The node uniform.
282
+ *
283
+ * @type {NodeUniform}
284
+ */
285
+ this.nodeUniform = nodeUniform;
286
+
287
+ }
288
+
289
+ /**
290
+ * Overwritten to return the value of the node uniform.
291
+ *
292
+ * @return {Matrix2} The value.
293
+ */
294
+ getValue() {
295
+
296
+ return this.nodeUniform.value;
297
+
298
+ }
299
+
300
+ /**
301
+ * Returns the node uniform data type.
302
+ *
303
+ * @return {String} The data type.
304
+ */
305
+ getType() {
306
+
307
+ return this.nodeUniform.type;
308
+
309
+ }
310
+
311
+ }
312
+
261
313
  /**
262
314
  * A special form of Matrix3 uniform binding type.
263
315
  * It's value is managed by a node object.
@@ -362,5 +414,5 @@ class Matrix4NodeUniform extends Matrix4Uniform {
362
414
 
363
415
  export {
364
416
  NumberNodeUniform, Vector2NodeUniform, Vector3NodeUniform, Vector4NodeUniform,
365
- ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
417
+ ColorNodeUniform, Matrix2NodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
366
418
  };
@@ -9,6 +9,8 @@ import { CubeUVReflectionMapping, EquirectangularReflectionMapping, Equirectangu
9
9
  import { hashArray } from '../../../nodes/core/NodeUtils.js';
10
10
 
11
11
  const _outputNodeMap = new WeakMap();
12
+ const _chainKeys = [];
13
+ const _cacheKeyValues = [];
12
14
 
13
15
  /**
14
16
  * This renderer module manages node-related objects and is the
@@ -136,10 +138,13 @@ class Nodes extends DataMap {
136
138
 
137
139
  // other groups are updated just when groupNode.needsUpdate is true
138
140
 
139
- const groupChain = [ groupNode, nodeUniformsGroup ];
141
+ _chainKeys[ 0 ] = groupNode;
142
+ _chainKeys[ 1 ] = nodeUniformsGroup;
140
143
 
141
- let groupData = this.groupsData.get( groupChain );
142
- if ( groupData === undefined ) this.groupsData.set( groupChain, groupData = {} );
144
+ let groupData = this.groupsData.get( _chainKeys );
145
+ if ( groupData === undefined ) this.groupsData.set( _chainKeys, groupData = {} );
146
+
147
+ _chainKeys.length = 0;
143
148
 
144
149
  if ( groupData.version !== groupNode.version ) {
145
150
 
@@ -284,7 +289,7 @@ class Nodes extends DataMap {
284
289
  nodeBuilder.updateNodes,
285
290
  nodeBuilder.updateBeforeNodes,
286
291
  nodeBuilder.updateAfterNodes,
287
- nodeBuilder.monitor,
292
+ nodeBuilder.observer,
288
293
  nodeBuilder.transforms
289
294
  );
290
295
 
@@ -382,33 +387,35 @@ class Nodes extends DataMap {
382
387
  */
383
388
  getCacheKey( scene, lightsNode ) {
384
389
 
385
- const chain = [ scene, lightsNode ];
390
+ _chainKeys[ 0 ] = scene;
391
+ _chainKeys[ 1 ] = lightsNode;
392
+
386
393
  const callId = this.renderer.info.calls;
387
394
 
388
- let cacheKeyData = this.callHashCache.get( chain );
395
+ const cacheKeyData = this.callHashCache.get( _chainKeys ) || {};
389
396
 
390
- if ( cacheKeyData === undefined || cacheKeyData.callId !== callId ) {
397
+ if ( cacheKeyData.callId !== callId ) {
391
398
 
392
399
  const environmentNode = this.getEnvironmentNode( scene );
393
400
  const fogNode = this.getFogNode( scene );
394
401
 
395
- const values = [];
402
+ if ( lightsNode ) _cacheKeyValues.push( lightsNode.getCacheKey( true ) );
403
+ if ( environmentNode ) _cacheKeyValues.push( environmentNode.getCacheKey() );
404
+ if ( fogNode ) _cacheKeyValues.push( fogNode.getCacheKey() );
396
405
 
397
- if ( lightsNode ) values.push( lightsNode.getCacheKey( true ) );
398
- if ( environmentNode ) values.push( environmentNode.getCacheKey() );
399
- if ( fogNode ) values.push( fogNode.getCacheKey() );
406
+ _cacheKeyValues.push( this.renderer.shadowMap.enabled ? 1 : 0 );
400
407
 
401
- values.push( this.renderer.shadowMap.enabled ? 1 : 0 );
408
+ cacheKeyData.callId = callId;
409
+ cacheKeyData.cacheKey = hashArray( _cacheKeyValues );
402
410
 
403
- cacheKeyData = {
404
- callId,
405
- cacheKey: hashArray( values )
406
- };
411
+ this.callHashCache.set( _chainKeys, cacheKeyData );
407
412
 
408
- this.callHashCache.set( chain, cacheKeyData );
413
+ _cacheKeyValues.length = 0;
409
414
 
410
415
  }
411
416
 
417
+ _chainKeys.length = 0;
418
+
412
419
  return cacheKeyData.cacheKey;
413
420
 
414
421
  }
@@ -784,7 +791,7 @@ class Nodes extends DataMap {
784
791
  }
785
792
 
786
793
  /**
787
- * Frees the intenral resources.
794
+ * Frees the internal resources.
788
795
  */
789
796
  dispose() {
790
797
 
@@ -249,6 +249,8 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
249
249
  boxMesh.geometry.dispose();
250
250
  boxMesh.material.dispose();
251
251
 
252
+ boxMesh = undefined;
253
+
252
254
  }
253
255
 
254
256
  if ( planeMesh !== undefined ) {
@@ -256,6 +258,8 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
256
258
  planeMesh.geometry.dispose();
257
259
  planeMesh.material.dispose();
258
260
 
261
+ planeMesh = undefined;
262
+
259
263
  }
260
264
 
261
265
  }