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
@@ -16,6 +16,7 @@ import { lightsWithoutWrap } from '../lighting/LightsNode.js';
16
16
  import { mix, dFdx, dFdy } from '../math/MathNode.js';
17
17
  import { float, vec3, vec4 } from '../shadernode/ShaderNode.js';
18
18
  import AONode from '../lighting/AONode.js';
19
+ import { lightingContext } from '../lighting/LightingContextNode.js';
19
20
  import EnvironmentNode from '../lighting/EnvironmentNode.js';
20
21
 
21
22
  const NodeMaterials = new Map();
@@ -28,7 +29,7 @@ class NodeMaterial extends ShaderMaterial {
28
29
 
29
30
  this.isNodeMaterial = true;
30
31
 
31
- this.type = this.constructor.name;
32
+ this.type = this.constructor.type;
32
33
 
33
34
  this.forceSinglePass = false;
34
35
 
@@ -64,17 +65,17 @@ class NodeMaterial extends ShaderMaterial {
64
65
 
65
66
  build( builder ) {
66
67
 
67
- this.construct( builder );
68
+ this.setup( builder );
68
69
 
69
70
  }
70
71
 
71
- construct( builder ) {
72
+ setup( builder ) {
72
73
 
73
74
  // < VERTEX STAGE >
74
75
 
75
76
  builder.addStack();
76
77
 
77
- builder.stack.outputNode = this.constructPosition( builder );
78
+ builder.stack.outputNode = this.setupPosition( builder );
78
79
 
79
80
  builder.addFlow( 'vertex', builder.removeStack() );
80
81
 
@@ -86,14 +87,14 @@ class NodeMaterial extends ShaderMaterial {
86
87
 
87
88
  if ( this.unlit === false ) {
88
89
 
89
- if ( this.normals === true ) this.constructNormal( builder );
90
+ if ( this.normals === true ) this.setupNormal( builder );
90
91
 
91
- this.constructDiffuseColor( builder );
92
- this.constructVariants( builder );
92
+ this.setupDiffuseColor( builder );
93
+ this.setupVariants( builder );
93
94
 
94
- const outgoingLightNode = this.constructLighting( builder );
95
+ const outgoingLightNode = this.setupLighting( builder );
95
96
 
96
- outputNode = this.constructOutput( builder, vec4( outgoingLightNode, diffuseColor.a ) );
97
+ outputNode = this.setupOutput( builder, vec4( outgoingLightNode, diffuseColor.a ) );
97
98
 
98
99
  // OUTPUT NODE
99
100
 
@@ -105,7 +106,7 @@ class NodeMaterial extends ShaderMaterial {
105
106
 
106
107
  } else {
107
108
 
108
- outputNode = this.constructOutput( builder, this.outputNode || vec4( 0, 0, 0, 1 ) );
109
+ outputNode = this.setupOutput( builder, this.outputNode || vec4( 0, 0, 0, 1 ) );
109
110
 
110
111
  }
111
112
 
@@ -115,7 +116,7 @@ class NodeMaterial extends ShaderMaterial {
115
116
 
116
117
  }
117
118
 
118
- constructPosition( builder ) {
119
+ setupPosition( builder ) {
119
120
 
120
121
  const object = builder.object;
121
122
  const geometry = object.geometry;
@@ -152,7 +153,7 @@ class NodeMaterial extends ShaderMaterial {
152
153
 
153
154
  }
154
155
 
155
- constructDiffuseColor( { stack, geometry } ) {
156
+ setupDiffuseColor( { stack, geometry } ) {
156
157
 
157
158
  let colorNode = this.colorNode ? vec4( this.colorNode ) : materialColor;
158
159
 
@@ -185,20 +186,20 @@ class NodeMaterial extends ShaderMaterial {
185
186
 
186
187
  }
187
188
 
188
- constructVariants( /*builder*/ ) {
189
+ setupVariants( /*builder*/ ) {
189
190
 
190
191
  // Interface function.
191
192
 
192
193
  }
193
194
 
194
- constructNormal( { stack } ) {
195
+ setupNormal( { stack } ) {
195
196
 
196
197
  // NORMAL VIEW
197
198
 
198
199
  if ( this.flatShading === true ) {
199
200
 
200
201
  const fdx = dFdx( positionView );
201
- const fdy = dFdy( positionView.negate() ); // use -positionView ?
202
+ const fdy = dFdy( positionView );
202
203
  const normalNode = fdx.cross( fdy ).normalize();
203
204
 
204
205
  stack.assign( transformedNormalView, normalNode );
@@ -235,7 +236,7 @@ class NodeMaterial extends ShaderMaterial {
235
236
 
236
237
  }
237
238
 
238
- constructLights( builder ) {
239
+ setupLights( builder ) {
239
240
 
240
241
  const envNode = this.getEnvNode( builder );
241
242
 
@@ -267,13 +268,13 @@ class NodeMaterial extends ShaderMaterial {
267
268
 
268
269
  }
269
270
 
270
- constructLightingModel( /*builder*/ ) {
271
+ setupLightingModel( /*builder*/ ) {
271
272
 
272
273
  // Interface function.
273
274
 
274
275
  }
275
276
 
276
- constructLighting( builder ) {
277
+ setupLighting( builder ) {
277
278
 
278
279
  const { material } = builder;
279
280
  const { backdropNode, backdropAlphaNode, emissiveNode } = this;
@@ -282,15 +283,15 @@ class NodeMaterial extends ShaderMaterial {
282
283
 
283
284
  const lights = this.lights === true || this.lightsNode !== null;
284
285
 
285
- const lightsNode = lights ? this.constructLights( builder ) : null;
286
+ const lightsNode = lights ? this.setupLights( builder ) : null;
286
287
 
287
288
  let outgoingLightNode = diffuseColor.rgb;
288
289
 
289
290
  if ( lightsNode && lightsNode.hasLight !== false ) {
290
291
 
291
- const lightingModelNode = this.constructLightingModel( builder );
292
+ const lightingModelNode = this.setupLightingModel( builder );
292
293
 
293
- outgoingLightNode = lightsNode.lightingContext( lightingModelNode, backdropNode, backdropAlphaNode );
294
+ outgoingLightNode = lightingContext( lightsNode, lightingModelNode, backdropNode, backdropAlphaNode );
294
295
 
295
296
  } else if ( backdropNode !== null ) {
296
297
 
@@ -302,7 +303,7 @@ class NodeMaterial extends ShaderMaterial {
302
303
 
303
304
  if ( ( emissiveNode && emissiveNode.isNode === true ) || ( material.emissive && material.emissive.isColor === true ) ) {
304
305
 
305
- outgoingLightNode = outgoingLightNode.add( emissiveNode ? vec3( emissiveNode ) : materialEmissive );
306
+ outgoingLightNode = outgoingLightNode.add( vec3( emissiveNode ? emissiveNode : materialEmissive ) );
306
307
 
307
308
  }
308
309
 
@@ -310,7 +311,7 @@ class NodeMaterial extends ShaderMaterial {
310
311
 
311
312
  }
312
313
 
313
- constructOutput( builder, outputNode ) {
314
+ setupOutput( builder, outputNode ) {
314
315
 
315
316
  const renderer = builder.renderer;
316
317
 
@@ -344,7 +345,15 @@ class NodeMaterial extends ShaderMaterial {
344
345
 
345
346
  if ( renderTarget !== null ) {
346
347
 
347
- outputColorSpace = renderTarget.texture.colorSpace;
348
+ if ( Array.isArray( renderTarget.texture ) ) {
349
+
350
+ outputColorSpace = renderTarget.texture[ 0 ].colorSpace;
351
+
352
+ } else {
353
+
354
+ outputColorSpace = renderTarget.texture.colorSpace;
355
+
356
+ }
348
357
 
349
358
  } else {
350
359
 
@@ -512,12 +521,13 @@ class NodeMaterial extends ShaderMaterial {
512
521
 
513
522
  export default NodeMaterial;
514
523
 
515
- export function addNodeMaterial( nodeMaterial ) {
524
+ export function addNodeMaterial( type, nodeMaterial ) {
516
525
 
517
- if ( typeof nodeMaterial !== 'function' || ! nodeMaterial.name ) throw new Error( `Node material ${ nodeMaterial.name } is not a class` );
518
- if ( NodeMaterials.has( nodeMaterial.name ) ) throw new Error( `Redefinition of node material ${ nodeMaterial.name }` );
526
+ if ( typeof nodeMaterial !== 'function' || ! type ) throw new Error( `Node material ${ type } is not a class` );
527
+ if ( NodeMaterials.has( type ) ) throw new Error( `Redefinition of node material ${ type }` );
519
528
 
520
- NodeMaterials.set( nodeMaterial.name, nodeMaterial );
529
+ NodeMaterials.set( type, nodeMaterial );
530
+ nodeMaterial.type = type;
521
531
 
522
532
  }
523
533
 
@@ -533,4 +543,4 @@ export function createNodeMaterialFromType( type ) {
533
543
 
534
544
  }
535
545
 
536
- addNodeMaterial( NodeMaterial );
546
+ addNodeMaterial( 'NodeMaterial', NodeMaterial );
@@ -46,4 +46,4 @@ class PointsNodeMaterial extends NodeMaterial {
46
46
 
47
47
  export default PointsNodeMaterial;
48
48
 
49
- addNodeMaterial( PointsNodeMaterial );
49
+ addNodeMaterial( 'PointsNodeMaterial', PointsNodeMaterial );
@@ -38,7 +38,7 @@ class SpriteNodeMaterial extends NodeMaterial {
38
38
 
39
39
  }
40
40
 
41
- constructPosition( { object, context } ) {
41
+ setupPosition( { object, context } ) {
42
42
 
43
43
  // < VERTEX STAGE >
44
44
 
@@ -100,4 +100,4 @@ class SpriteNodeMaterial extends NodeMaterial {
100
100
 
101
101
  export default SpriteNodeMaterial;
102
102
 
103
- addNodeMaterial( SpriteNodeMaterial );
103
+ addNodeMaterial( 'SpriteNodeMaterial', SpriteNodeMaterial );
@@ -83,4 +83,4 @@ export const cond = nodeProxy( CondNode );
83
83
 
84
84
  addNodeElement( 'cond', cond );
85
85
 
86
- addNodeClass( CondNode );
86
+ addNodeClass( 'CondNode', CondNode );
@@ -0,0 +1,34 @@
1
+ import Node, { addNodeClass } from '../core/Node.js';
2
+ import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
3
+
4
+ class HashNode extends Node {
5
+
6
+ constructor( seedNode ) {
7
+
8
+ super();
9
+
10
+ this.seedNode = seedNode;
11
+
12
+ }
13
+
14
+ setup( /*builder*/ ) {
15
+
16
+ // Taken from https://www.shadertoy.com/view/XlGcRh, originally from pcg-random.org
17
+
18
+ const state = this.seedNode.uint().mul( 747796405 ).add( 2891336453 );
19
+ const word = state.shiftRight( state.shiftRight( 28 ).add( 4 ) ).bitXor( state ).mul( 277803737 );
20
+ const result = word.shiftRight( 22 ).bitXor( word );
21
+
22
+ return result.float().mul( 1 / 2 ** 32 ); // Convert to range [0, 1)
23
+
24
+ }
25
+
26
+ }
27
+
28
+ export default HashNode;
29
+
30
+ export const hash = nodeProxy( HashNode );
31
+
32
+ addNodeElement( 'hash', hash );
33
+
34
+ addNodeClass( 'HashNode', HashNode );
@@ -102,7 +102,7 @@ class MathNode extends TempNode {
102
102
 
103
103
  } else if ( method === MathNode.NEGATE ) {
104
104
 
105
- return builder.format( '-' + a.build( builder, inputType ), type, output );
105
+ return builder.format( '( - ' + a.build( builder, inputType ) + ' )', type, output );
106
106
 
107
107
  } else if ( method === MathNode.ONE_MINUS ) {
108
108
 
@@ -356,4 +356,4 @@ addNodeElement( 'faceForward', faceForward );
356
356
  addNodeElement( 'difference', difference );
357
357
  addNodeElement( 'saturate', saturate );
358
358
 
359
- addNodeClass( MathNode );
359
+ addNodeClass( 'MathNode', MathNode );
@@ -266,4 +266,4 @@ addNodeElement( 'bitXor', bitXor );
266
266
  addNodeElement( 'shiftLeft', shiftLeft );
267
267
  addNodeElement( 'shiftRight', shiftRight );
268
268
 
269
- addNodeClass( OperatorNode );
269
+ addNodeClass( 'OperatorNode', OperatorNode );
@@ -25,9 +25,9 @@ class CheckerNode extends TempNode {
25
25
 
26
26
  }
27
27
 
28
- generate( builder ) {
28
+ setup() {
29
29
 
30
- return checkerShaderNode( { uv: this.uvNode } ).build( builder );
30
+ return checkerShaderNode( { uv: this.uvNode } );
31
31
 
32
32
  }
33
33
 
@@ -39,4 +39,4 @@ export const checker = nodeProxy( CheckerNode );
39
39
 
40
40
  addNodeElement( 'checker', checker );
41
41
 
42
- addNodeClass( CheckerNode );
42
+ addNodeClass( 'CheckerNode', CheckerNode );
@@ -3,6 +3,7 @@ import ArrayElementNode from '../utils/ArrayElementNode.js';
3
3
  import ConvertNode from '../utils/ConvertNode.js';
4
4
  import JoinNode from '../utils/JoinNode.js';
5
5
  import SplitNode from '../utils/SplitNode.js';
6
+ import SetNode from '../utils/SetNode.js';
6
7
  import ConstNode from '../core/ConstNode.js';
7
8
  import { getValueFromType, getValueType } from '../core/NodeUtils.js';
8
9
 
@@ -17,9 +18,11 @@ export function addNodeElement( name, nodeElement ) {
17
18
 
18
19
  }
19
20
 
21
+ const parseSwizzle = ( props ) => props.replace( /r|s/g, 'x' ).replace( /g|t/g, 'y' ).replace( /b|p/g, 'z' ).replace( /a|q/g, 'w' );
22
+
20
23
  const shaderNodeHandler = {
21
24
 
22
- construct( NodeClosure, params ) {
25
+ setup( NodeClosure, params ) {
23
26
 
24
27
  const inputs = params.shift();
25
28
 
@@ -37,6 +40,10 @@ const shaderNodeHandler = {
37
40
 
38
41
  return ( ...params ) => nodeElement( nodeObj, ...params );
39
42
 
43
+ } else if ( prop === 'self' ) {
44
+
45
+ return node;
46
+
40
47
  } else if ( prop.endsWith( 'Assign' ) && NodeElements.has( prop.slice( 0, prop.length - 'Assign'.length ) ) ) {
41
48
 
42
49
  const nodeElement = NodeElements.get( prop.slice( 0, prop.length - 'Assign'.length ) );
@@ -47,19 +54,31 @@ const shaderNodeHandler = {
47
54
 
48
55
  // accessing properties ( swizzle )
49
56
 
50
- prop = prop
51
- .replace( /r|s/g, 'x' )
52
- .replace( /g|t/g, 'y' )
53
- .replace( /b|p/g, 'z' )
54
- .replace( /a|q/g, 'w' );
57
+ prop = parseSwizzle( prop );
55
58
 
56
59
  return nodeObject( new SplitNode( node, prop ) );
57
60
 
58
- } else if ( prop === 'width' || prop === 'height' ) {
61
+ } else if ( /^set[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
62
+
63
+ // set properties ( swizzle )
64
+
65
+ prop = parseSwizzle( prop.slice( 3 ).toLowerCase() );
66
+
67
+ // sort to xyzw sequence
68
+
69
+ prop = prop.split( '' ).sort().join( '' );
70
+
71
+ return ( value ) => nodeObject( new SetNode( node, prop, value ) );
72
+
73
+ } else if ( prop === 'width' || prop === 'height' || prop === 'depth' ) {
59
74
 
60
75
  // accessing property
61
76
 
62
- return nodeObject( new SplitNode( node, prop === 'width' ? 'x' : 'y' ) );
77
+ if ( prop === 'width' ) prop = 'x';
78
+ else if ( prop === 'height' ) prop = 'y';
79
+ else if ( prop === 'depth' ) prop = 'z';
80
+
81
+ return nodeObject( new SplitNode( node, prop ) );
63
82
 
64
83
  } else if ( /^\d+$/.test( prop ) === true ) {
65
84
 
@@ -177,42 +196,86 @@ const ShaderNodeImmutable = function ( NodeClass, ...params ) {
177
196
 
178
197
  };
179
198
 
180
- class ShaderNodeInternal extends Node {
199
+ class ShaderCallNodeInternal extends Node {
181
200
 
182
- constructor( jsFunc ) {
201
+ constructor( shaderNode, inputNodes ) {
183
202
 
184
203
  super();
185
204
 
186
- this._jsFunc = jsFunc;
205
+ this.shaderNode = shaderNode;
206
+ this.inputNodes = inputNodes;
187
207
 
188
208
  }
189
209
 
190
- call( inputs, stack, builder ) {
210
+ getNodeType( builder ) {
191
211
 
192
- inputs = nodeObjects( inputs );
212
+ const { outputNode } = builder.getNodeProperties( this );
193
213
 
194
- return nodeObject( this._jsFunc( inputs, stack, builder ) );
214
+ return outputNode ? outputNode.getNodeType( builder ) : super.getNodeType( builder );
195
215
 
196
216
  }
197
217
 
198
- getNodeType( builder ) {
218
+ call( builder ) {
199
219
 
200
- const { outputNode } = builder.getNodeProperties( this );
220
+ const { shaderNode, inputNodes } = this;
201
221
 
202
- return outputNode ? outputNode.getNodeType( builder ) : super.getNodeType( builder );
222
+ const jsFunc = shaderNode.jsFunc;
223
+ const outputNode = inputNodes !== null ? jsFunc( nodeObjects( inputNodes ), builder.stack, builder ) : jsFunc( builder.stack, builder );
224
+
225
+ return nodeObject( outputNode );
203
226
 
204
227
  }
205
228
 
206
- construct( builder ) {
229
+ setup( builder ) {
207
230
 
208
231
  builder.addStack();
209
232
 
210
- builder.stack.outputNode = nodeObject( this._jsFunc( builder.stack, builder ) );
233
+ builder.stack.outputNode = this.call( builder );
211
234
 
212
235
  return builder.removeStack();
213
236
 
214
237
  }
215
238
 
239
+ generate( builder, output ) {
240
+
241
+ const { outputNode } = builder.getNodeProperties( this );
242
+
243
+ if ( outputNode === null ) {
244
+
245
+ // TSL: It's recommended to use `tslFn` in setup() pass.
246
+
247
+ return this.call( builder ).build( builder, output );
248
+
249
+ }
250
+
251
+ return super.generate( builder, output );
252
+
253
+ }
254
+
255
+ }
256
+
257
+ class ShaderNodeInternal extends Node {
258
+
259
+ constructor( jsFunc ) {
260
+
261
+ super();
262
+
263
+ this.jsFunc = jsFunc;
264
+
265
+ }
266
+
267
+ call( inputs = null ) {
268
+
269
+ return nodeObject( new ShaderCallNodeInternal( this, inputs ) );
270
+
271
+ }
272
+
273
+ setup() {
274
+
275
+ return this.call();
276
+
277
+ }
278
+
216
279
  }
217
280
 
218
281
  const bools = [ false, true ];
@@ -330,19 +393,13 @@ export const shader = ( jsFunc ) => { // @deprecated, r154
330
393
 
331
394
  export const tslFn = ( jsFunc ) => {
332
395
 
333
- let shaderNode = null;
334
-
335
- return ( ...params ) => {
336
-
337
- if ( shaderNode === null ) shaderNode = new ShaderNode( jsFunc );
338
-
339
- return shaderNode.call( ...params );
396
+ const shaderNode = new ShaderNode( jsFunc );
340
397
 
341
- };
398
+ return ( inputs ) => shaderNode.call( inputs );
342
399
 
343
400
  };
344
401
 
345
- addNodeClass( ShaderNode );
402
+ addNodeClass( 'ShaderNode', ShaderNode );
346
403
 
347
404
  // types
348
405
  // @TODO: Maybe export from ConstNode.js?
@@ -30,4 +30,4 @@ class ArrayElementNode extends Node { // @TODO: If extending from TempNode it br
30
30
 
31
31
  export default ArrayElementNode;
32
32
 
33
- addNodeClass( ArrayElementNode );
33
+ addNodeClass( 'ArrayElementNode', ArrayElementNode );
@@ -62,4 +62,4 @@ class ConvertNode extends Node {
62
62
 
63
63
  export default ConvertNode;
64
64
 
65
- addNodeClass( ConvertNode );
65
+ addNodeClass( 'ConvertNode', ConvertNode );
@@ -23,4 +23,4 @@ export const discard = nodeProxy( DiscardNode );
23
23
 
24
24
  addNodeElement( 'discard', discard );
25
25
 
26
- addNodeClass( DiscardNode );
26
+ addNodeClass( 'DiscardNode', DiscardNode );
@@ -13,7 +13,7 @@ class EquirectUVNode extends TempNode {
13
13
 
14
14
  }
15
15
 
16
- construct() {
16
+ setup() {
17
17
 
18
18
  const dir = this.dirNode;
19
19
 
@@ -30,4 +30,4 @@ export default EquirectUVNode;
30
30
 
31
31
  export const equirectUV = nodeProxy( EquirectUVNode );
32
32
 
33
- addNodeClass( EquirectUVNode );
33
+ addNodeClass( 'EquirectUVNode', EquirectUVNode );
@@ -48,4 +48,4 @@ class JoinNode extends TempNode {
48
48
 
49
49
  export default JoinNode;
50
50
 
51
- addNodeClass( JoinNode );
51
+ addNodeClass( 'JoinNode', JoinNode );
@@ -1,7 +1,7 @@
1
1
  import Node, { addNodeClass } from '../core/Node.js';
2
2
  import { expression } from '../code/ExpressionNode.js';
3
3
  import { bypass } from '../core/BypassNode.js';
4
- import { context as contextNode } from '../core/ContextNode.js';
4
+ import { context } from '../core/ContextNode.js';
5
5
  import { addNodeElement, nodeObject, nodeArray } from '../shadernode/ShaderNode.js';
6
6
 
7
7
  class LoopNode extends Node {
@@ -53,9 +53,9 @@ class LoopNode extends Node {
53
53
 
54
54
  }
55
55
 
56
- construct( builder ) {
56
+ setup( builder ) {
57
57
 
58
- // construct properties
58
+ // setup properties
59
59
 
60
60
  this.getProperties( builder );
61
61
 
@@ -65,13 +65,11 @@ class LoopNode extends Node {
65
65
 
66
66
  const properties = this.getProperties( builder );
67
67
 
68
- const context = { tempWrite: false };
68
+ const contextData = { tempWrite: false };
69
69
 
70
70
  const params = this.params;
71
71
  const stackNode = properties.stackNode;
72
72
 
73
- const returnsSnippet = properties.returnsNode ? properties.returnsNode.build( builder ) : '';
74
-
75
73
  for ( let i = 0, l = params.length - 1; i < l; i ++ ) {
76
74
 
77
75
  const param = params[ i ];
@@ -82,7 +80,7 @@ class LoopNode extends Node {
82
80
  if ( param.isNode ) {
83
81
 
84
82
  start = '0';
85
- end = param.generate( builder, 'int' );
83
+ end = param.build( builder, 'int' );
86
84
  direction = 'forward';
87
85
 
88
86
  } else {
@@ -92,10 +90,10 @@ class LoopNode extends Node {
92
90
  direction = param.direction;
93
91
 
94
92
  if ( typeof start === 'number' ) start = start.toString();
95
- else if ( start && start.isNode ) start = start.generate( builder, 'int' );
93
+ else if ( start && start.isNode ) start = start.build( builder, 'int' );
96
94
 
97
95
  if ( typeof end === 'number' ) end = end.toString();
98
- else if ( end && end.isNode ) end = end.generate( builder, 'int' );
96
+ else if ( end && end.isNode ) end = end.build( builder, 'int' );
99
97
 
100
98
  if ( start !== undefined && end === undefined ) {
101
99
 
@@ -159,7 +157,9 @@ class LoopNode extends Node {
159
157
 
160
158
  }
161
159
 
162
- const stackSnippet = contextNode( stackNode, context ).build( builder, 'void' );
160
+ const stackSnippet = context( stackNode, contextData ).build( builder, 'void' );
161
+
162
+ const returnsSnippet = properties.returnsNode ? properties.returnsNode.build( builder ) : '';
163
163
 
164
164
  builder.removeFlowTab().addFlowCode( '\n' + builder.tab + stackSnippet );
165
165
 
@@ -183,4 +183,4 @@ export const loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params
183
183
 
184
184
  addNodeElement( 'loop', ( returns, ...params ) => bypass( returns, loop( ...params ) ) );
185
185
 
186
- addNodeClass( LoopNode );
186
+ addNodeClass( 'LoopNode', LoopNode );
@@ -12,7 +12,7 @@ class MatcapUVNode extends TempNode {
12
12
 
13
13
  }
14
14
 
15
- construct() {
15
+ setup() {
16
16
 
17
17
  const x = vec3( positionViewDirection.z, 0, positionViewDirection.x.negate() ).normalize();
18
18
  const y = positionViewDirection.cross( x );
@@ -27,4 +27,4 @@ export default MatcapUVNode;
27
27
 
28
28
  export const matcapUV = nodeImmutable( MatcapUVNode );
29
29
 
30
- addNodeClass( MatcapUVNode );
30
+ addNodeClass( 'MatcapUVNode', MatcapUVNode );
@@ -43,4 +43,4 @@ export default MaxMipLevelNode;
43
43
 
44
44
  export const maxMipLevel = nodeProxy( MaxMipLevelNode );
45
45
 
46
- addNodeClass( MaxMipLevelNode );
46
+ addNodeClass( 'MaxMipLevelNode', MaxMipLevelNode );
@@ -19,7 +19,7 @@ class OscNode extends Node {
19
19
 
20
20
  }
21
21
 
22
- construct() {
22
+ setup() {
23
23
 
24
24
  const method = this.method;
25
25
  const timeNode = nodeObject( this.timeNode );
@@ -78,4 +78,4 @@ export const oscSquare = nodeProxy( OscNode, OscNode.SQUARE );
78
78
  export const oscTriangle = nodeProxy( OscNode, OscNode.TRIANGLE );
79
79
  export const oscSawtooth = nodeProxy( OscNode, OscNode.SAWTOOTH );
80
80
 
81
- addNodeClass( OscNode );
81
+ addNodeClass( 'OscNode', OscNode );
@@ -19,7 +19,7 @@ class PackingNode extends TempNode {
19
19
 
20
20
  }
21
21
 
22
- construct() {
22
+ setup() {
23
23
 
24
24
  const { scope, node } = this;
25
25
 
@@ -52,4 +52,4 @@ export const colorToDirection = nodeProxy( PackingNode, PackingNode.COLOR_TO_DIR
52
52
  addNodeElement( 'directionToColor', directionToColor );
53
53
  addNodeElement( 'colorToDirection', colorToDirection );
54
54
 
55
- addNodeClass( PackingNode );
55
+ addNodeClass( 'PackingNode', PackingNode );