super-three 0.156.0 → 0.157.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 (220) hide show
  1. package/build/three.cjs +279 -224
  2. package/build/three.js +279 -224
  3. package/build/three.min.js +2 -2
  4. package/build/three.module.js +276 -223
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/capabilities/WebGL.js +17 -0
  7. package/examples/jsm/controls/DragControls.js +3 -2
  8. package/examples/jsm/csm/CSMShader.js +25 -21
  9. package/examples/jsm/exporters/EXRExporter.js +102 -24
  10. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  11. package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
  12. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  14. package/examples/jsm/lights/LightProbeGenerator.js +37 -3
  15. package/examples/jsm/lines/LineMaterial.js +90 -156
  16. package/examples/jsm/loaders/3DMLoader.js +378 -104
  17. package/examples/jsm/loaders/GLTFLoader.js +1 -1
  18. package/examples/jsm/loaders/LDrawLoader.js +22 -16
  19. package/examples/jsm/loaders/RGBELoader.js +1 -1
  20. package/examples/jsm/loaders/USDZLoader.js +215 -12
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
  22. package/examples/jsm/nodes/Nodes.js +5 -1
  23. package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
  24. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +2 -2
  25. package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
  26. package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +2 -2
  28. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +6 -5
  29. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
  30. package/examples/jsm/nodes/accessors/LineMaterialNode.js +7 -9
  31. package/examples/jsm/nodes/accessors/MaterialNode.js +34 -46
  32. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +9 -9
  33. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
  35. package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
  36. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  38. package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
  39. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  40. package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
  41. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
  42. package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
  43. package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
  44. package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
  45. package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
  46. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
  47. package/examples/jsm/nodes/accessors/TextureNode.js +12 -6
  48. package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
  49. package/examples/jsm/nodes/accessors/TextureStoreNode.js +1 -1
  50. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  51. package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
  52. package/examples/jsm/nodes/code/CodeNode.js +1 -1
  53. package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
  54. package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
  55. package/examples/jsm/nodes/code/FunctionNode.js +18 -7
  56. package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
  57. package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
  58. package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
  59. package/examples/jsm/nodes/core/AttributeNode.js +1 -1
  60. package/examples/jsm/nodes/core/BypassNode.js +1 -1
  61. package/examples/jsm/nodes/core/CacheNode.js +1 -1
  62. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  63. package/examples/jsm/nodes/core/ContextNode.js +2 -2
  64. package/examples/jsm/nodes/core/IndexNode.js +1 -1
  65. package/examples/jsm/nodes/core/InputNode.js +1 -1
  66. package/examples/jsm/nodes/core/Node.js +28 -13
  67. package/examples/jsm/nodes/core/NodeBuilder.js +3 -17
  68. package/examples/jsm/nodes/core/NodeFrame.js +37 -14
  69. package/examples/jsm/nodes/core/OutputStructNode.js +8 -4
  70. package/examples/jsm/nodes/core/PropertyNode.js +3 -3
  71. package/examples/jsm/nodes/core/StackNode.js +1 -1
  72. package/examples/jsm/nodes/core/StructTypeNode.js +1 -1
  73. package/examples/jsm/nodes/core/TempNode.js +1 -1
  74. package/examples/jsm/nodes/core/UniformNode.js +3 -1
  75. package/examples/jsm/nodes/core/VarNode.js +1 -1
  76. package/examples/jsm/nodes/core/VaryingNode.js +1 -1
  77. package/examples/jsm/nodes/core/constants.js +1 -1
  78. package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
  79. package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
  80. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
  81. package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
  82. package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
  83. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  84. package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
  85. package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
  86. package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
  87. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
  88. package/examples/jsm/nodes/display/ViewportNode.js +2 -2
  89. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
  90. package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
  91. package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
  92. package/examples/jsm/nodes/fog/FogNode.js +2 -2
  93. package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
  94. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  95. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  96. package/examples/jsm/nodes/lighting/AONode.js +2 -2
  97. package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
  98. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
  99. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
  100. package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
  101. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
  102. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
  103. package/examples/jsm/nodes/lighting/LightNode.js +2 -2
  104. package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
  105. package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
  106. package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
  107. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  108. package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
  109. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
  110. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
  111. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +2 -2
  112. package/examples/jsm/nodes/materials/Materials.js +1 -0
  113. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
  114. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
  115. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  116. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  117. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
  118. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
  119. package/examples/jsm/nodes/materials/NodeMaterial.js +27 -26
  120. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
  121. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  122. package/examples/jsm/nodes/math/CondNode.js +1 -1
  123. package/examples/jsm/nodes/math/HashNode.js +8 -9
  124. package/examples/jsm/nodes/math/MathNode.js +2 -2
  125. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  126. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  127. package/examples/jsm/nodes/shadernode/ShaderNode.js +81 -28
  128. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  129. package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
  130. package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
  131. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
  132. package/examples/jsm/nodes/utils/JoinNode.js +1 -1
  133. package/examples/jsm/nodes/utils/LoopNode.js +11 -11
  134. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
  135. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  136. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  137. package/examples/jsm/nodes/utils/PackingNode.js +2 -2
  138. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  139. package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
  140. package/examples/jsm/nodes/utils/SetNode.js +62 -0
  141. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
  142. package/examples/jsm/nodes/utils/SplitNode.js +1 -1
  143. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
  144. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  145. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
  146. package/examples/jsm/objects/Sky.js +1 -3
  147. package/examples/jsm/postprocessing/OutputPass.js +3 -2
  148. package/examples/jsm/renderers/common/Background.js +2 -2
  149. package/examples/jsm/renderers/common/Bindings.js +3 -5
  150. package/examples/jsm/renderers/common/Pipelines.js +7 -7
  151. package/examples/jsm/renderers/common/RenderContext.js +3 -0
  152. package/examples/jsm/renderers/common/RenderObject.js +40 -16
  153. package/examples/jsm/renderers/common/RenderObjects.js +8 -14
  154. package/examples/jsm/renderers/common/Renderer.js +40 -13
  155. package/examples/jsm/renderers/common/SampledTexture.js +4 -2
  156. package/examples/jsm/renderers/common/StorageTexture.js +19 -0
  157. package/examples/jsm/renderers/common/Textures.js +14 -9
  158. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
  159. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +20 -10
  160. package/examples/jsm/renderers/common/nodes/NodeSampler.js +0 -6
  161. package/examples/jsm/renderers/common/nodes/Nodes.js +51 -24
  162. package/examples/jsm/renderers/webgl/WebGLBackend.js +100 -5
  163. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +92 -6
  164. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +13 -0
  165. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +3 -3
  166. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +14 -2
  167. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +5 -5
  168. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +6 -3
  169. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +5 -5
  170. package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
  171. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +197 -167
  172. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  173. package/examples/jsm/shaders/MMDToonShader.js +4 -4
  174. package/examples/jsm/shaders/OutputShader.js +2 -2
  175. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
  176. package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
  177. package/package.json +1 -1
  178. package/src/Three.js +0 -2
  179. package/src/animation/AnimationUtils.js +3 -20
  180. package/src/animation/KeyframeTrack.js +8 -8
  181. package/src/cameras/Camera.js +1 -5
  182. package/src/cameras/CubeCamera.js +14 -8
  183. package/src/constants.js +7 -1
  184. package/src/core/RenderTarget.js +16 -7
  185. package/src/extras/core/CurvePath.js +4 -1
  186. package/src/loaders/MaterialLoader.js +1 -1
  187. package/src/loaders/ObjectLoader.js +6 -0
  188. package/src/materials/Material.js +8 -8
  189. package/src/math/Color.js +1 -5
  190. package/src/math/ColorManagement.js +82 -60
  191. package/src/objects/Sprite.js +2 -2
  192. package/src/renderers/WebGLRenderer.js +21 -2
  193. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  194. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
  195. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
  196. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
  197. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
  198. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
  199. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
  200. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
  201. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
  202. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
  203. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
  204. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
  205. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
  206. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
  207. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  208. package/src/renderers/shaders/UniformsUtils.js +2 -2
  209. package/src/renderers/webgl/WebGLBackground.js +4 -3
  210. package/src/renderers/webgl/WebGLLights.js +14 -3
  211. package/src/renderers/webgl/WebGLProgram.js +34 -5
  212. package/src/renderers/webgl/WebGLPrograms.js +6 -2
  213. package/src/renderers/webgl/WebGLTextures.js +17 -6
  214. package/src/renderers/webgl/WebGLUtils.js +21 -23
  215. package/src/scenes/Fog.js +1 -0
  216. package/src/scenes/FogExp2.js +1 -0
  217. package/src/textures/Source.js +2 -2
  218. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
  219. package/src/lights/AmbientLightProbe.js +0 -21
  220. package/src/lights/HemisphereLightProbe.js +0 -30
@@ -75,4 +75,4 @@ export const js = ( src, includes ) => code( src, includes, 'js' );
75
75
  export const wgsl = ( src, includes ) => code( src, includes, 'wgsl' );
76
76
  export const glsl = ( src, includes ) => code( src, includes, 'glsl' );
77
77
 
78
- addNodeClass( CodeNode );
78
+ addNodeClass( 'CodeNode', CodeNode );
@@ -34,4 +34,4 @@ export default ExpressionNode;
34
34
 
35
35
  export const expression = nodeProxy( ExpressionNode );
36
36
 
37
- addNodeClass( ExpressionNode );
37
+ addNodeClass( 'ExpressionNode', ExpressionNode );
@@ -93,4 +93,4 @@ export const call = ( func, ...params ) => {
93
93
 
94
94
  addNodeElement( 'call', call );
95
95
 
96
- addNodeClass( FunctionCallNode );
96
+ addNodeClass( 'FunctionCallNode', FunctionCallNode );
@@ -99,17 +99,28 @@ class FunctionNode extends CodeNode {
99
99
 
100
100
  export default FunctionNode;
101
101
 
102
- const nativeFn = ( code, includes, language = '' ) => {
102
+ const nativeFn = ( code, includes = [], language = '' ) => {
103
103
 
104
- let functionNode = null;
104
+ for ( let i = 0; i < includes.length; i ++ ) {
105
105
 
106
- return ( ...params ) => {
106
+ const include = includes[ i ];
107
107
 
108
- if ( functionNode === null ) functionNode = nodeObject( new FunctionNode( code, includes, language ) );
108
+ // TSL Function: glslFn, wgslFn
109
109
 
110
- return functionNode.call( ...params );
110
+ if ( typeof include === 'function' ) {
111
111
 
112
- };
112
+ includes[ i ] = include.functionNode;
113
+
114
+ }
115
+
116
+ }
117
+
118
+ const functionNode = nodeObject( new FunctionNode( code, includes, language ) );
119
+
120
+ const fn = ( ...params ) => functionNode.call( ...params );
121
+ fn.functionNode = functionNode;
122
+
123
+ return fn;
113
124
 
114
125
  };
115
126
 
@@ -124,4 +135,4 @@ export const func = ( code, includes ) => { // @deprecated, r154
124
135
 
125
136
  };
126
137
 
127
- addNodeClass( FunctionNode );
138
+ addNodeClass( 'FunctionNode', FunctionNode );
@@ -431,7 +431,7 @@ class ScriptableNode extends Node {
431
431
 
432
432
  }
433
433
 
434
- construct() {
434
+ setup() {
435
435
 
436
436
  return this.getDefaultOutputNode();
437
437
 
@@ -485,4 +485,4 @@ export const scriptable = nodeProxy( ScriptableNode );
485
485
 
486
486
  addNodeElement( 'scriptable', scriptable );
487
487
 
488
- addNodeClass( ScriptableNode );
488
+ addNodeClass( 'ScriptableNode', ScriptableNode );
@@ -92,7 +92,7 @@ class ScriptableValueNode extends Node {
92
92
 
93
93
  }
94
94
 
95
- construct() {
95
+ setup() {
96
96
 
97
97
  return this.value && this.value.isNode ? this.value : float();
98
98
 
@@ -164,4 +164,4 @@ export const scriptableValue = nodeProxy( ScriptableValueNode );
164
164
 
165
165
  addNodeElement( 'scriptableValue', scriptableValue );
166
166
 
167
- addNodeClass( ScriptableValueNode );
167
+ addNodeClass( 'ScriptableValueNode', ScriptableValueNode );
@@ -23,4 +23,4 @@ class ArrayUniformNode extends UniformNode {
23
23
 
24
24
  export default ArrayUniformNode;
25
25
 
26
- addNodeClass( ArrayUniformNode );
26
+ addNodeClass( 'ArrayUniformNode', ArrayUniformNode );
@@ -99,4 +99,4 @@ export default AttributeNode;
99
99
 
100
100
  export const attribute = ( name, nodeType ) => nodeObject( new AttributeNode( name, nodeType ) );
101
101
 
102
- addNodeClass( AttributeNode );
102
+ addNodeClass( 'AttributeNode', AttributeNode );
@@ -42,4 +42,4 @@ export const bypass = nodeProxy( BypassNode );
42
42
 
43
43
  addNodeElement( 'bypass', bypass );
44
44
 
45
- addNodeClass( BypassNode );
45
+ addNodeClass( 'BypassNode', BypassNode );
@@ -43,4 +43,4 @@ export const cache = nodeProxy( CacheNode );
43
43
 
44
44
  addNodeElement( 'cache', cache );
45
45
 
46
- addNodeClass( CacheNode );
46
+ addNodeClass( 'CacheNode', CacheNode );
@@ -29,4 +29,4 @@ class ConstNode extends InputNode {
29
29
 
30
30
  export default ConstNode;
31
31
 
32
- addNodeClass( ConstNode );
32
+ addNodeClass( 'ConstNode', ConstNode );
@@ -20,7 +20,7 @@ class ContextNode extends Node {
20
20
 
21
21
  }
22
22
 
23
- construct( builder ) {
23
+ setup( builder ) {
24
24
 
25
25
  const previousContext = builder.getContext();
26
26
 
@@ -58,4 +58,4 @@ export const label = ( node, name ) => context( node, { label: name } );
58
58
  addNodeElement( 'context', context );
59
59
  addNodeElement( 'label', label );
60
60
 
61
- addNodeClass( ContextNode );
61
+ addNodeClass( 'ContextNode', ContextNode );
@@ -63,4 +63,4 @@ export default IndexNode;
63
63
  export const vertexIndex = nodeImmutable( IndexNode, IndexNode.VERTEX );
64
64
  export const instanceIndex = nodeImmutable( IndexNode, IndexNode.INSTANCE );
65
65
 
66
- addNodeClass( IndexNode );
66
+ addNodeClass( 'IndexNode', IndexNode );
@@ -80,4 +80,4 @@ class InputNode extends Node {
80
80
 
81
81
  export default InputNode;
82
82
 
83
- addNodeClass( InputNode );
83
+ addNodeClass( 'InputNode', InputNode );
@@ -28,7 +28,7 @@ class Node extends EventDispatcher {
28
28
 
29
29
  get type() {
30
30
 
31
- return this.constructor.name;
31
+ return this.constructor.type;
32
32
 
33
33
  }
34
34
 
@@ -40,6 +40,12 @@ class Node extends EventDispatcher {
40
40
 
41
41
  }
42
42
 
43
+ updateReference() {
44
+
45
+ return this;
46
+
47
+ }
48
+
43
49
  isGlobal( /*builder*/ ) {
44
50
 
45
51
  return false;
@@ -119,7 +125,7 @@ class Node extends EventDispatcher {
119
125
 
120
126
  }
121
127
 
122
- getReference( builder ) {
128
+ getShared( builder ) {
123
129
 
124
130
  const hash = this.getHash( builder );
125
131
  const nodeFromHash = builder.getNodeFromHash( hash );
@@ -128,7 +134,7 @@ class Node extends EventDispatcher {
128
134
 
129
135
  }
130
136
 
131
- construct( builder ) {
137
+ setup( builder ) {
132
138
 
133
139
  const nodeProperties = builder.getNodeProperties( this );
134
140
 
@@ -143,6 +149,14 @@ class Node extends EventDispatcher {
143
149
 
144
150
  }
145
151
 
152
+ construct( builder ) { // @deprecated, r157
153
+
154
+ console.warn( 'THREE.Node: construct() is deprecated. Use setup() instead.' );
155
+
156
+ return this.setup( builder );
157
+
158
+ }
159
+
146
160
  analyze( builder ) {
147
161
 
148
162
  const nodeData = builder.getDataFromNode( this );
@@ -194,7 +208,7 @@ class Node extends EventDispatcher {
194
208
 
195
209
  build( builder, output = null ) {
196
210
 
197
- const refNode = this.getReference( builder );
211
+ const refNode = this.getShared( builder );
198
212
 
199
213
  if ( this !== refNode ) {
200
214
 
@@ -206,7 +220,7 @@ class Node extends EventDispatcher {
206
220
  builder.addChain( this );
207
221
 
208
222
  /* Build stages expected results:
209
- - "construct" -> Node
223
+ - "setup" -> Node
210
224
  - "analyze" -> null
211
225
  - "generate" -> String
212
226
  */
@@ -214,18 +228,18 @@ class Node extends EventDispatcher {
214
228
 
215
229
  const buildStage = builder.getBuildStage();
216
230
 
217
- if ( buildStage === 'construct' ) {
231
+ if ( buildStage === 'setup' ) {
218
232
 
219
233
  const properties = builder.getNodeProperties( this );
220
234
 
221
235
  if ( properties.initialized !== true || builder.context.tempRead === false ) {
222
236
 
223
- const stackNodesBeforeConstruct = builder.stack.nodes.length;
237
+ const stackNodesBeforeSetup = builder.stack.nodes.length;
224
238
 
225
239
  properties.initialized = true;
226
- properties.outputNode = this.construct( builder );
240
+ properties.outputNode = this.setup( builder );
227
241
 
228
- if ( properties.outputNode !== null && builder.stack.nodes.length !== stackNodesBeforeConstruct ) {
242
+ if ( properties.outputNode !== null && builder.stack.nodes.length !== stackNodesBeforeSetup ) {
229
243
 
230
244
  properties.outputNode = builder.stack;
231
245
 
@@ -448,12 +462,13 @@ class Node extends EventDispatcher {
448
462
 
449
463
  export default Node;
450
464
 
451
- export function addNodeClass( nodeClass ) {
465
+ export function addNodeClass( type, nodeClass ) {
452
466
 
453
- if ( typeof nodeClass !== 'function' || ! nodeClass.name ) throw new Error( `Node class ${ nodeClass.name } is not a class` );
454
- if ( NodeClasses.has( nodeClass.name ) ) throw new Error( `Redefinition of node class ${ nodeClass.name }` );
467
+ if ( typeof nodeClass !== 'function' || ! type ) throw new Error( `Node class ${ type } is not a class` );
468
+ if ( NodeClasses.has( type ) ) throw new Error( `Redefinition of node class ${ type }` );
455
469
 
456
- NodeClasses.set( nodeClass.name, nodeClass );
470
+ NodeClasses.set( type, nodeClass );
471
+ nodeClass.type = type;
457
472
 
458
473
  }
459
474
 
@@ -50,10 +50,10 @@ const toFloat = ( value ) => {
50
50
 
51
51
  class NodeBuilder {
52
52
 
53
- constructor( object, renderer, parser, scene = null ) {
53
+ constructor( object, renderer, parser, scene = null, material = null ) {
54
54
 
55
55
  this.object = object;
56
- this.material = ( object && object.material ) || null;
56
+ this.material = material || ( object && object.material ) || null;
57
57
  this.geometry = ( object && object.geometry ) || null;
58
58
  this.renderer = renderer;
59
59
  this.parser = parser;
@@ -124,20 +124,6 @@ class NodeBuilder {
124
124
 
125
125
  }
126
126
 
127
- createBindings() {
128
-
129
- const bindingsArray = [];
130
-
131
- for ( const binding of this.getBindings() ) {
132
-
133
- bindingsArray.push( binding.clone() );
134
-
135
- }
136
-
137
- return bindingsArray;
138
-
139
- }
140
-
141
127
  getBindings() {
142
128
 
143
129
  let bindingsArray = this.bindingsArray;
@@ -959,7 +945,7 @@ class NodeBuilder {
959
945
 
960
946
  build() {
961
947
 
962
- // construct() -> stage 1: create possible new nodes and returns an output reference node
948
+ // setup() -> stage 1: create possible new nodes and returns an output reference node
963
949
  // analyze() -> stage 2: analyze nodes to possible optimization and validation
964
950
  // generate() -> stage 3: generate shader
965
951
 
@@ -12,10 +12,8 @@ class NodeFrame {
12
12
 
13
13
  this.startTime = null;
14
14
 
15
- this.frameMap = new WeakMap();
16
- this.frameBeforeMap = new WeakMap();
17
- this.renderMap = new WeakMap();
18
- this.renderBeforeMap = new WeakMap();
15
+ this.updateMap = new WeakMap();
16
+ this.updateBeforeMap = new WeakMap();
19
17
 
20
18
  this.renderer = null;
21
19
  this.material = null;
@@ -25,15 +23,37 @@ class NodeFrame {
25
23
 
26
24
  }
27
25
 
26
+ _getMaps( referenceMap, nodeRef ) {
27
+
28
+ let maps = referenceMap.get( nodeRef );
29
+
30
+ if ( maps === undefined ) {
31
+
32
+ maps = {
33
+ renderMap: new WeakMap(),
34
+ frameMap: new WeakMap()
35
+ };
36
+
37
+ referenceMap.set( nodeRef, maps );
38
+
39
+ }
40
+
41
+ return maps;
42
+
43
+ }
44
+
28
45
  updateBeforeNode( node ) {
29
46
 
30
47
  const updateType = node.getUpdateBeforeType();
48
+ const reference = node.updateReference( this );
49
+
50
+ const { frameMap, renderMap } = this._getMaps( this.updateBeforeMap, reference );
31
51
 
32
52
  if ( updateType === NodeUpdateType.FRAME ) {
33
53
 
34
- if ( this.frameBeforeMap.get( node ) !== this.frameId ) {
54
+ if ( frameMap.get( node ) !== this.frameId ) {
35
55
 
36
- this.frameBeforeMap.set( node, this.frameId );
56
+ frameMap.set( node, this.frameId );
37
57
 
38
58
  node.updateBefore( this );
39
59
 
@@ -41,10 +61,10 @@ class NodeFrame {
41
61
 
42
62
  } else if ( updateType === NodeUpdateType.RENDER ) {
43
63
 
44
- if ( this.renderBeforeMap.get( node ) !== this.renderId || this.frameBeforeMap.get( node ) !== this.frameId ) {
64
+ if ( renderMap.get( node ) !== this.renderId || frameMap.get( node ) !== this.frameId ) {
45
65
 
46
- this.renderBeforeMap.set( node, this.renderId );
47
- this.frameBeforeMap.set( node, this.frameId );
66
+ renderMap.set( node, this.renderId );
67
+ frameMap.set( node, this.frameId );
48
68
 
49
69
  node.updateBefore( this );
50
70
 
@@ -61,12 +81,15 @@ class NodeFrame {
61
81
  updateNode( node ) {
62
82
 
63
83
  const updateType = node.getUpdateType();
84
+ const reference = node.updateReference( this );
85
+
86
+ const { frameMap, renderMap } = this._getMaps( this.updateMap, reference );
64
87
 
65
88
  if ( updateType === NodeUpdateType.FRAME ) {
66
89
 
67
- if ( this.frameMap.get( node ) !== this.frameId ) {
90
+ if ( frameMap.get( node ) !== this.frameId ) {
68
91
 
69
- this.frameMap.set( node, this.frameId );
92
+ frameMap.set( node, this.frameId );
70
93
 
71
94
  node.update( this );
72
95
 
@@ -74,10 +97,10 @@ class NodeFrame {
74
97
 
75
98
  } else if ( updateType === NodeUpdateType.RENDER ) {
76
99
 
77
- if ( this.renderMap.get( node ) !== this.renderId || this.frameMap.get( node ) !== this.frameId ) {
100
+ if ( renderMap.get( node ) !== this.renderId || frameMap.get( node ) !== this.frameId ) {
78
101
 
79
- this.renderMap.set( node, this.renderId );
80
- this.frameMap.set( node, this.frameId );
102
+ renderMap.set( node, this.renderId );
103
+ frameMap.set( node, this.frameId );
81
104
 
82
105
  node.update( this );
83
106
 
@@ -13,9 +13,9 @@ class OutputStructNode extends Node {
13
13
 
14
14
  }
15
15
 
16
- construct( builder ) {
16
+ setup( builder ) {
17
17
 
18
- super.construct( builder );
18
+ super.setup( builder );
19
19
 
20
20
  const members = this.members;
21
21
  const types = [];
@@ -33,15 +33,19 @@ class OutputStructNode extends Node {
33
33
  generate( builder, output ) {
34
34
 
35
35
  const nodeVar = builder.getVarFromNode( this, this.nodeType );
36
+ nodeVar.isOutputStructVar = true;
37
+
36
38
  const propertyName = builder.getPropertyName( nodeVar );
37
39
 
38
40
  const members = this.members;
39
41
 
42
+ const structPrefix = propertyName !== '' ? propertyName + '.' : '';
43
+
40
44
  for ( let i = 0; i < members.length; i++ ) {
41
45
 
42
46
  const snippet = members[ i ].build( builder, output );
43
47
 
44
- builder.addLineFlowCode( `${propertyName}.m${i} = ${snippet}` );
48
+ builder.addLineFlowCode( `${structPrefix}m${i} = ${snippet}` );
45
49
 
46
50
  }
47
51
 
@@ -55,4 +59,4 @@ export default OutputStructNode;
55
59
 
56
60
  export const outputStruct = nodeProxy( OutputStructNode );
57
61
 
58
- addNodeClass( OutputStructNode );
62
+ addNodeClass( 'OutputStructNode', OutputStructNode );
@@ -57,7 +57,7 @@ export const iridescenceThickness = nodeImmutable( PropertyNode, 'float', 'Iride
57
57
  export const specularColor = nodeImmutable( PropertyNode, 'color', 'SpecularColor' );
58
58
  export const shininess = nodeImmutable( PropertyNode, 'float', 'Shininess' );
59
59
  export const output = nodeImmutable( PropertyNode, 'vec4', 'Output' );
60
- export const dashSize = nodeImmutable( PropertyNode, 'float', 'dashScale' );
61
- export const gapSize= nodeImmutable( PropertyNode, 'float', 'gapSize' );
60
+ export const dashSize = nodeImmutable( PropertyNode, 'float', 'dashSize' );
61
+ export const gapSize = nodeImmutable( PropertyNode, 'float', 'gapSize' );
62
62
 
63
- addNodeClass( PropertyNode );
63
+ addNodeClass( 'PropertyNode', PropertyNode );
@@ -96,4 +96,4 @@ export default StackNode;
96
96
 
97
97
  export const stack = nodeProxy( StackNode );
98
98
 
99
- addNodeClass( StackNode );
99
+ addNodeClass( 'StackNode', StackNode );
@@ -21,4 +21,4 @@ class StructTypeNode extends Node {
21
21
 
22
22
  export default StructTypeNode;
23
23
 
24
- addNodeClass( StructTypeNode );
24
+ addNodeClass( 'StructTypeNode', StructTypeNode );
@@ -55,4 +55,4 @@ class TempNode extends Node {
55
55
 
56
56
  export default TempNode;
57
57
 
58
- addNodeClass( TempNode );
58
+ addNodeClass( 'TempNode', TempNode );
@@ -39,6 +39,8 @@ class UniformNode extends InputNode {
39
39
  const nodeUniform = builder.getUniformFromNode( sharedNode, sharedNodeType, builder.shaderStage, builder.context.label );
40
40
  const propertyName = builder.getPropertyName( nodeUniform );
41
41
 
42
+ if ( builder.context.label !== undefined ) delete builder.context.label;
43
+
42
44
  return builder.format( propertyName, type, output );
43
45
 
44
46
  }
@@ -58,4 +60,4 @@ export const uniform = ( arg1, arg2 ) => {
58
60
 
59
61
  };
60
62
 
61
- addNodeClass( UniformNode );
63
+ addNodeClass( 'UniformNode', UniformNode );
@@ -84,4 +84,4 @@ export const temp = nodeProxy( VarNode );
84
84
 
85
85
  addNodeElement( 'temp', temp );
86
86
 
87
- addNodeClass( VarNode );
87
+ addNodeClass( 'VarNode', VarNode );
@@ -66,4 +66,4 @@ export const varying = nodeProxy( VaryingNode );
66
66
 
67
67
  addNodeElement( 'varying', varying );
68
68
 
69
- addNodeClass( VaryingNode );
69
+ addNodeClass( 'VaryingNode', VaryingNode );
@@ -22,6 +22,6 @@ export const NodeType = {
22
22
  };
23
23
 
24
24
  export const defaultShaderStages = [ 'fragment', 'vertex' ];
25
- export const defaultBuildStages = [ 'construct', 'analyze', 'generate' ];
25
+ export const defaultBuildStages = [ 'setup', 'analyze', 'generate' ];
26
26
  export const shaderStages = [ ...defaultShaderStages, 'compute' ];
27
27
  export const vectorComponents = [ 'x', 'y', 'z', 'w' ];
@@ -48,7 +48,7 @@ class BlendModeNode extends TempNode {
48
48
 
49
49
  }
50
50
 
51
- construct() {
51
+ setup() {
52
52
 
53
53
  const { blendMode, baseNode, blendNode } = this;
54
54
  const params = { base: baseNode, blend: blendNode };
@@ -96,4 +96,4 @@ addNodeElement( 'dodge', dodge );
96
96
  addNodeElement( 'overlay', overlay );
97
97
  addNodeElement( 'screen', screen );
98
98
 
99
- addNodeClass( BlendModeNode );
99
+ addNodeClass( 'BlendModeNode', BlendModeNode );
@@ -55,7 +55,7 @@ class BumpMapNode extends TempNode {
55
55
 
56
56
  }
57
57
 
58
- construct() {
58
+ setup() {
59
59
 
60
60
  const bumpScale = this.scaleNode !== null ? this.scaleNode : 1;
61
61
  const dHdxy = dHdxy_fwd( { bumpTexture: this.texture, bumpScale } );
@@ -74,4 +74,4 @@ export default BumpMapNode;
74
74
 
75
75
  export const bumpMap = nodeProxy( BumpMapNode );
76
76
 
77
- addNodeClass( BumpMapNode );
77
+ addNodeClass( 'BumpMapNode', BumpMapNode );
@@ -48,7 +48,7 @@ class ColorAdjustmentNode extends TempNode {
48
48
 
49
49
  }
50
50
 
51
- construct() {
51
+ setup() {
52
52
 
53
53
  const { method, colorNode, adjustmentNode } = this;
54
54
 
@@ -97,4 +97,4 @@ addNodeElement( 'saturation', saturation );
97
97
  addNodeElement( 'vibrance', vibrance );
98
98
  addNodeElement( 'hue', hue );
99
99
 
100
- addNodeClass( ColorAdjustmentNode );
100
+ addNodeClass( 'ColorAdjustmentNode', ColorAdjustmentNode );
@@ -70,7 +70,7 @@ class ColorSpaceNode extends TempNode {
70
70
 
71
71
  }
72
72
 
73
- construct() {
73
+ setup() {
74
74
 
75
75
  const { method, node } = this;
76
76
 
@@ -105,4 +105,4 @@ addNodeElement( 'sRGBToLinear', sRGBToLinear );
105
105
  addNodeElement( 'linearToColorSpace', linearToColorSpace );
106
106
  addNodeElement( 'colorSpaceToLinear', colorSpaceToLinear );
107
107
 
108
- addNodeClass( ColorSpaceNode );
108
+ addNodeClass( 'ColorSpaceNode', ColorSpaceNode );
@@ -24,4 +24,4 @@ export default FrontFacingNode;
24
24
  export const frontFacing = nodeImmutable( FrontFacingNode );
25
25
  export const faceDirection = float( frontFacing ).mul( 2.0 ).sub( 1.0 );
26
26
 
27
- addNodeClass( FrontFacingNode );
27
+ addNodeClass( 'FrontFacingNode', FrontFacingNode );
@@ -52,7 +52,7 @@ class NormalMapNode extends TempNode {
52
52
 
53
53
  }
54
54
 
55
- construct( builder ) {
55
+ setup( builder ) {
56
56
 
57
57
  const { normalMapType, scaleNode } = this;
58
58
 
@@ -103,4 +103,4 @@ export const normalMap = nodeProxy( NormalMapNode );
103
103
 
104
104
  export const TBNViewMatrix = mat3( tangentView, bitangentView, normalView );
105
105
 
106
- addNodeClass( NormalMapNode );
106
+ addNodeClass( 'NormalMapNode', NormalMapNode );
@@ -13,7 +13,7 @@ class PosterizeNode extends TempNode {
13
13
 
14
14
  }
15
15
 
16
- construct() {
16
+ setup() {
17
17
 
18
18
  const { sourceNode, stepsNode } = this;
19
19
 
@@ -29,4 +29,4 @@ export const posterize = nodeProxy( PosterizeNode );
29
29
 
30
30
  addNodeElement( 'posterize', posterize );
31
31
 
32
- addNodeClass( PosterizeNode );
32
+ addNodeClass( 'PosterizeNode', PosterizeNode );
@@ -104,7 +104,7 @@ class ToneMappingNode extends TempNode {
104
104
 
105
105
  }
106
106
 
107
- construct( builder ) {
107
+ setup( builder ) {
108
108
 
109
109
  const colorNode = this.colorNode || builder.context.color;
110
110
  const toneMapping = this.toneMapping;
@@ -138,4 +138,4 @@ export default ToneMappingNode;
138
138
 
139
139
  export const toneMapping = ( mapping, exposure, color ) => nodeObject( new ToneMappingNode( mapping, nodeObject( exposure ), nodeObject( color ) ) );
140
140
 
141
- addNodeClass( ToneMappingNode );
141
+ addNodeClass( 'ToneMappingNode', ToneMappingNode );
@@ -17,7 +17,7 @@ class ViewportDepthNode extends Node {
17
17
 
18
18
  }
19
19
 
20
- construct( /*builder*/ ) {
20
+ setup( /*builder*/ ) {
21
21
 
22
22
  const { scope } = this;
23
23
 
@@ -66,4 +66,4 @@ export default ViewportDepthNode;
66
66
  export const depth = nodeImmutable( ViewportDepthNode, ViewportDepthNode.DEPTH );
67
67
  export const depthTexture = nodeProxy( ViewportDepthNode, ViewportDepthNode.DEPTH_TEXTURE );
68
68
 
69
- addNodeClass( ViewportDepthNode );
69
+ addNodeClass( 'ViewportDepthNode', ViewportDepthNode );
@@ -31,4 +31,4 @@ export const viewportDepthTexture = nodeProxy( ViewportDepthTextureNode );
31
31
 
32
32
  addNodeElement( 'viewportDepthTexture', viewportDepthTexture );
33
33
 
34
- addNodeClass( ViewportDepthTextureNode );
34
+ addNodeClass( 'ViewportDepthTextureNode', ViewportDepthTextureNode );