super-three 0.155.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 (268) hide show
  1. package/build/three.cjs +361 -324
  2. package/build/three.js +361 -324
  3. package/build/three.min.js +2 -2
  4. package/build/three.module.js +354 -323
  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/controls/OrbitControls.js +13 -5
  9. package/examples/jsm/csm/CSMShader.js +59 -21
  10. package/examples/jsm/exporters/EXRExporter.js +102 -24
  11. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  12. package/examples/jsm/libs/rhino3dm/rhino3dm.js +8726 -4
  13. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +8737 -4
  14. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  15. package/examples/jsm/libs/tween.module.js +790 -735
  16. package/examples/jsm/libs/utif.module.js +1644 -1558
  17. package/examples/jsm/lights/LightProbeGenerator.js +37 -3
  18. package/examples/jsm/lines/LineMaterial.js +90 -156
  19. package/examples/jsm/loaders/3DMLoader.js +378 -104
  20. package/examples/jsm/loaders/DDSLoader.js +46 -3
  21. package/examples/jsm/loaders/EXRLoader.js +4 -4
  22. package/examples/jsm/loaders/FBXLoader.js +2 -0
  23. package/examples/jsm/loaders/GLTFLoader.js +18 -8
  24. package/examples/jsm/loaders/KTX2Loader.js +126 -77
  25. package/examples/jsm/loaders/LDrawLoader.js +22 -16
  26. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  27. package/examples/jsm/loaders/MMDLoader.js +10 -7
  28. package/examples/jsm/loaders/RGBELoader.js +48 -66
  29. package/examples/jsm/loaders/STLLoader.js +7 -0
  30. package/examples/jsm/loaders/USDZLoader.js +215 -12
  31. package/examples/jsm/materials/MeshGouraudMaterial.js +22 -18
  32. package/examples/jsm/nodes/Nodes.js +8 -1
  33. package/examples/jsm/nodes/accessors/BitangentNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +30 -4
  35. package/examples/jsm/nodes/accessors/BufferNode.js +1 -1
  36. package/examples/jsm/nodes/accessors/CameraNode.js +1 -1
  37. package/examples/jsm/nodes/accessors/CubeTextureNode.js +19 -4
  38. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +4 -5
  39. package/examples/jsm/nodes/accessors/InstanceNode.js +2 -2
  40. package/examples/jsm/nodes/accessors/LineMaterialNode.js +29 -0
  41. package/examples/jsm/nodes/accessors/MaterialNode.js +23 -13
  42. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +12 -9
  43. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  44. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +5 -4
  45. package/examples/jsm/nodes/accessors/MorphNode.js +4 -4
  46. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  47. package/examples/jsm/nodes/accessors/Object3DNode.js +3 -3
  48. package/examples/jsm/nodes/accessors/PointUVNode.js +1 -1
  49. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  50. package/examples/jsm/nodes/accessors/ReferenceNode.js +13 -7
  51. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +2 -2
  52. package/examples/jsm/nodes/accessors/SceneNode.js +2 -2
  53. package/examples/jsm/nodes/accessors/SkinningNode.js +2 -2
  54. package/examples/jsm/nodes/accessors/StorageBufferNode.js +1 -1
  55. package/examples/jsm/nodes/accessors/TangentNode.js +1 -1
  56. package/examples/jsm/nodes/accessors/TextureBicubicNode.js +2 -2
  57. package/examples/jsm/nodes/accessors/TextureNode.js +18 -8
  58. package/examples/jsm/nodes/accessors/TextureSizeNode.js +2 -2
  59. package/examples/jsm/nodes/accessors/TextureStoreNode.js +29 -0
  60. package/examples/jsm/nodes/accessors/UVNode.js +1 -1
  61. package/examples/jsm/nodes/accessors/UserDataNode.js +2 -2
  62. package/examples/jsm/nodes/code/CodeNode.js +1 -1
  63. package/examples/jsm/nodes/code/ExpressionNode.js +1 -1
  64. package/examples/jsm/nodes/code/FunctionCallNode.js +1 -1
  65. package/examples/jsm/nodes/code/FunctionNode.js +18 -7
  66. package/examples/jsm/nodes/code/ScriptableNode.js +2 -2
  67. package/examples/jsm/nodes/code/ScriptableValueNode.js +2 -2
  68. package/examples/jsm/nodes/core/ArrayUniformNode.js +1 -1
  69. package/examples/jsm/nodes/core/AttributeNode.js +3 -3
  70. package/examples/jsm/nodes/core/BypassNode.js +1 -1
  71. package/examples/jsm/nodes/core/CacheNode.js +1 -1
  72. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  73. package/examples/jsm/nodes/core/ContextNode.js +2 -2
  74. package/examples/jsm/nodes/core/IndexNode.js +1 -1
  75. package/examples/jsm/nodes/core/InputNode.js +1 -1
  76. package/examples/jsm/nodes/core/Node.js +45 -14
  77. package/examples/jsm/nodes/core/NodeBuilder.js +83 -15
  78. package/examples/jsm/nodes/core/NodeFrame.js +37 -14
  79. package/examples/jsm/nodes/core/NodeUniform.js +1 -1
  80. package/examples/jsm/nodes/core/OutputStructNode.js +62 -0
  81. package/examples/jsm/nodes/core/PropertyNode.js +3 -1
  82. package/examples/jsm/nodes/core/StackNode.js +5 -5
  83. package/examples/jsm/nodes/core/StructTypeNode.js +24 -0
  84. package/examples/jsm/nodes/core/TempNode.js +1 -1
  85. package/examples/jsm/nodes/core/UniformNode.js +3 -1
  86. package/examples/jsm/nodes/core/VarNode.js +1 -1
  87. package/examples/jsm/nodes/core/VaryingNode.js +1 -1
  88. package/examples/jsm/nodes/core/constants.js +1 -1
  89. package/examples/jsm/nodes/display/BlendModeNode.js +2 -2
  90. package/examples/jsm/nodes/display/BumpMapNode.js +2 -2
  91. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -2
  92. package/examples/jsm/nodes/display/ColorSpaceNode.js +2 -2
  93. package/examples/jsm/nodes/display/FrontFacingNode.js +1 -1
  94. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  95. package/examples/jsm/nodes/display/PosterizeNode.js +2 -2
  96. package/examples/jsm/nodes/display/ToneMappingNode.js +2 -2
  97. package/examples/jsm/nodes/display/ViewportDepthNode.js +2 -2
  98. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -1
  99. package/examples/jsm/nodes/display/ViewportNode.js +21 -7
  100. package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +1 -1
  101. package/examples/jsm/nodes/display/ViewportTextureNode.js +1 -1
  102. package/examples/jsm/nodes/fog/FogExp2Node.js +2 -2
  103. package/examples/jsm/nodes/fog/FogNode.js +2 -2
  104. package/examples/jsm/nodes/fog/FogRangeNode.js +2 -2
  105. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  106. package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
  107. package/examples/jsm/nodes/lighting/AONode.js +2 -2
  108. package/examples/jsm/nodes/lighting/AmbientLightNode.js +3 -3
  109. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +4 -4
  110. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +4 -4
  111. package/examples/jsm/nodes/lighting/EnvironmentNode.js +2 -2
  112. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +3 -3
  113. package/examples/jsm/nodes/lighting/IESSpotLightNode.js +2 -2
  114. package/examples/jsm/nodes/lighting/LightNode.js +2 -2
  115. package/examples/jsm/nodes/lighting/LightingContextNode.js +3 -3
  116. package/examples/jsm/nodes/lighting/LightingNode.js +1 -1
  117. package/examples/jsm/nodes/lighting/LightsNode.js +4 -4
  118. package/examples/jsm/nodes/lighting/PointLightNode.js +3 -3
  119. package/examples/jsm/nodes/lighting/SpotLightNode.js +4 -4
  120. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +449 -0
  121. package/examples/jsm/nodes/materials/LineBasicNodeMaterial.js +1 -1
  122. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +54 -0
  123. package/examples/jsm/nodes/materials/Materials.js +2 -0
  124. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -1
  125. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +2 -2
  126. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  127. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  128. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +6 -6
  129. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +3 -3
  130. package/examples/jsm/nodes/materials/NodeMaterial.js +39 -29
  131. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +1 -1
  132. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  133. package/examples/jsm/nodes/math/CondNode.js +1 -1
  134. package/examples/jsm/nodes/math/HashNode.js +34 -0
  135. package/examples/jsm/nodes/math/MathNode.js +2 -2
  136. package/examples/jsm/nodes/math/OperatorNode.js +1 -1
  137. package/examples/jsm/nodes/procedural/CheckerNode.js +3 -3
  138. package/examples/jsm/nodes/shadernode/ShaderNode.js +85 -28
  139. package/examples/jsm/nodes/utils/ArrayElementNode.js +1 -1
  140. package/examples/jsm/nodes/utils/ConvertNode.js +1 -1
  141. package/examples/jsm/nodes/utils/DiscardNode.js +1 -1
  142. package/examples/jsm/nodes/utils/EquirectUVNode.js +2 -2
  143. package/examples/jsm/nodes/utils/JoinNode.js +1 -1
  144. package/examples/jsm/nodes/utils/LoopNode.js +11 -11
  145. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -2
  146. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
  147. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  148. package/examples/jsm/nodes/utils/PackingNode.js +2 -2
  149. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  150. package/examples/jsm/nodes/utils/RotateUVNode.js +2 -2
  151. package/examples/jsm/nodes/utils/SetNode.js +62 -0
  152. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +2 -2
  153. package/examples/jsm/nodes/utils/SplitNode.js +2 -2
  154. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +2 -2
  155. package/examples/jsm/nodes/utils/TimerNode.js +2 -2
  156. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +2 -2
  157. package/examples/jsm/objects/Sky.js +1 -3
  158. package/examples/jsm/postprocessing/FilmPass.js +3 -5
  159. package/examples/jsm/postprocessing/OutputPass.js +3 -2
  160. package/examples/jsm/postprocessing/RenderPass.js +30 -12
  161. package/examples/jsm/postprocessing/SAOPass.js +23 -98
  162. package/examples/jsm/postprocessing/SSAOPass.js +10 -30
  163. package/examples/jsm/renderers/common/Backend.js +11 -8
  164. package/examples/jsm/renderers/common/Background.js +2 -2
  165. package/examples/jsm/renderers/common/Binding.js +6 -0
  166. package/examples/jsm/renderers/common/Bindings.js +4 -5
  167. package/examples/jsm/renderers/common/Pipelines.js +9 -9
  168. package/examples/jsm/renderers/common/RenderContext.js +3 -0
  169. package/examples/jsm/renderers/common/RenderContexts.js +26 -1
  170. package/examples/jsm/renderers/common/RenderList.js +12 -4
  171. package/examples/jsm/renderers/common/RenderObject.js +43 -15
  172. package/examples/jsm/renderers/common/RenderObjects.js +8 -14
  173. package/examples/jsm/renderers/common/Renderer.js +52 -16
  174. package/examples/jsm/renderers/common/SampledTexture.js +6 -3
  175. package/examples/jsm/renderers/common/Sampler.js +1 -1
  176. package/examples/jsm/renderers/common/StorageBuffer.js +1 -1
  177. package/examples/jsm/renderers/common/StorageTexture.js +19 -0
  178. package/examples/jsm/renderers/common/Textures.js +166 -21
  179. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +35 -0
  180. package/examples/jsm/renderers/common/nodes/NodeSampledTexture.js +21 -11
  181. package/examples/jsm/renderers/common/nodes/NodeSampler.js +1 -7
  182. package/examples/jsm/renderers/common/nodes/Nodes.js +79 -18
  183. package/examples/jsm/renderers/webgl/WebGLBackend.js +702 -0
  184. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +207 -20
  185. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +84 -0
  186. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +26 -0
  187. package/examples/jsm/renderers/webgl/utils/WebGLState.js +529 -0
  188. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +212 -0
  189. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +242 -0
  190. package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +340 -0
  191. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodeBuilder.js +4 -4
  192. package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/WebGLNodes.js +14 -2
  193. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +282 -43
  194. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +18 -2
  195. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +93 -60
  196. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -2
  197. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +15 -2
  198. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -14
  199. package/examples/jsm/renderers/webgpu/utils/WebGPUTexturePassUtils.js +285 -0
  200. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +205 -284
  201. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +6 -5
  202. package/examples/jsm/shaders/FilmShader.js +11 -54
  203. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  204. package/examples/jsm/shaders/MMDToonShader.js +4 -4
  205. package/examples/jsm/shaders/OutputShader.js +2 -2
  206. package/examples/jsm/shaders/SAOShader.js +0 -13
  207. package/examples/jsm/shaders/SSAOShader.js +33 -26
  208. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +6 -6
  209. package/examples/jsm/utils/BufferGeometryUtils.js +6 -4
  210. package/package.json +1 -1
  211. package/src/Three.js +1 -2
  212. package/src/animation/AnimationUtils.js +3 -20
  213. package/src/animation/KeyframeTrack.js +8 -8
  214. package/src/audio/Audio.js +6 -0
  215. package/src/cameras/Camera.js +1 -5
  216. package/src/cameras/CubeCamera.js +14 -8
  217. package/src/constants.js +10 -1
  218. package/src/core/Object3D.js +1 -14
  219. package/src/core/RenderTarget.js +16 -7
  220. package/src/core/UniformsGroup.js +2 -2
  221. package/src/extras/core/CurvePath.js +4 -1
  222. package/src/loaders/DataTextureLoader.js +0 -2
  223. package/src/loaders/MaterialLoader.js +1 -1
  224. package/src/loaders/ObjectLoader.js +6 -0
  225. package/src/materials/Material.js +10 -10
  226. package/src/math/Color.js +1 -5
  227. package/src/math/ColorManagement.js +82 -60
  228. package/src/math/Vector2.js +2 -2
  229. package/src/math/Vector3.js +3 -3
  230. package/src/math/Vector4.js +4 -4
  231. package/src/objects/Line.js +1 -1
  232. package/src/objects/Mesh.js +1 -1
  233. package/src/objects/Points.js +1 -1
  234. package/src/objects/Sprite.js +2 -2
  235. package/src/renderers/WebGLRenderer.js +42 -51
  236. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +1 -1
  237. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +1 -1
  238. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +35 -2
  239. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -9
  240. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +19 -15
  241. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +2 -2
  242. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +4 -4
  243. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +3 -3
  244. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +11 -6
  245. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +4 -4
  246. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +1 -1
  247. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +16 -16
  248. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +3 -3
  249. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +11 -1
  250. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +1 -1
  251. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -0
  252. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -1
  253. package/src/renderers/shaders/UniformsUtils.js +2 -2
  254. package/src/renderers/webgl/WebGLBackground.js +9 -17
  255. package/src/renderers/webgl/WebGLLights.js +14 -3
  256. package/src/renderers/webgl/WebGLProgram.js +36 -5
  257. package/src/renderers/webgl/WebGLPrograms.js +9 -1
  258. package/src/renderers/webgl/WebGLTextures.js +19 -8
  259. package/src/renderers/webgl/WebGLUtils.js +25 -20
  260. package/src/scenes/Fog.js +1 -0
  261. package/src/scenes/FogExp2.js +1 -0
  262. package/src/textures/Source.js +2 -2
  263. package/src/textures/Texture.js +2 -2
  264. package/src/utils.js +9 -1
  265. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureMipmapUtils.js +0 -163
  266. package/src/lights/AmbientLightProbe.js +0 -21
  267. package/src/lights/HemisphereLightProbe.js +0 -30
  268. /package/examples/jsm/renderers/{webgl → webgl-legacy}/nodes/SlotNode.js +0 -0
@@ -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,21 @@ class Node extends EventDispatcher {
28
28
 
29
29
  get type() {
30
30
 
31
- return this.constructor.name;
31
+ return this.constructor.type;
32
+
33
+ }
34
+
35
+ getSelf() {
36
+
37
+ // Returns non-node object.
38
+
39
+ return this.self || this;
40
+
41
+ }
42
+
43
+ updateReference() {
44
+
45
+ return this;
32
46
 
33
47
  }
34
48
 
@@ -97,13 +111,21 @@ class Node extends EventDispatcher {
97
111
 
98
112
  }
99
113
 
100
- getNodeType( /*builder*/ ) {
114
+ getNodeType( builder ) {
115
+
116
+ const nodeProperties = builder.getNodeProperties( this );
117
+
118
+ if ( nodeProperties.outputNode ) {
119
+
120
+ return nodeProperties.outputNode.getNodeType( builder );
121
+
122
+ }
101
123
 
102
124
  return this.nodeType;
103
125
 
104
126
  }
105
127
 
106
- getReference( builder ) {
128
+ getShared( builder ) {
107
129
 
108
130
  const hash = this.getHash( builder );
109
131
  const nodeFromHash = builder.getNodeFromHash( hash );
@@ -112,7 +134,7 @@ class Node extends EventDispatcher {
112
134
 
113
135
  }
114
136
 
115
- construct( builder ) {
137
+ setup( builder ) {
116
138
 
117
139
  const nodeProperties = builder.getNodeProperties( this );
118
140
 
@@ -127,6 +149,14 @@ class Node extends EventDispatcher {
127
149
 
128
150
  }
129
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
+
130
160
  analyze( builder ) {
131
161
 
132
162
  const nodeData = builder.getDataFromNode( this );
@@ -178,7 +208,7 @@ class Node extends EventDispatcher {
178
208
 
179
209
  build( builder, output = null ) {
180
210
 
181
- const refNode = this.getReference( builder );
211
+ const refNode = this.getShared( builder );
182
212
 
183
213
  if ( this !== refNode ) {
184
214
 
@@ -190,7 +220,7 @@ class Node extends EventDispatcher {
190
220
  builder.addChain( this );
191
221
 
192
222
  /* Build stages expected results:
193
- - "construct" -> Node
223
+ - "setup" -> Node
194
224
  - "analyze" -> null
195
225
  - "generate" -> String
196
226
  */
@@ -198,18 +228,18 @@ class Node extends EventDispatcher {
198
228
 
199
229
  const buildStage = builder.getBuildStage();
200
230
 
201
- if ( buildStage === 'construct' ) {
231
+ if ( buildStage === 'setup' ) {
202
232
 
203
233
  const properties = builder.getNodeProperties( this );
204
234
 
205
235
  if ( properties.initialized !== true || builder.context.tempRead === false ) {
206
236
 
207
- const stackNodesBeforeConstruct = builder.stack.nodes.length;
237
+ const stackNodesBeforeSetup = builder.stack.nodes.length;
208
238
 
209
239
  properties.initialized = true;
210
- properties.outputNode = this.construct( builder );
240
+ properties.outputNode = this.setup( builder );
211
241
 
212
- if ( properties.outputNode !== null && builder.stack.nodes.length !== stackNodesBeforeConstruct ) {
242
+ if ( properties.outputNode !== null && builder.stack.nodes.length !== stackNodesBeforeSetup ) {
213
243
 
214
244
  properties.outputNode = builder.stack;
215
245
 
@@ -432,12 +462,13 @@ class Node extends EventDispatcher {
432
462
 
433
463
  export default Node;
434
464
 
435
- export function addNodeClass( nodeClass ) {
465
+ export function addNodeClass( type, nodeClass ) {
436
466
 
437
- if ( typeof nodeClass !== 'function' || ! nodeClass.name ) throw new Error( `Node class ${ nodeClass.name } is not a class` );
438
- 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 }` );
439
469
 
440
- NodeClasses.set( nodeClass.name, nodeClass );
470
+ NodeClasses.set( type, nodeClass );
471
+ nodeClass.type = type;
441
472
 
442
473
  }
443
474
 
@@ -8,11 +8,18 @@ import NodeCache from './NodeCache.js';
8
8
  import { createNodeMaterialFromType } from '../materials/NodeMaterial.js';
9
9
  import { NodeUpdateType, defaultBuildStages, shaderStages } from './constants.js';
10
10
 
11
- import { REVISION, NoColorSpace, LinearEncoding, sRGBEncoding, SRGBColorSpace, Color, Vector2, Vector3, Vector4, Float16BufferAttribute } from 'three';
11
+ import {
12
+ FloatNodeUniform, Vector2NodeUniform, Vector3NodeUniform, Vector4NodeUniform,
13
+ ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
14
+ } from '../../renderers/common/nodes/NodeUniform.js';
15
+
16
+ import { REVISION, RenderTarget, NoColorSpace, LinearEncoding, sRGBEncoding, SRGBColorSpace, Color, Vector2, Vector3, Vector4, Float16BufferAttribute } from 'three';
12
17
 
13
18
  import { stack } from './StackNode.js';
14
19
  import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
15
20
 
21
+ import CubeRenderTarget from '../../renderers/common/CubeRenderTarget.js';
22
+
16
23
  const typeFromLength = new Map( [
17
24
  [ 2, 'vec2' ],
18
25
  [ 3, 'vec3' ],
@@ -43,10 +50,10 @@ const toFloat = ( value ) => {
43
50
 
44
51
  class NodeBuilder {
45
52
 
46
- constructor( object, renderer, parser, scene = null ) {
53
+ constructor( object, renderer, parser, scene = null, material = null ) {
47
54
 
48
55
  this.object = object;
49
- this.material = ( object && object.material ) || null;
56
+ this.material = material || ( object && object.material ) || null;
50
57
  this.geometry = ( object && object.geometry ) || null;
51
58
  this.renderer = renderer;
52
59
  this.parser = parser;
@@ -69,6 +76,7 @@ class NodeBuilder {
69
76
  this.flowNodes = { vertex: [], fragment: [], compute: [] };
70
77
  this.flowCode = { vertex: '', fragment: '', compute: [] };
71
78
  this.uniforms = { vertex: [], fragment: [], compute: [], index: 0 };
79
+ this.structs = { vertex: [], fragment: [], compute: [], index: 0 };
72
80
  this.codes = { vertex: [], fragment: [], compute: [] };
73
81
  this.bindings = { vertex: [], fragment: [], compute: [] };
74
82
  this.bindingsOffset = { vertex: 0, fragment: 0, compute: 0 };
@@ -98,6 +106,18 @@ class NodeBuilder {
98
106
 
99
107
  }
100
108
 
109
+ getRenderTarget( width, height, options ) {
110
+
111
+ return new RenderTarget( width, height, options );
112
+
113
+ }
114
+
115
+ getCubeRenderTarget( size, options ) {
116
+
117
+ return new CubeRenderTarget( size, options );
118
+
119
+ }
120
+
101
121
  includes( node ) {
102
122
 
103
123
  return this.nodes.includes( node );
@@ -128,14 +148,26 @@ class NodeBuilder {
128
148
 
129
149
  addNode( node ) {
130
150
 
131
- if ( this.nodes.indexOf( node ) === - 1 ) {
151
+ if ( this.nodes.includes( node ) === false ) {
152
+
153
+ this.nodes.push( node );
154
+
155
+ this.setHashNode( node, node.getHash( this ) );
156
+
157
+ }
158
+
159
+ }
160
+
161
+ buildUpdateNodes() {
162
+
163
+ for ( const node of this.nodes ) {
132
164
 
133
165
  const updateType = node.getUpdateType();
134
166
  const updateBeforeType = node.getUpdateBeforeType();
135
167
 
136
168
  if ( updateType !== NodeUpdateType.NONE ) {
137
169
 
138
- this.updateNodes.push( node );
170
+ this.updateNodes.push( node.getSelf() );
139
171
 
140
172
  }
141
173
 
@@ -145,10 +177,6 @@ class NodeBuilder {
145
177
 
146
178
  }
147
179
 
148
- this.nodes.push( node );
149
-
150
- this.setHashNode( node, node.getHash( this ) );
151
-
152
180
  }
153
181
 
154
182
  }
@@ -331,6 +359,8 @@ class NodeBuilder {
331
359
 
332
360
  getType( type ) {
333
361
 
362
+ if ( type === 'color' ) return 'vec3';
363
+
334
364
  return type;
335
365
 
336
366
  }
@@ -561,17 +591,19 @@ class NodeBuilder {
561
591
 
562
592
  if ( nodeData === undefined ) {
563
593
 
564
- nodeData = { vertex: {}, fragment: {}, compute: {} };
594
+ nodeData = {};
565
595
 
566
596
  cache.setNodeData( node, nodeData );
567
597
 
568
598
  }
569
599
 
570
- return shaderStage !== null ? nodeData[ shaderStage ] : nodeData;
600
+ if ( nodeData[ shaderStage ] === undefined ) nodeData[ shaderStage ] = {};
601
+
602
+ return nodeData[ shaderStage ];
571
603
 
572
604
  }
573
605
 
574
- getNodeProperties( node, shaderStage = this.shaderStage ) {
606
+ getNodeProperties( node, shaderStage = 'any' ) {
575
607
 
576
608
  const nodeData = this.getDataFromNode( node, shaderStage );
577
609
 
@@ -601,6 +633,27 @@ class NodeBuilder {
601
633
 
602
634
  }
603
635
 
636
+ getStructTypeFromNode( node, shaderStage = this.shaderStage, name = null ) {
637
+
638
+ const nodeData = this.getDataFromNode( node, shaderStage );
639
+
640
+ let nodeStruct = nodeData.structType;
641
+
642
+ if ( nodeStruct === undefined ) {
643
+
644
+ const index = this.structs.index ++;
645
+
646
+ node.name = `StructType${index}`;
647
+ this.structs[ shaderStage ].push( node );
648
+
649
+ nodeData.structType = node;
650
+
651
+ }
652
+
653
+ return node;
654
+
655
+ }
656
+
604
657
  getUniformFromNode( node, type, shaderStage = this.shaderStage, name = null ) {
605
658
 
606
659
  const nodeData = this.getDataFromNode( node, shaderStage );
@@ -648,7 +701,7 @@ class NodeBuilder {
648
701
 
649
702
  getVaryingFromNode( node, type ) {
650
703
 
651
- const nodeData = this.getDataFromNode( node, null );
704
+ const nodeData = this.getDataFromNode( node, 'any' );
652
705
 
653
706
  let nodeVarying = nodeData.varying;
654
707
 
@@ -812,7 +865,7 @@ class NodeBuilder {
812
865
 
813
866
  getVar( type, name ) {
814
867
 
815
- return `${type} ${name}`;
868
+ return `${ this.getType( type ) } ${ name }`;
816
869
 
817
870
  }
818
871
 
@@ -892,7 +945,7 @@ class NodeBuilder {
892
945
 
893
946
  build() {
894
947
 
895
- // 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
896
949
  // analyze() -> stage 2: analyze nodes to possible optimization and validation
897
950
  // generate() -> stage 3: generate shader
898
951
 
@@ -936,11 +989,26 @@ class NodeBuilder {
936
989
  // stage 4: build code for a specific output
937
990
 
938
991
  this.buildCode();
992
+ this.buildUpdateNodes();
939
993
 
940
994
  return this;
941
995
 
942
996
  }
943
997
 
998
+ getNodeUniform( uniformNode, type ) {
999
+
1000
+ if ( type === 'float' ) return new FloatNodeUniform( uniformNode );
1001
+ if ( type === 'vec2' ) return new Vector2NodeUniform( uniformNode );
1002
+ if ( type === 'vec3' ) return new Vector3NodeUniform( uniformNode );
1003
+ if ( type === 'vec4' ) return new Vector4NodeUniform( uniformNode );
1004
+ if ( type === 'color' ) return new ColorNodeUniform( uniformNode );
1005
+ if ( type === 'mat3' ) return new Matrix3NodeUniform( uniformNode );
1006
+ if ( type === 'mat4' ) return new Matrix4NodeUniform( uniformNode );
1007
+
1008
+ throw new Error( `Uniform "${type}" not declared.` );
1009
+
1010
+ }
1011
+
944
1012
  createNodeMaterial( type ) {
945
1013
 
946
1014
  return createNodeMaterialFromType( type );
@@ -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
 
@@ -6,7 +6,7 @@ class NodeUniform {
6
6
 
7
7
  this.name = name;
8
8
  this.type = type;
9
- this.node = node;
9
+ this.node = node.getSelf();
10
10
  this.needsUpdate = needsUpdate;
11
11
 
12
12
  }
@@ -0,0 +1,62 @@
1
+ import Node, { addNodeClass } from './Node.js';
2
+ import StructTypeNode from './StructTypeNode.js';
3
+ import { nodeProxy } from '../shadernode/ShaderNode.js';
4
+
5
+ class OutputStructNode extends Node {
6
+
7
+ constructor( ...members ) {
8
+
9
+ super();
10
+
11
+ this.isOutputStructNode = true;
12
+ this.members = members;
13
+
14
+ }
15
+
16
+ setup( builder ) {
17
+
18
+ super.setup( builder );
19
+
20
+ const members = this.members;
21
+ const types = [];
22
+
23
+ for ( let i = 0; i < members.length; i++ ) {
24
+
25
+ types.push( members[ i ].getNodeType( builder ) );
26
+
27
+ }
28
+
29
+ this.nodeType = builder.getStructTypeFromNode( new StructTypeNode( types ) ).name;
30
+
31
+ }
32
+
33
+ generate( builder, output ) {
34
+
35
+ const nodeVar = builder.getVarFromNode( this, this.nodeType );
36
+ nodeVar.isOutputStructVar = true;
37
+
38
+ const propertyName = builder.getPropertyName( nodeVar );
39
+
40
+ const members = this.members;
41
+
42
+ const structPrefix = propertyName !== '' ? propertyName + '.' : '';
43
+
44
+ for ( let i = 0; i < members.length; i++ ) {
45
+
46
+ const snippet = members[ i ].build( builder, output );
47
+
48
+ builder.addLineFlowCode( `${structPrefix}m${i} = ${snippet}` );
49
+
50
+ }
51
+
52
+ return propertyName;
53
+
54
+ }
55
+
56
+ }
57
+
58
+ export default OutputStructNode;
59
+
60
+ export const outputStruct = nodeProxy( OutputStructNode );
61
+
62
+ addNodeClass( 'OutputStructNode', OutputStructNode );
@@ -57,5 +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', 'dashSize' );
61
+ export const gapSize = nodeImmutable( PropertyNode, 'float', 'gapSize' );
60
62
 
61
- addNodeClass( PropertyNode );
63
+ addNodeClass( 'PropertyNode', PropertyNode );
@@ -4,7 +4,7 @@ import { bypass } from '../core/BypassNode.js';
4
4
  import { expression } from '../code/ExpressionNode.js';
5
5
  import { cond } from '../math/CondNode.js';
6
6
  import { loop } from '../utils/LoopNode.js';
7
- import { nodeProxy, shader } from '../shadernode/ShaderNode.js';
7
+ import { ShaderNode, nodeProxy } from '../shadernode/ShaderNode.js';
8
8
 
9
9
  class StackNode extends Node {
10
10
 
@@ -39,7 +39,7 @@ class StackNode extends Node {
39
39
 
40
40
  if( boolNode, method ) {
41
41
 
42
- const methodNode = shader( method );
42
+ const methodNode = new ShaderNode( method );
43
43
  this._currentCond = cond( boolNode, methodNode );
44
44
 
45
45
  return this.add( this._currentCond );
@@ -48,7 +48,7 @@ class StackNode extends Node {
48
48
 
49
49
  elseif( boolNode, method ) {
50
50
 
51
- const methodNode = shader( method );
51
+ const methodNode = new ShaderNode( method );
52
52
  const ifNode = cond( boolNode, methodNode );
53
53
 
54
54
  this._currentCond.elseNode = ifNode;
@@ -60,7 +60,7 @@ class StackNode extends Node {
60
60
 
61
61
  else( method ) {
62
62
 
63
- this._currentCond.elseNode = shader( method );
63
+ this._currentCond.elseNode = new ShaderNode( method );
64
64
 
65
65
  return this;
66
66
 
@@ -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 );
@@ -0,0 +1,24 @@
1
+ import Node, { addNodeClass } from './Node.js';
2
+
3
+ class StructTypeNode extends Node {
4
+
5
+ constructor( types ) {
6
+
7
+ super();
8
+
9
+ this.types = types;
10
+ this.isStructTypeNode = true;
11
+
12
+ }
13
+
14
+ getMemberTypes() {
15
+
16
+ return this.types;
17
+
18
+ }
19
+
20
+ }
21
+
22
+ export default StructTypeNode;
23
+
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 );