super-three 0.161.0 → 0.162.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 (131) hide show
  1. package/build/three.cjs +490 -393
  2. package/build/three.module.js +490 -391
  3. package/build/three.module.min.js +1 -1
  4. package/examples/jsm/controls/DragControls.js +91 -30
  5. package/examples/jsm/controls/OrbitControls.js +32 -6
  6. package/examples/jsm/controls/TransformControls.js +6 -6
  7. package/examples/jsm/exporters/GLTFExporter.js +11 -1
  8. package/examples/jsm/interactive/InteractiveGroup.js +15 -25
  9. package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
  10. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
  11. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  12. package/examples/jsm/libs/tween.module.js +32 -14
  13. package/examples/jsm/loaders/3DMLoader.js +13 -21
  14. package/examples/jsm/loaders/VOXLoader.js +9 -2
  15. package/examples/jsm/loaders/VRMLLoader.js +6 -2
  16. package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
  17. package/examples/jsm/nodes/Nodes.js +9 -7
  18. package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
  19. package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
  20. package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
  21. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
  22. package/examples/jsm/nodes/accessors/MorphNode.js +8 -8
  23. package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
  24. package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
  25. package/examples/jsm/nodes/accessors/StorageBufferNode.js +18 -0
  26. package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
  27. package/examples/jsm/nodes/accessors/TextureNode.js +1 -1
  28. package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
  29. package/examples/jsm/nodes/code/CodeNode.js +6 -0
  30. package/examples/jsm/nodes/core/AssignNode.js +68 -12
  31. package/examples/jsm/nodes/core/Node.js +14 -4
  32. package/examples/jsm/nodes/core/NodeBuilder.js +3 -9
  33. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  34. package/examples/jsm/nodes/core/TempNode.js +1 -1
  35. package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
  36. package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
  37. package/examples/jsm/nodes/materials/NodeMaterial.js +37 -6
  38. package/examples/jsm/nodes/math/CondNode.js +42 -7
  39. package/examples/jsm/nodes/math/MathNode.js +20 -0
  40. package/examples/jsm/nodes/utils/ArrayElementNode.js +0 -6
  41. package/examples/jsm/nodes/utils/LoopNode.js +2 -0
  42. package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
  43. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  44. package/examples/jsm/renderers/common/Background.js +2 -2
  45. package/examples/jsm/renderers/common/ClippingContext.js +165 -0
  46. package/examples/jsm/renderers/common/RenderContext.js +2 -0
  47. package/examples/jsm/renderers/common/RenderContexts.js +2 -13
  48. package/examples/jsm/renderers/common/RenderObject.js +44 -1
  49. package/examples/jsm/renderers/common/RenderObjects.js +3 -1
  50. package/examples/jsm/renderers/common/Renderer.js +94 -37
  51. package/examples/jsm/renderers/common/StorageBufferAttribute.js +2 -2
  52. package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
  53. package/examples/jsm/renderers/common/Textures.js +3 -13
  54. package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
  55. package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
  56. package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
  57. package/examples/jsm/renderers/common/nodes/Nodes.js +1 -0
  58. package/examples/jsm/renderers/webgl/WebGLBackend.js +26 -6
  59. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +135 -10
  60. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +7 -1
  61. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +47 -0
  62. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +1 -0
  63. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +13 -12
  64. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +15 -40
  65. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +7 -1
  66. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +2 -2
  67. package/examples/jsm/shaders/OutputShader.js +4 -0
  68. package/examples/jsm/utils/SkeletonUtils.js +14 -3
  69. package/examples/jsm/webxr/VRButton.js +13 -5
  70. package/examples/jsm/webxr/XRButton.js +0 -1
  71. package/examples/jsm/webxr/XRControllerModelFactory.js +8 -0
  72. package/package.json +4 -3
  73. package/src/Three.Legacy.js +20 -0
  74. package/src/Three.js +0 -1
  75. package/src/constants.js +2 -5
  76. package/src/core/BufferAttribute.js +0 -11
  77. package/src/core/BufferGeometry.js +23 -29
  78. package/src/core/Object3D.js +11 -0
  79. package/src/core/Raycaster.js +18 -4
  80. package/src/core/RenderTarget.js +44 -21
  81. package/src/extras/PMREMGenerator.js +2 -0
  82. package/src/extras/curves/EllipseCurve.js +2 -2
  83. package/src/helpers/SpotLightHelper.js +18 -1
  84. package/src/loaders/DataTextureLoader.js +0 -4
  85. package/src/loaders/MaterialLoader.js +1 -0
  86. package/src/loaders/ObjectLoader.js +2 -1
  87. package/src/materials/Material.js +2 -1
  88. package/src/materials/MeshBasicMaterial.js +3 -0
  89. package/src/materials/MeshLambertMaterial.js +3 -0
  90. package/src/materials/MeshPhongMaterial.js +3 -0
  91. package/src/materials/MeshStandardMaterial.js +3 -0
  92. package/src/math/Quaternion.js +13 -12
  93. package/src/math/Vector3.js +7 -7
  94. package/src/objects/InstancedMesh.js +53 -0
  95. package/src/objects/Mesh.js +0 -1
  96. package/src/renderers/WebGLCubeRenderTarget.js +1 -10
  97. package/src/renderers/WebGLRenderer.js +15 -22
  98. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
  99. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  100. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  101. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
  102. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  103. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
  104. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +23 -0
  105. package/src/renderers/shaders/ShaderChunk.js +2 -0
  106. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
  107. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  108. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  109. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
  110. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +1 -0
  111. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
  112. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +1 -0
  113. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -0
  114. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
  115. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
  116. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
  117. package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
  118. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
  119. package/src/renderers/shaders/ShaderLib.js +2 -1
  120. package/src/renderers/shaders/UniformsLib.js +1 -0
  121. package/src/renderers/webgl/WebGLBackground.js +18 -0
  122. package/src/renderers/webgl/WebGLMaterials.js +24 -1
  123. package/src/renderers/webgl/WebGLMorphtargets.js +15 -8
  124. package/src/renderers/webgl/WebGLProgram.js +12 -1
  125. package/src/renderers/webgl/WebGLPrograms.js +19 -16
  126. package/src/renderers/webgl/WebGLState.js +11 -21
  127. package/src/renderers/webgl/WebGLTextures.js +80 -50
  128. package/src/scenes/Scene.js +8 -0
  129. package/src/textures/Texture.js +1 -29
  130. package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
  131. package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
@@ -2,49 +2,63 @@ import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
3
  import { uniform } from '../core/UniformNode.js';
4
4
  import { texture } from './TextureNode.js';
5
+ import { buffer } from './BufferNode.js';
5
6
  import { nodeObject } from '../shadernode/ShaderNode.js';
7
+ import { uniforms } from './UniformsNode.js';
8
+ import ArrayElementNode from '../utils/ArrayElementNode.js';
6
9
 
7
- class ReferenceNode extends Node {
10
+ class ReferenceElementNode extends ArrayElementNode {
8
11
 
9
- constructor( property, uniformType, object = null ) {
12
+ constructor( referenceNode, indexNode ) {
10
13
 
11
- super();
14
+ super( referenceNode, indexNode );
12
15
 
13
- this.property = property;
14
- this.index = null;
16
+ this.referenceNode = referenceNode;
15
17
 
16
- this.uniformType = uniformType;
17
-
18
- this.object = object;
19
- this.reference = null;
18
+ this.isReferenceElementNode = true;
20
19
 
21
- this.node = null;
20
+ }
22
21
 
23
- this.updateType = NodeUpdateType.OBJECT;
22
+ getNodeType() {
24
23
 
25
- this.setNodeType( uniformType );
24
+ return this.referenceNode.uniformType;
26
25
 
27
26
  }
28
27
 
29
- updateReference( frame ) {
28
+ generate( builder ) {
30
29
 
31
- this.reference = this.object !== null ? this.object : frame.object;
30
+ const snippet = super.generate( builder );
31
+ const arrayType = this.referenceNode.getNodeType();
32
+ const elementType = this.getNodeType();
32
33
 
33
- return this.reference;
34
+ return builder.format( snippet, arrayType, elementType );
34
35
 
35
36
  }
36
37
 
37
- setIndex( index ) {
38
+ }
38
39
 
39
- this.index = index;
40
+ class ReferenceNode extends Node {
40
41
 
41
- return this;
42
+ constructor( property, uniformType, object = null, count = null ) {
43
+
44
+ super();
45
+
46
+ this.property = property;
47
+ this.uniformType = uniformType;
48
+ this.object = object;
49
+ this.count = count;
50
+
51
+ this.properties = property.split( '.' );
52
+ this.reference = null;
53
+ this.node = null;
54
+
55
+ this.updateType = NodeUpdateType.OBJECT;
42
56
 
43
57
  }
44
58
 
45
- getIndex() {
59
+ element( indexNode ) {
46
60
 
47
- return this.index;
61
+ return nodeObject( new ReferenceElementNode( this, nodeObject( indexNode ) ) );
48
62
 
49
63
  }
50
64
 
@@ -52,13 +66,21 @@ class ReferenceNode extends Node {
52
66
 
53
67
  let node = null;
54
68
 
55
- if ( uniformType === 'texture' ) {
69
+ if ( this.count !== null ) {
70
+
71
+ node = buffer( null, uniformType, this.count );
72
+
73
+ } else if ( Array.isArray( this.getValueFromReference() ) ) {
74
+
75
+ node = uniforms( null, uniformType );
76
+
77
+ } else if ( uniformType === 'texture' ) {
56
78
 
57
79
  node = texture( null );
58
80
 
59
81
  } else {
60
82
 
61
- node = uniform( uniformType );
83
+ node = uniform( null, uniformType );
62
84
 
63
85
  }
64
86
 
@@ -72,31 +94,67 @@ class ReferenceNode extends Node {
72
94
 
73
95
  }
74
96
 
75
- update( /*frame*/ ) {
97
+ getValueFromReference( object = this.reference ) {
76
98
 
77
- let value = this.reference[ this.property ];
99
+ const { properties } = this;
78
100
 
79
- if ( this.index !== null ) {
101
+ let value = object[ properties[ 0 ] ];
80
102
 
81
- value = value[ this.index ];
103
+ for ( let i = 1; i < properties.length; i ++ ) {
104
+
105
+ value = value[ properties[ i ] ];
82
106
 
83
107
  }
84
108
 
85
- this.node.value = value;
109
+ return value;
110
+
111
+ }
112
+
113
+ setReference( state ) {
114
+
115
+ this.reference = this.object !== null ? this.object : state.object;
116
+
117
+ return this.reference;
86
118
 
87
119
  }
88
120
 
89
- setup( /*builder*/ ) {
121
+ setup() {
122
+
123
+ this.updateValue();
90
124
 
91
125
  return this.node;
92
126
 
93
127
  }
94
128
 
129
+ update( /*frame*/ ) {
130
+
131
+ this.updateValue();
132
+
133
+ }
134
+
135
+ updateValue() {
136
+
137
+ if ( this.node === null ) this.setNodeType( this.uniformType );
138
+
139
+ const value = this.getValueFromReference();
140
+
141
+ if ( Array.isArray( value ) ) {
142
+
143
+ this.node.array = value;
144
+
145
+ } else {
146
+
147
+ this.node.value = value;
148
+
149
+ }
150
+
151
+ }
152
+
95
153
  }
96
154
 
97
155
  export default ReferenceNode;
98
156
 
99
157
  export const reference = ( name, type, object ) => nodeObject( new ReferenceNode( name, type, object ) );
100
- export const referenceIndex = ( name, index, type, object ) => nodeObject( new ReferenceNode( name, type, object ).setIndex( index ) );
158
+ export const referenceBuffer = ( name, type, count, object ) => nodeObject( new ReferenceNode( name, type, object, count ) );
101
159
 
102
160
  addNodeClass( 'ReferenceNode', ReferenceNode );
@@ -1,21 +1,23 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
- import { nodeProxy } from '../shadernode/ShaderNode.js';
3
+ import { nodeObject } from '../shadernode/ShaderNode.js';
4
4
  import { attribute } from '../core/AttributeNode.js';
5
- import { uniform } from '../core/UniformNode.js';
5
+ import { reference, referenceBuffer } from './ReferenceNode.js';
6
6
  import { add } from '../math/OperatorNode.js';
7
- import { buffer } from './BufferNode.js';
8
7
  import { normalLocal } from './NormalNode.js';
9
8
  import { positionLocal } from './PositionNode.js';
10
9
  import { tangentLocal } from './TangentNode.js';
10
+ import { uniform } from '../core/UniformNode.js';
11
+ import { buffer } from './BufferNode.js';
11
12
 
12
13
  class SkinningNode extends Node {
13
14
 
14
- constructor( skinnedMesh ) {
15
+ constructor( skinnedMesh, useReference = false ) {
15
16
 
16
17
  super( 'void' );
17
18
 
18
19
  this.skinnedMesh = skinnedMesh;
20
+ this.useReference = useReference;
19
21
 
20
22
  this.updateType = NodeUpdateType.OBJECT;
21
23
 
@@ -24,9 +26,25 @@ class SkinningNode extends Node {
24
26
  this.skinIndexNode = attribute( 'skinIndex', 'uvec4' );
25
27
  this.skinWeightNode = attribute( 'skinWeight', 'vec4' );
26
28
 
27
- this.bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' );
28
- this.bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' );
29
- this.boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length );
29
+ let bindMatrixNode, bindMatrixInverseNode, boneMatricesNode;
30
+
31
+ if ( useReference ) {
32
+
33
+ bindMatrixNode = reference( 'bindMatrix', 'mat4' );
34
+ bindMatrixInverseNode = reference( 'bindMatrixInverse', 'mat4' );
35
+ boneMatricesNode = referenceBuffer( 'skeleton.boneMatrices', 'mat4', skinnedMesh.skeleton.bones.length );
36
+
37
+ } else {
38
+
39
+ bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' );
40
+ bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' );
41
+ boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length );
42
+
43
+ }
44
+
45
+ this.bindMatrixNode = bindMatrixNode;
46
+ this.bindMatrixInverseNode = bindMatrixInverseNode;
47
+ this.boneMatricesNode = boneMatricesNode;
30
48
 
31
49
  }
32
50
 
@@ -88,9 +106,11 @@ class SkinningNode extends Node {
88
106
 
89
107
  }
90
108
 
91
- update() {
109
+ update( frame ) {
110
+
111
+ const object = this.useReference ? frame.object : this.skinnedMesh;
92
112
 
93
- this.skinnedMesh.skeleton.update();
113
+ object.skeleton.update();
94
114
 
95
115
  }
96
116
 
@@ -98,6 +118,7 @@ class SkinningNode extends Node {
98
118
 
99
119
  export default SkinningNode;
100
120
 
101
- export const skinning = nodeProxy( SkinningNode );
121
+ export const skinning = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh ) );
122
+ export const skinningReference = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh, true ) );
102
123
 
103
124
  addNodeClass( 'SkinningNode', SkinningNode );
@@ -3,6 +3,7 @@ import { bufferAttribute } from './BufferAttributeNode.js';
3
3
  import { addNodeClass } from '../core/Node.js';
4
4
  import { nodeObject } from '../shadernode/ShaderNode.js';
5
5
  import { varying } from '../core/VaryingNode.js';
6
+ import { storageElement } from '../utils/StorageArrayElementNode.js';
6
7
 
7
8
  class StorageBufferNode extends BufferNode {
8
9
 
@@ -12,6 +13,8 @@ class StorageBufferNode extends BufferNode {
12
13
 
13
14
  this.isStorageBufferNode = true;
14
15
 
16
+ this.bufferObject = false;
17
+
15
18
  this._attribute = null;
16
19
  this._varying = null;
17
20
 
@@ -23,6 +26,20 @@ class StorageBufferNode extends BufferNode {
23
26
 
24
27
  }
25
28
 
29
+ element( indexNode ) {
30
+
31
+ return storageElement( this, indexNode );
32
+
33
+ }
34
+
35
+ setBufferObject( value ) {
36
+
37
+ this.bufferObject = value;
38
+
39
+ return this;
40
+
41
+ }
42
+
26
43
  generate( builder ) {
27
44
 
28
45
  if ( builder.isAvailable( 'storageBuffer' ) ) return super.generate( builder );
@@ -50,5 +67,6 @@ class StorageBufferNode extends BufferNode {
50
67
  export default StorageBufferNode;
51
68
 
52
69
  export const storage = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ) );
70
+ export const storageObject = ( value, type, count ) => nodeObject( new StorageBufferNode( value, type, count ).setBufferObject( true ) );
53
71
 
54
72
  addNodeClass( 'StorageBufferNode', StorageBufferNode );
@@ -5,7 +5,7 @@ import { varying } from '../core/VaryingNode.js';
5
5
  import { normalize } from '../math/MathNode.js';
6
6
  import { cameraViewMatrix } from './CameraNode.js';
7
7
  import { modelViewMatrix } from './ModelNode.js';
8
- import { nodeImmutable } from '../shadernode/ShaderNode.js';
8
+ import { nodeImmutable, vec4 } from '../shadernode/ShaderNode.js';
9
9
 
10
10
  class TangentNode extends Node {
11
11
 
@@ -48,13 +48,19 @@ class TangentNode extends Node {
48
48
 
49
49
  outputNode = attribute( 'tangent', 'vec4' );
50
50
 
51
+ if ( builder.geometry.hasAttribute( 'tangent' ) === false ) {
52
+
53
+ builder.geometry.computeTangents();
54
+
55
+ }
56
+
51
57
  } else if ( scope === TangentNode.LOCAL ) {
52
58
 
53
59
  outputNode = varying( tangentGeometry.xyz );
54
60
 
55
61
  } else if ( scope === TangentNode.VIEW ) {
56
62
 
57
- const vertexNode = modelViewMatrix.mul( tangentLocal ).xyz;
63
+ const vertexNode = modelViewMatrix.mul( vec4( tangentLocal, 0 ) ).xyz;
58
64
  outputNode = normalize( varying( vertexNode ) );
59
65
 
60
66
  } else if ( scope === TangentNode.WORLD ) {
@@ -55,7 +55,7 @@ class TextureNode extends UniformNode {
55
55
 
56
56
  }
57
57
 
58
- updateReference( /*frame*/ ) {
58
+ setReference( /*state*/ ) {
59
59
 
60
60
  return this.value;
61
61
 
@@ -0,0 +1,140 @@
1
+ import { addNodeClass } from '../core/Node.js';
2
+ import { nodeObject } from '../shadernode/ShaderNode.js';
3
+ import { NodeUpdateType } from '../core/constants.js';
4
+ import { getValueType } from '../core/NodeUtils.js';
5
+ import ArrayElementNode from '../utils/ArrayElementNode.js';
6
+ import BufferNode from './BufferNode.js';
7
+
8
+ class UniformsElementNode extends ArrayElementNode {
9
+
10
+ constructor( arrayBuffer, indexNode ) {
11
+
12
+ super( arrayBuffer, indexNode );
13
+
14
+ this.isArrayBufferElementNode = true;
15
+
16
+ }
17
+
18
+ getNodeType( builder ) {
19
+
20
+ return this.node.getElementType( builder );
21
+
22
+ }
23
+
24
+ generate( builder ) {
25
+
26
+ const snippet = super.generate( builder );
27
+ const type = this.getNodeType();
28
+
29
+ return builder.format( snippet, 'vec4', type );
30
+
31
+ }
32
+
33
+ }
34
+
35
+ class UniformsNode extends BufferNode {
36
+
37
+ constructor( value, elementType = null ) {
38
+
39
+ super( null, 'vec4' );
40
+
41
+ this.array = value;
42
+ this.elementType = elementType;
43
+
44
+ this._elementType = null;
45
+ this._elementLength = 0;
46
+
47
+ this.updateType = NodeUpdateType.RENDER;
48
+
49
+ this.isArrayBufferNode = true;
50
+
51
+ }
52
+
53
+ getElementType() {
54
+
55
+ return this.elementType || this._elementType;
56
+
57
+ }
58
+
59
+ getElementLength() {
60
+
61
+ return this._elementLength;
62
+
63
+ }
64
+
65
+ update( /*frame*/ ) {
66
+
67
+ const { array, value } = this;
68
+
69
+ const elementLength = this.getElementLength();
70
+ const elementType = this.getElementType();
71
+
72
+ if ( elementLength === 1 ) {
73
+
74
+ for ( let i = 0; i < array.length; i ++ ) {
75
+
76
+ const index = i * 4;
77
+
78
+ value[ index ] = array[ i ];
79
+
80
+ }
81
+
82
+ } else if ( elementType === 'color' ) {
83
+
84
+ for ( let i = 0; i < array.length; i ++ ) {
85
+
86
+ const index = i * 4;
87
+ const vector = array[ i ];
88
+
89
+ value[ index ] = vector.r;
90
+ value[ index + 1 ] = vector.g;
91
+ value[ index + 2 ] = vector.b || 0;
92
+ //value[ index + 3 ] = vector.a || 0;
93
+
94
+ }
95
+
96
+ } else {
97
+
98
+ for ( let i = 0; i < array.length; i ++ ) {
99
+
100
+ const index = i * 4;
101
+ const vector = array[ i ];
102
+
103
+ value[ index ] = vector.x;
104
+ value[ index + 1 ] = vector.y;
105
+ value[ index + 2 ] = vector.z || 0;
106
+ value[ index + 3 ] = vector.w || 0;
107
+
108
+ }
109
+
110
+ }
111
+
112
+ }
113
+
114
+ setup( builder ) {
115
+
116
+ const length = this.array.length;
117
+
118
+ this._elementType = this.elementType === null ? getValueType( this.array[ 0 ] ) : this.elementType;
119
+ this._elementLength = builder.getTypeLength( this._elementType );
120
+
121
+ this.value = new Float32Array( length * 4 );
122
+ this.bufferCount = length;
123
+
124
+ return super.setup( builder );
125
+
126
+ }
127
+
128
+ element( indexNode ) {
129
+
130
+ return nodeObject( new UniformsElementNode( this, nodeObject( indexNode ) ) );
131
+
132
+ }
133
+
134
+ }
135
+
136
+ export default UniformsNode;
137
+
138
+ export const uniforms = ( values, nodeType ) => nodeObject( new UniformsNode( values, nodeType ) );
139
+
140
+ addNodeClass( 'UniformsNode', UniformsNode );
@@ -16,6 +16,12 @@ class CodeNode extends Node {
16
16
 
17
17
  }
18
18
 
19
+ isGlobal() {
20
+
21
+ return true;
22
+
23
+ }
24
+
19
25
  setIncludes( includes ) {
20
26
 
21
27
  this.includes = includes;
@@ -1,6 +1,7 @@
1
1
  import { addNodeClass } from '../core/Node.js';
2
2
  import TempNode from '../core/TempNode.js';
3
3
  import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
4
+ import { vectorComponents } from '../core/constants.js';
4
5
 
5
6
  class AssignNode extends TempNode {
6
7
 
@@ -25,40 +26,95 @@ class AssignNode extends TempNode {
25
26
 
26
27
  }
27
28
 
29
+ needsSplitAssign( builder ) {
30
+
31
+ const { targetNode } = this;
32
+
33
+ if ( builder.isAvailable( 'swizzleAssign' ) === false && targetNode.isSplitNode && targetNode.components.length > 1 ) {
34
+
35
+ const targetLength = builder.getTypeLength( targetNode.node.getNodeType( builder ) );
36
+ const assignDiferentVector = vectorComponents.join( '' ).slice( 0, targetLength ) !== targetNode.components;
37
+
38
+ return assignDiferentVector;
39
+
40
+ }
41
+
42
+ return false;
43
+
44
+ }
45
+
28
46
  generate( builder, output ) {
29
47
 
30
- const targetNode = this.targetNode;
31
- const sourceNode = this.sourceNode;
48
+ const { targetNode, sourceNode } = this;
49
+
50
+ const needsSplitAssign = this.needsSplitAssign( builder );
32
51
 
33
52
  const targetType = targetNode.getNodeType( builder );
34
53
 
35
- const target = targetNode.build( builder );
54
+ const target = targetNode.context( { assign: true } ).build( builder );
36
55
  const source = sourceNode.build( builder, targetType );
37
56
 
38
- const snippet = `${ target } = ${ source }`;
57
+ const sourceType = sourceNode.getNodeType( builder );
58
+
59
+ const nodeData = builder.getDataFromNode( this );
60
+
61
+ //
39
62
 
40
- if ( output === 'void' ) {
63
+ let snippet;
41
64
 
42
- builder.addLineFlowCode( snippet );
65
+ if ( nodeData.initialized === true ) {
66
+
67
+ if ( output !== 'void' ) {
68
+
69
+ snippet = target;
70
+
71
+ }
43
72
 
44
- return;
73
+ } else if ( needsSplitAssign ) {
74
+
75
+ const sourceVar = builder.getVarFromNode( this, null, targetType );
76
+ const sourceProperty = builder.getPropertyName( sourceVar );
77
+
78
+ builder.addLineFlowCode( `${ sourceProperty } = ${ source }` );
79
+
80
+ const targetRoot = targetNode.node.context( { assign: true } ).build( builder );
81
+
82
+ for ( let i = 0; i < targetNode.components.length; i ++ ) {
83
+
84
+ const component = targetNode.components[ i ];
85
+
86
+ builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]` );
87
+
88
+ }
89
+
90
+ if ( output !== 'void' ) {
91
+
92
+ snippet = target;
93
+
94
+ }
45
95
 
46
96
  } else {
47
97
 
48
- const sourceType = sourceNode.getNodeType( builder );
98
+ snippet = `${ target } = ${ source }`;
49
99
 
50
- if ( sourceType === 'void' ) {
100
+ if ( output === 'void' || sourceType === 'void' ) {
51
101
 
52
102
  builder.addLineFlowCode( snippet );
53
103
 
54
- return target;
104
+ if ( output !== 'void' ) {
55
105
 
56
- }
106
+ snippet = target;
57
107
 
58
- return builder.format( snippet, targetType, output );
108
+ }
109
+
110
+ }
59
111
 
60
112
  }
61
113
 
114
+ nodeData.initialized = true;
115
+
116
+ return builder.format( snippet, targetType, output );
117
+
62
118
  }
63
119
 
64
120
  }
@@ -40,7 +40,7 @@ class Node extends EventDispatcher {
40
40
 
41
41
  }
42
42
 
43
- updateReference() {
43
+ setReference( /*state*/ ) {
44
44
 
45
45
  return this;
46
46
 
@@ -150,12 +150,20 @@ class Node extends EventDispatcher {
150
150
 
151
151
  }
152
152
 
153
- analyze( builder ) {
153
+ increaseUsage( builder ) {
154
154
 
155
155
  const nodeData = builder.getDataFromNode( this );
156
- nodeData.dependenciesCount = nodeData.dependenciesCount === undefined ? 1 : nodeData.dependenciesCount + 1;
156
+ nodeData.usageCount = nodeData.usageCount === undefined ? 1 : nodeData.usageCount + 1;
157
+
158
+ return nodeData.usageCount;
159
+
160
+ }
157
161
 
158
- if ( nodeData.dependenciesCount === 1 ) {
162
+ analyze( builder ) {
163
+
164
+ const usageCount = this.increaseUsage( builder );
165
+
166
+ if ( usageCount === 1 ) {
159
167
 
160
168
  // node flow children
161
169
 
@@ -223,6 +231,8 @@ class Node extends EventDispatcher {
223
231
 
224
232
  if ( buildStage === 'setup' ) {
225
233
 
234
+ this.setReference( builder );
235
+
226
236
  const properties = builder.getNodeProperties( this );
227
237
 
228
238
  if ( properties.initialized !== true || builder.context.tempRead === false ) {
@@ -15,7 +15,7 @@ import {
15
15
  ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
16
16
  } from '../../renderers/common/nodes/NodeUniform.js';
17
17
 
18
- import { REVISION, RenderTarget, NoColorSpace, LinearEncoding, sRGBEncoding, SRGBColorSpace, Color, Vector2, Vector3, Vector4, Float16BufferAttribute } from 'three';
18
+ import { REVISION, RenderTarget, NoColorSpace, Color, Vector2, Vector3, Vector4, Float16BufferAttribute } from 'three';
19
19
 
20
20
  import { stack } from './StackNode.js';
21
21
  import { getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
@@ -72,6 +72,8 @@ class NodeBuilder {
72
72
  this.fogNode = null;
73
73
  this.toneMappingNode = null;
74
74
 
75
+ this.clippingContext = null;
76
+
75
77
  this.vertexShader = null;
76
78
  this.fragmentShader = null;
77
79
  this.computeShader = null;
@@ -472,14 +474,6 @@ class NodeBuilder {
472
474
 
473
475
  }
474
476
 
475
- /** @deprecated, r152 */
476
- getTextureEncodingFromMap( map ) {
477
-
478
- console.warn( 'THREE.NodeBuilder: Method .getTextureEncodingFromMap replaced by .getTextureColorSpaceFromMap in r152+.' );
479
- return this.getTextureColorSpaceFromMap( map ) === SRGBColorSpace ? sRGBEncoding : LinearEncoding;
480
-
481
- }
482
-
483
477
  getTextureColorSpaceFromMap( map ) {
484
478
 
485
479
  let colorSpace;