super-three 0.157.1 → 0.158.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +1013 -790
  3. package/build/three.js +1013 -790
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +1008 -791
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +290 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +12 -1
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +1 -1
  12. package/examples/jsm/exporters/GLTFExporter.js +72 -2
  13. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  14. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  15. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  16. package/examples/jsm/libs/opentype.module.js +13 -75
  17. package/examples/jsm/libs/surfaceNet.js +201 -0
  18. package/examples/jsm/loaders/GLTFLoader.js +12 -3
  19. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  20. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  22. package/examples/jsm/math/Capsule.js +0 -55
  23. package/examples/jsm/math/Octree.js +70 -3
  24. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  25. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  26. package/examples/jsm/nodes/Nodes.js +6 -6
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +3 -3
  28. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  29. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  30. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  31. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  32. package/examples/jsm/nodes/accessors/MorphNode.js +5 -5
  33. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  35. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  36. package/examples/jsm/nodes/accessors/TextureNode.js +3 -3
  37. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  38. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  39. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  40. package/examples/jsm/nodes/core/Node.js +7 -12
  41. package/examples/jsm/nodes/core/NodeBuilder.js +126 -16
  42. package/examples/jsm/nodes/core/NodeUtils.js +4 -2
  43. package/examples/jsm/nodes/core/OutputStructNode.js +1 -1
  44. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  45. package/examples/jsm/nodes/core/PropertyNode.js +4 -10
  46. package/examples/jsm/nodes/core/StackNode.js +7 -17
  47. package/examples/jsm/nodes/core/TempNode.js +1 -1
  48. package/examples/jsm/nodes/core/VarNode.js +6 -35
  49. package/examples/jsm/nodes/core/VaryingNode.js +2 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  51. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  52. package/examples/jsm/nodes/display/ViewportNode.js +14 -4
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  54. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  55. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  56. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  57. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  58. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  59. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  60. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  61. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  62. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  63. package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -6
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  65. package/examples/jsm/nodes/lighting/LightsNode.js +62 -4
  66. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  67. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  68. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  69. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +70 -71
  70. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  71. package/examples/jsm/nodes/materials/Materials.js +1 -0
  72. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  73. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  74. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  75. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  76. package/examples/jsm/nodes/materials/NodeMaterial.js +17 -20
  77. package/examples/jsm/nodes/materialx/lib/mx_noise.js +5 -5
  78. package/examples/jsm/nodes/math/OperatorNode.js +5 -21
  79. package/examples/jsm/nodes/shadernode/ShaderNode.js +128 -9
  80. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  81. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  82. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  83. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  84. package/examples/jsm/nodes/utils/SplitNode.js +2 -0
  85. package/examples/jsm/objects/BatchedMesh.js +586 -0
  86. package/examples/jsm/objects/InstancedPoints.js +21 -0
  87. package/examples/jsm/objects/Lensflare.js +20 -0
  88. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  89. package/examples/jsm/objects/Refractor.js +3 -0
  90. package/examples/jsm/objects/Sky.js +5 -3
  91. package/examples/jsm/objects/Water.js +5 -2
  92. package/examples/jsm/objects/Water2.js +3 -0
  93. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  94. package/examples/jsm/physics/RapierPhysics.js +21 -0
  95. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  96. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  97. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  98. package/examples/jsm/postprocessing/Pass.js +14 -3
  99. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  100. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  101. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  102. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  103. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  104. package/examples/jsm/renderers/common/Bindings.js +1 -1
  105. package/examples/jsm/renderers/common/RenderObject.js +8 -1
  106. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  107. package/examples/jsm/renderers/common/Textures.js +4 -36
  108. package/examples/jsm/renderers/common/nodes/Nodes.js +53 -18
  109. package/examples/jsm/renderers/webgl/WebGLBackend.js +291 -50
  110. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +88 -12
  111. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +40 -5
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  113. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +2 -0
  114. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +36 -4
  115. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  116. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  117. package/examples/jsm/shaders/BasicShader.js +2 -0
  118. package/examples/jsm/shaders/BlendShader.js +2 -0
  119. package/examples/jsm/shaders/BokehShader.js +2 -0
  120. package/examples/jsm/shaders/BokehShader2.js +4 -0
  121. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  122. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  123. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  124. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  125. package/examples/jsm/shaders/FXAAShader.js +2 -0
  126. package/examples/jsm/shaders/FilmShader.js +1 -1
  127. package/examples/jsm/shaders/FocusShader.js +2 -0
  128. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  129. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  130. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  131. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  132. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  133. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  134. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  135. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  136. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  137. package/examples/jsm/shaders/MirrorShader.js +2 -0
  138. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  139. package/examples/jsm/shaders/OutputShader.js +4 -5
  140. package/examples/jsm/shaders/SAOShader.js +5 -0
  141. package/examples/jsm/shaders/SMAAShader.js +6 -0
  142. package/examples/jsm/shaders/SSAOShader.js +6 -0
  143. package/examples/jsm/shaders/SSRShader.js +6 -0
  144. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  145. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  146. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  147. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  148. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  149. package/examples/jsm/shaders/VelocityShader.js +2 -0
  150. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  151. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  152. package/examples/jsm/transpiler/AST.js +231 -0
  153. package/examples/jsm/transpiler/GLSLDecoder.js +899 -0
  154. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  155. package/examples/jsm/transpiler/TSLEncoder.js +611 -0
  156. package/examples/jsm/transpiler/Transpiler.js +18 -0
  157. package/examples/jsm/webxr/VRButton.js +1 -1
  158. package/examples/jsm/webxr/XRButton.js +7 -5
  159. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  160. package/package.json +4 -1
  161. package/src/constants.js +7 -1
  162. package/src/extras/PMREMGenerator.js +7 -1
  163. package/src/loaders/MaterialLoader.js +10 -2
  164. package/src/materials/Material.js +27 -13
  165. package/src/math/Box3.js +35 -18
  166. package/src/math/Vector3.js +11 -12
  167. package/src/objects/SkinnedMesh.js +6 -7
  168. package/src/renderers/WebGLRenderer.js +142 -25
  169. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  170. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  171. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  172. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  173. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -2
  174. package/src/renderers/webgl/WebGLProgram.js +80 -50
  175. package/src/renderers/webgl/WebGLPrograms.js +3 -0
  176. package/src/renderers/webgl/WebGLState.js +25 -4
  177. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  178. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -67,12 +67,22 @@ class SkinningNode extends Node {
67
67
 
68
68
  // ASSIGNS
69
69
 
70
- builder.stack.assign( positionLocal, skinPosition );
71
- builder.stack.assign( normalLocal, skinNormal );
70
+ positionLocal.assign( skinPosition );
71
+ normalLocal.assign( skinNormal );
72
72
 
73
73
  if ( builder.hasGeometryAttribute( 'tangent' ) ) {
74
74
 
75
- builder.stack.assign( tangentLocal, skinNormal );
75
+ tangentLocal.assign( skinNormal );
76
+
77
+ }
78
+
79
+ }
80
+
81
+ generate( builder, output ) {
82
+
83
+ if ( output !== 'void' ) {
84
+
85
+ return positionLocal.build( builder, output );
76
86
 
77
87
  }
78
88
 
@@ -84,7 +84,7 @@ class TextureNode extends UniformNode {
84
84
 
85
85
  let uvNode = this.uvNode;
86
86
 
87
- if ( uvNode === null && builder.context.getUVNode ) {
87
+ if ( ( uvNode === null || builder.context.forceUVContext === true ) && builder.context.getUVNode ) {
88
88
 
89
89
  uvNode = builder.context.getUVNode( this );
90
90
 
@@ -140,7 +140,6 @@ class TextureNode extends UniformNode {
140
140
 
141
141
  } else {
142
142
 
143
- const nodeType = this.getNodeType( builder );
144
143
  const nodeData = builder.getDataFromNode( this );
145
144
 
146
145
  let propertyName = nodeData.propertyName;
@@ -148,7 +147,7 @@ class TextureNode extends UniformNode {
148
147
  if ( propertyName === undefined ) {
149
148
 
150
149
  const uvSnippet = uvNode.build( builder, 'vec2' );
151
- const nodeVar = builder.getVarFromNode( this, nodeType );
150
+ const nodeVar = builder.getVarFromNode( this );
152
151
 
153
152
  propertyName = builder.getPropertyName( nodeVar );
154
153
 
@@ -184,6 +183,7 @@ class TextureNode extends UniformNode {
184
183
  }
185
184
 
186
185
  let snippet = propertyName;
186
+ const nodeType = this.getNodeType( builder );
187
187
 
188
188
  if ( builder.needsColorSpaceToLinear( this.value ) ) {
189
189
 
@@ -81,7 +81,7 @@ class FunctionNode extends CodeNode {
81
81
 
82
82
  }
83
83
 
84
- nodeCode.code = code;
84
+ nodeCode.code = code + '\n';
85
85
 
86
86
  if ( output === 'property' ) {
87
87
 
@@ -0,0 +1,72 @@
1
+ import { addNodeClass } from '../core/Node.js';
2
+ import TempNode from '../core/TempNode.js';
3
+ import { addNodeElement, nodeProxy } from '../shadernode/ShaderNode.js';
4
+
5
+ class AssignNode extends TempNode {
6
+
7
+ constructor( targetNode, sourceNode ) {
8
+
9
+ super();
10
+
11
+ this.targetNode = targetNode;
12
+ this.sourceNode = sourceNode;
13
+
14
+ }
15
+
16
+ hasDependencies() {
17
+
18
+ return false;
19
+
20
+ }
21
+
22
+ getNodeType( builder, output ) {
23
+
24
+ return output !== 'void' ? this.targetNode.getNodeType( builder ) : 'void';
25
+
26
+ }
27
+
28
+ generate( builder, output ) {
29
+
30
+ const targetNode = this.targetNode;
31
+ const sourceNode = this.sourceNode;
32
+
33
+ const targetType = targetNode.getNodeType( builder );
34
+
35
+ const target = targetNode.build( builder );
36
+ const source = sourceNode.build( builder, targetType );
37
+
38
+ const snippet = `${ target } = ${ source }`;
39
+
40
+ if ( output === 'void' ) {
41
+
42
+ builder.addLineFlowCode( snippet );
43
+
44
+ return;
45
+
46
+ } else {
47
+
48
+ const sourceType = sourceNode.getNodeType( builder );
49
+
50
+ if ( sourceType === 'void' ) {
51
+
52
+ builder.addLineFlowCode( snippet );
53
+
54
+ return target;
55
+
56
+ }
57
+
58
+ return builder.format( snippet, targetType, output );
59
+
60
+ }
61
+
62
+ }
63
+
64
+ }
65
+
66
+ export default AssignNode;
67
+
68
+ export const assign = nodeProxy( AssignNode );
69
+
70
+ addNodeClass( 'AssignNode', AssignNode );
71
+
72
+ addNodeElement( 'assign', assign );
@@ -1,6 +1,8 @@
1
1
  class LightingModel {
2
2
 
3
- init( /*input, stack, builder*/ ) { }
3
+ start( /*input, stack, builder*/ ) { }
4
+
5
+ finish( /*input, stack, builder*/ ) { }
4
6
 
5
7
  direct( /*input, stack, builder*/ ) { }
6
8
 
@@ -56,14 +56,9 @@ class Node extends EventDispatcher {
56
56
 
57
57
  const self = this;
58
58
 
59
- for ( const { property, index, childNode } of getNodeChildren( this ) ) {
59
+ for ( const { childNode } of getNodeChildren( this ) ) {
60
60
 
61
- yield { childNode, replaceNode( node ) {
62
-
63
- if ( index === undefined ) self[ property ] = node;
64
- else self[ property ][ index ] = node;
65
-
66
- } };
61
+ yield childNode;
67
62
 
68
63
  }
69
64
 
@@ -75,13 +70,13 @@ class Node extends EventDispatcher {
75
70
 
76
71
  }
77
72
 
78
- traverse( callback, replaceNode = null ) {
73
+ traverse( callback ) {
79
74
 
80
- callback( this, replaceNode );
75
+ callback( this );
81
76
 
82
- for ( const { childNode, replaceNode } of this.getChildren() ) {
77
+ for ( const childNode of this.getChildren() ) {
83
78
 
84
- childNode.traverse( callback, replaceNode );
79
+ childNode.traverse( callback );
85
80
 
86
81
  }
87
82
 
@@ -138,7 +133,7 @@ class Node extends EventDispatcher {
138
133
 
139
134
  const nodeProperties = builder.getNodeProperties( this );
140
135
 
141
- for ( const { childNode } of this.getChildren() ) {
136
+ for ( const childNode of this.getChildren() ) {
142
137
 
143
138
  nodeProperties[ '_node' + childNode.id ] = childNode;
144
139
 
@@ -5,6 +5,7 @@ import NodeVar from './NodeVar.js';
5
5
  import NodeCode from './NodeCode.js';
6
6
  import NodeKeywords from './NodeKeywords.js';
7
7
  import NodeCache from './NodeCache.js';
8
+ import ParameterNode from './ParameterNode.js';
8
9
  import { createNodeMaterialFromType } from '../materials/NodeMaterial.js';
9
10
  import { NodeUpdateType, defaultBuildStages, shaderStages } from './constants.js';
10
11
 
@@ -16,6 +17,8 @@ import {
16
17
  import { REVISION, RenderTarget, NoColorSpace, LinearEncoding, sRGBEncoding, SRGBColorSpace, Color, Vector2, Vector3, Vector4, Float16BufferAttribute } from 'three';
17
18
 
18
19
  import { stack } from './StackNode.js';
20
+ import { getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
21
+
19
22
  import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
20
23
 
21
24
  import CubeRenderTarget from '../../renderers/common/CubeRenderTarget.js';
@@ -77,17 +80,18 @@ class NodeBuilder {
77
80
  this.flowCode = { vertex: '', fragment: '', compute: [] };
78
81
  this.uniforms = { vertex: [], fragment: [], compute: [], index: 0 };
79
82
  this.structs = { vertex: [], fragment: [], compute: [], index: 0 };
80
- this.codes = { vertex: [], fragment: [], compute: [] };
81
83
  this.bindings = { vertex: [], fragment: [], compute: [] };
82
84
  this.bindingsOffset = { vertex: 0, fragment: 0, compute: 0 };
83
85
  this.bindingsArray = null;
84
86
  this.attributes = [];
85
87
  this.bufferAttributes = [];
86
88
  this.varyings = [];
87
- this.vars = { vertex: [], fragment: [], compute: [] };
89
+ this.codes = {};
90
+ this.vars = {};
88
91
  this.flow = { code: '' };
89
92
  this.chaining = [];
90
93
  this.stack = stack();
94
+ this.stacks = [];
91
95
  this.tab = '\t';
92
96
 
93
97
  this.context = {
@@ -569,17 +573,21 @@ class NodeBuilder {
569
573
 
570
574
  this.stack = stack( this.stack );
571
575
 
576
+ this.stacks.push( getCurrentStack() || this.stack );
577
+ setCurrentStack( this.stack );
578
+
572
579
  return this.stack;
573
580
 
574
581
  }
575
582
 
576
583
  removeStack() {
577
584
 
578
- const currentStack = this.stack;
585
+ const lastStack = this.stack;
586
+ this.stack = lastStack.parent;
579
587
 
580
- this.stack = currentStack.parent;
588
+ setCurrentStack( this.stacks.pop() );
581
589
 
582
- return currentStack;
590
+ return lastStack;
583
591
 
584
592
  }
585
593
 
@@ -676,7 +684,7 @@ class NodeBuilder {
676
684
 
677
685
  }
678
686
 
679
- getVarFromNode( node, type, shaderStage = this.shaderStage ) {
687
+ getVarFromNode( node, name = null, type = node.getNodeType( this ), shaderStage = this.shaderStage ) {
680
688
 
681
689
  const nodeData = this.getDataFromNode( node, shaderStage );
682
690
 
@@ -684,10 +692,11 @@ class NodeBuilder {
684
692
 
685
693
  if ( nodeVar === undefined ) {
686
694
 
687
- const vars = this.vars[ shaderStage ];
688
- const index = vars.length;
695
+ const vars = this.vars[ shaderStage ] || ( this.vars[ shaderStage ] = [] );
696
+
697
+ if ( name === null ) name = 'nodeVar' + vars.length;
689
698
 
690
- nodeVar = new NodeVar( 'nodeVar' + index, type );
699
+ nodeVar = new NodeVar( name, type );
691
700
 
692
701
  vars.push( nodeVar );
693
702
 
@@ -730,7 +739,7 @@ class NodeBuilder {
730
739
 
731
740
  if ( nodeCode === undefined ) {
732
741
 
733
- const codes = this.codes[ shaderStage ];
742
+ const codes = this.codes[ shaderStage ] || ( this.codes[ shaderStage ] = [] );
734
743
  const index = codes.length;
735
744
 
736
745
  nodeCode = new NodeCode( 'nodeCode' + index, type );
@@ -805,12 +814,84 @@ class NodeBuilder {
805
814
 
806
815
  }
807
816
 
817
+ flowShaderNode( shaderNode ) {
818
+
819
+ const layout = shaderNode.layout;
820
+
821
+ let inputs;
822
+
823
+ if ( shaderNode.isArrayInput ) {
824
+
825
+ inputs = [];
826
+
827
+ for ( const input of layout.inputs ) {
828
+
829
+ inputs.push( new ParameterNode( input.type, input.name ) );
830
+
831
+ }
832
+
833
+ } else {
834
+
835
+ inputs = {};
836
+
837
+ for ( const input of layout.inputs ) {
838
+
839
+ inputs[ input.name ] = new ParameterNode( input.type, input.name );
840
+
841
+ }
842
+
843
+ }
844
+
845
+ //
846
+
847
+ shaderNode.layout = null;
848
+
849
+ const callNode = shaderNode.call( inputs );
850
+ const flowData = this.flowStagesNode( callNode, layout.type );
851
+
852
+ shaderNode.layout = layout;
853
+
854
+ return flowData;
855
+
856
+ }
857
+
858
+ flowStagesNode( node, output = null ) {
859
+
860
+ const previousFlow = this.flow;
861
+ const previousVars = this.vars;
862
+ const previousBuildStage = this.buildStage;
863
+
864
+ const flow = {
865
+ code: ''
866
+ };
867
+
868
+ this.flow = flow;
869
+ this.vars = {};
870
+
871
+ for ( const buildStage of defaultBuildStages ) {
872
+
873
+ this.setBuildStage( buildStage );
874
+
875
+ flow.result = node.build( this, output );
876
+
877
+ }
878
+
879
+ flow.vars = this.getVars( this.shaderStage );
880
+
881
+ this.flow = previousFlow;
882
+ this.vars = previousVars;
883
+ this.setBuildStage( previousBuildStage );
884
+
885
+ return flow;
886
+
887
+ }
888
+
808
889
  flowChildNode( node, output = null ) {
809
890
 
810
891
  const previousFlow = this.flow;
811
892
 
812
893
  const flow = {
813
- code: '',
894
+ code: ''
814
895
  };
815
896
 
816
897
  this.flow = flow;
@@ -875,9 +956,13 @@ class NodeBuilder {
875
956
 
876
957
  const vars = this.vars[ shaderStage ];
877
958
 
878
- for ( const variable of vars ) {
959
+ if ( vars !== undefined ) {
879
960
 
880
- snippet += `${ this.getVar( variable.type, variable.name ) }; `;
961
+ for ( const variable of vars ) {
962
+
963
+ snippet += `${ this.getVar( variable.type, variable.name ) }; `;
964
+
965
+ }
881
966
 
882
967
  }
883
968
 
@@ -897,9 +982,13 @@ class NodeBuilder {
897
982
 
898
983
  let code = '';
899
984
 
900
- for ( const nodeCode of codes ) {
985
+ if ( codes !== undefined ) {
901
986
 
902
- code += nodeCode.code + '\n';
987
+ for ( const nodeCode of codes ) {
988
+
989
+ code += nodeCode.code + '\n';
990
+
991
+ }
903
992
 
904
993
  }
905
994
 
@@ -1015,6 +1104,18 @@ class NodeBuilder {
1015
1104
 
1016
1105
  }
1017
1106
 
1107
+ getPrimitiveType( type ) {
1108
+
1109
+ let primitiveType;
1110
+
1111
+ if ( type[ 0 ] === 'i' ) primitiveType = 'int';
1112
+ else if ( type[ 0 ] === 'u' ) primitiveType = 'uint';
1113
+ else primitiveType = 'float';
1114
+
1115
+ return primitiveType;
1116
+
1117
+ }
1118
+
1018
1119
  format( snippet, fromType, toType ) {
1019
1120
 
1020
1121
  fromType = this.getVectorType( fromType );
@@ -1057,7 +1158,7 @@ class NodeBuilder {
1057
1158
 
1058
1159
  }
1059
1160
 
1060
- if ( toTypeLength === 4 ) { // toType is vec4-like
1161
+ if ( toTypeLength === 4 && fromTypeLength > 1 ) { // toType is vec4-like
1061
1162
 
1062
1163
  return `${ this.getType( toType ) }( ${ this.format( snippet, fromType, 'vec3' ) }, 1.0 )`;
1063
1164
 
@@ -1069,6 +1170,15 @@ class NodeBuilder {
1069
1170
 
1070
1171
  }
1071
1172
 
1173
+ if ( fromTypeLength === 1 && toTypeLength > 1 && fromType[ 0 ] !== toType[ 0 ] ) { // fromType is float-like
1174
+
1175
+ // convert a number value to vector type, e.g:
1176
+ // vec3( 1u ) -> vec3( float( 1u ) )
1177
+
1178
+ snippet = `${ this.getType( this.getPrimitiveType( toType ) ) }( ${ snippet } )`;
1179
+
1180
+ }
1181
+
1072
1182
  return `${ this.getType( toType ) }( ${ snippet } )`; // fromType is float-like
1073
1183
 
1074
1184
  }
@@ -137,9 +137,11 @@ export function getValueFromType( type, ...params ) {
137
137
 
138
138
  const last4 = type ? type.slice( - 4 ) : undefined;
139
139
 
140
- if ( ( last4 === 'vec2' || last4 === 'vec3' || last4 === 'vec4' ) && params.length === 1 ) { // ensure same behaviour as in NodeBuilder.format()
140
+ if ( params.length === 1 ) { // ensure same behaviour as in NodeBuilder.format()
141
141
 
142
- params = last4 === 'vec2' ? [ params[ 0 ], params[ 0 ] ] : [ params[ 0 ], params[ 0 ], params[ 0 ] ];
142
+ if ( last4 === 'vec2' ) params = [ params[ 0 ], params[ 0 ] ];
143
+ else if ( last4 === 'vec3' ) params = [ params[ 0 ], params[ 0 ], params[ 0 ] ];
144
+ else if ( last4 === 'vec4' ) params = [ params[ 0 ], params[ 0 ], params[ 0 ], params[ 0 ] ];
143
145
 
144
146
  }
145
147
 
@@ -32,7 +32,7 @@ class OutputStructNode extends Node {
32
32
 
33
33
  generate( builder, output ) {
34
34
 
35
- const nodeVar = builder.getVarFromNode( this, this.nodeType );
35
+ const nodeVar = builder.getVarFromNode( this );
36
36
  nodeVar.isOutputStructVar = true;
37
37
 
38
38
  const propertyName = builder.getPropertyName( nodeVar );
@@ -0,0 +1,33 @@
1
+ import { addNodeClass } from './Node.js';
2
+ import { nodeObject } from '../shadernode/ShaderNode.js';
3
+ import PropertyNode from './PropertyNode.js';
4
+
5
+ class ParameterNode extends PropertyNode {
6
+
7
+ constructor( nodeType, name = null ) {
8
+
9
+ super( nodeType, name );
10
+
11
+ this.isParameterNode = true;
12
+
13
+ }
14
+
15
+ getHash() {
16
+
17
+ return this.uuid;
18
+
19
+ }
20
+
21
+ generate() {
22
+
23
+ return this.name;
24
+
25
+ }
26
+
27
+ }
28
+
29
+ export default ParameterNode;
30
+
31
+ export const parameter = ( type, name ) => nodeObject( new ParameterNode( type, name ) );
32
+
33
+ addNodeClass( 'ParameterNode', ParameterNode );
@@ -9,6 +9,8 @@ class PropertyNode extends Node {
9
9
 
10
10
  this.name = name;
11
11
 
12
+ this.isPropertyNode = true;
13
+
12
14
  }
13
15
 
14
16
  getHash( builder ) {
@@ -25,16 +27,7 @@ class PropertyNode extends Node {
25
27
 
26
28
  generate( builder ) {
27
29
 
28
- const nodeVary = builder.getVarFromNode( this, this.getNodeType( builder ) );
29
- const name = this.name;
30
-
31
- if ( name !== null ) {
32
-
33
- nodeVary.name = name;
34
-
35
- }
36
-
37
- return builder.getPropertyName( nodeVary );
30
+ return builder.getPropertyName( builder.getVarFromNode( this, this.name ) );
38
31
 
39
32
  }
40
33
 
@@ -59,5 +52,6 @@ export const shininess = nodeImmutable( PropertyNode, 'float', 'Shininess' );
59
52
  export const output = nodeImmutable( PropertyNode, 'vec4', 'Output' );
60
53
  export const dashSize = nodeImmutable( PropertyNode, 'float', 'dashSize' );
61
54
  export const gapSize = nodeImmutable( PropertyNode, 'float', 'gapSize' );
55
+ export const pointWidth = nodeImmutable( PropertyNode, 'float', 'pointWidth' );
62
56
 
63
57
  addNodeClass( 'PropertyNode', PropertyNode );
@@ -1,10 +1,6 @@
1
1
  import Node, { addNodeClass } from './Node.js';
2
- import { assign } from '../math/OperatorNode.js';
3
- import { bypass } from '../core/BypassNode.js';
4
- import { expression } from '../code/ExpressionNode.js';
5
2
  import { cond } from '../math/CondNode.js';
6
- import { loop } from '../utils/LoopNode.js';
7
- import { ShaderNode, nodeProxy } from '../shadernode/ShaderNode.js';
3
+ import { ShaderNode, nodeProxy, getCurrentStack, setCurrentStack } from '../shadernode/ShaderNode.js';
8
4
 
9
5
  class StackNode extends Node {
10
6
 
@@ -31,7 +27,7 @@ class StackNode extends Node {
31
27
 
32
28
  add( node ) {
33
29
 
34
- this.nodes.push( bypass( expression(), node ) );
30
+ this.nodes.push( node );
35
31
 
36
32
  return this;
37
33
 
@@ -66,19 +62,11 @@ class StackNode extends Node {
66
62
 
67
63
  }
68
64
 
69
- assign( targetNode, sourceValue ) {
70
-
71
- return this.add( assign( targetNode, sourceValue ) );
72
-
73
- }
74
-
75
- loop( ...params ) {
76
-
77
- return this.add( loop( ...params ) );
65
+ build( builder, ...params ) {
78
66
 
79
- }
67
+ const previousStack = getCurrentStack();
80
68
 
81
- build( builder, ...params ) {
69
+ setCurrentStack( this );
82
70
 
83
71
  for ( const node of this.nodes ) {
84
72
 
@@ -86,6 +74,8 @@ class StackNode extends Node {
86
74
 
87
75
  }
88
76
 
77
+ setCurrentStack( previousStack );
78
+
89
79
  return this.outputNode ? this.outputNode.build( builder, ...params ) : super.build( builder, ...params );
90
80
 
91
81
  }
@@ -33,7 +33,7 @@ class TempNode extends Node {
33
33
 
34
34
  const snippet = super.build( builder, type );
35
35
 
36
- const nodeVar = builder.getVarFromNode( this, type );
36
+ const nodeVar = builder.getVarFromNode( this, null, type );
37
37
  const propertyName = builder.getPropertyName( nodeVar );
38
38
 
39
39
  builder.addLineFlowCode( `${propertyName} = ${snippet}` );
@@ -12,22 +12,6 @@ class VarNode extends Node {
12
12
 
13
13
  }
14
14
 
15
- assign( node ) {
16
-
17
- node.traverse( ( childNode, replaceNode ) => {
18
-
19
- if ( replaceNode && childNode.uuid === this.uuid ) {
20
-
21
- replaceNode( this.node );
22
-
23
- }
24
-
25
- } );
26
- this.node = node;
27
- return this;
28
-
29
- }
30
-
31
15
  isGlobal() {
32
16
 
33
17
  return true;
@@ -48,28 +32,14 @@ class VarNode extends Node {
48
32
 
49
33
  generate( builder ) {
50
34
 
51
- const node = this.node;
52
- const name = this.name;
35
+ const { node, name } = this;
53
36
 
54
- if ( name === null && node.isTempNode === true ) {
55
-
56
- return node.build( builder );
57
-
58
- }
59
-
60
- const type = builder.getVectorType( this.getNodeType( builder ) );
61
-
62
- const snippet = node.build( builder, type );
63
- const nodeVar = builder.getVarFromNode( this, type );
64
-
65
- if ( name !== null ) {
66
-
67
- nodeVar.name = name;
68
-
69
- }
37
+ const nodeVar = builder.getVarFromNode( this, name, builder.getVectorType( this.getNodeType( builder ) ) );
70
38
 
71
39
  const propertyName = builder.getPropertyName( nodeVar );
72
40
 
41
+ const snippet = node.build( builder, nodeVar.type );
42
+
73
43
  builder.addLineFlowCode( `${propertyName} = ${snippet}` );
74
44
 
75
45
  return propertyName;
@@ -82,6 +52,7 @@ export default VarNode;
82
52
 
83
53
  export const temp = nodeProxy( VarNode );
84
54
 
85
- addNodeElement( 'temp', temp );
55
+ addNodeElement( 'temp', temp ); // @TODO: Will be removed in the future
56
+ addNodeElement( 'toVar', ( ...params ) => temp( ...params ).append() );
86
57
 
87
58
  addNodeClass( 'VarNode', VarNode );
@@ -11,6 +11,8 @@ class VaryingNode extends Node {
11
11
  this.node = node;
12
12
  this.name = name;
13
13
 
14
+ this.isVaryingNode = true;
15
+
14
16
  }
15
17
 
16
18
  isGlobal() {