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.
- package/README.md +6 -4
- package/build/three.cjs +1013 -790
- package/build/three.js +1013 -790
- package/build/three.min.js +1 -1
- package/build/three.module.js +1008 -791
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +290 -0
- package/examples/jsm/controls/FlyControls.js +26 -0
- package/examples/jsm/controls/OrbitControls.js +12 -1
- package/examples/jsm/controls/TransformControls.js +27 -11
- package/examples/jsm/csm/CSMShader.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +72 -2
- package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
- package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
- package/examples/jsm/libs/lottie_canvas.module.js +6 -1
- package/examples/jsm/libs/opentype.module.js +13 -75
- package/examples/jsm/libs/surfaceNet.js +201 -0
- package/examples/jsm/loaders/GLTFLoader.js +12 -3
- package/examples/jsm/loaders/LUTImageLoader.js +162 -0
- package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
- package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
- package/examples/jsm/math/Capsule.js +0 -55
- package/examples/jsm/math/Octree.js +70 -3
- package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
- package/examples/jsm/modifiers/TessellateModifier.js +3 -3
- package/examples/jsm/nodes/Nodes.js +6 -6
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +3 -3
- package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
- package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
- package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
- package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
- package/examples/jsm/nodes/accessors/MorphNode.js +5 -5
- package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
- package/examples/jsm/nodes/accessors/TextureNode.js +3 -3
- package/examples/jsm/nodes/code/FunctionNode.js +1 -1
- package/examples/jsm/nodes/core/AssignNode.js +72 -0
- package/examples/jsm/nodes/core/LightingModel.js +3 -1
- package/examples/jsm/nodes/core/Node.js +7 -12
- package/examples/jsm/nodes/core/NodeBuilder.js +126 -16
- package/examples/jsm/nodes/core/NodeUtils.js +4 -2
- package/examples/jsm/nodes/core/OutputStructNode.js +1 -1
- package/examples/jsm/nodes/core/ParameterNode.js +33 -0
- package/examples/jsm/nodes/core/PropertyNode.js +4 -10
- package/examples/jsm/nodes/core/StackNode.js +7 -17
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/core/VarNode.js +6 -35
- package/examples/jsm/nodes/core/VaryingNode.js +2 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
- package/examples/jsm/nodes/display/ViewportNode.js +14 -4
- package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
- package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
- package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
- package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
- package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
- package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -6
- package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
- package/examples/jsm/nodes/lighting/LightsNode.js +62 -4
- package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
- package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +70 -71
- package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
- package/examples/jsm/nodes/materials/Materials.js +1 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
- package/examples/jsm/nodes/materials/NodeMaterial.js +17 -20
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +5 -5
- package/examples/jsm/nodes/math/OperatorNode.js +5 -21
- package/examples/jsm/nodes/shadernode/ShaderNode.js +128 -9
- package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
- package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
- package/examples/jsm/nodes/utils/JoinNode.js +11 -1
- package/examples/jsm/nodes/utils/LoopNode.js +36 -24
- package/examples/jsm/nodes/utils/SplitNode.js +2 -0
- package/examples/jsm/objects/BatchedMesh.js +586 -0
- package/examples/jsm/objects/InstancedPoints.js +21 -0
- package/examples/jsm/objects/Lensflare.js +20 -0
- package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
- package/examples/jsm/objects/Refractor.js +3 -0
- package/examples/jsm/objects/Sky.js +5 -3
- package/examples/jsm/objects/Water.js +5 -2
- package/examples/jsm/objects/Water2.js +3 -0
- package/examples/jsm/physics/AmmoPhysics.js +21 -0
- package/examples/jsm/physics/RapierPhysics.js +21 -0
- package/examples/jsm/postprocessing/BokehPass.js +3 -2
- package/examples/jsm/postprocessing/LUTPass.js +2 -1
- package/examples/jsm/postprocessing/OutputPass.js +1 -0
- package/examples/jsm/postprocessing/Pass.js +14 -3
- package/examples/jsm/postprocessing/SAOPass.js +0 -1
- package/examples/jsm/postprocessing/SMAAPass.js +0 -2
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
- package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
- package/examples/jsm/renderers/SVGRenderer.js +9 -6
- package/examples/jsm/renderers/common/Bindings.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +8 -1
- package/examples/jsm/renderers/common/RenderObjects.js +1 -1
- package/examples/jsm/renderers/common/Textures.js +4 -36
- package/examples/jsm/renderers/common/nodes/Nodes.js +53 -18
- package/examples/jsm/renderers/webgl/WebGLBackend.js +291 -50
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +88 -12
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +40 -5
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +2 -0
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +36 -4
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
- package/examples/jsm/shaders/AfterimageShader.js +2 -0
- package/examples/jsm/shaders/BasicShader.js +2 -0
- package/examples/jsm/shaders/BlendShader.js +2 -0
- package/examples/jsm/shaders/BokehShader.js +2 -0
- package/examples/jsm/shaders/BokehShader2.js +4 -0
- package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
- package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
- package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
- package/examples/jsm/shaders/FXAAShader.js +2 -0
- package/examples/jsm/shaders/FilmShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +2 -0
- package/examples/jsm/shaders/FreiChenShader.js +2 -0
- package/examples/jsm/shaders/GodRaysShader.js +8 -0
- package/examples/jsm/shaders/HalftoneShader.js +2 -0
- package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
- package/examples/jsm/shaders/HueSaturationShader.js +2 -0
- package/examples/jsm/shaders/KaleidoShader.js +2 -0
- package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
- package/examples/jsm/shaders/LuminosityShader.js +2 -0
- package/examples/jsm/shaders/MMDToonShader.js +2 -0
- package/examples/jsm/shaders/MirrorShader.js +2 -0
- package/examples/jsm/shaders/NormalMapShader.js +2 -0
- package/examples/jsm/shaders/OutputShader.js +4 -5
- package/examples/jsm/shaders/SAOShader.js +5 -0
- package/examples/jsm/shaders/SMAAShader.js +6 -0
- package/examples/jsm/shaders/SSAOShader.js +6 -0
- package/examples/jsm/shaders/SSRShader.js +6 -0
- package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
- package/examples/jsm/shaders/TechnicolorShader.js +2 -0
- package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
- package/examples/jsm/shaders/VelocityShader.js +2 -0
- package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
- package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
- package/examples/jsm/transpiler/AST.js +231 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +899 -0
- package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
- package/examples/jsm/transpiler/TSLEncoder.js +611 -0
- package/examples/jsm/transpiler/Transpiler.js +18 -0
- package/examples/jsm/webxr/VRButton.js +1 -1
- package/examples/jsm/webxr/XRButton.js +7 -5
- package/examples/jsm/webxr/XREstimatedLight.js +1 -1
- package/package.json +4 -1
- package/src/constants.js +7 -1
- package/src/extras/PMREMGenerator.js +7 -1
- package/src/loaders/MaterialLoader.js +10 -2
- package/src/materials/Material.js +27 -13
- package/src/math/Box3.js +35 -18
- package/src/math/Vector3.js +11 -12
- package/src/objects/SkinnedMesh.js +6 -7
- package/src/renderers/WebGLRenderer.js +142 -25
- package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -2
- package/src/renderers/webgl/WebGLProgram.js +80 -50
- package/src/renderers/webgl/WebGLPrograms.js +3 -0
- package/src/renderers/webgl/WebGLState.js +25 -4
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
- 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
|
-
|
|
71
|
-
|
|
70
|
+
positionLocal.assign( skinPosition );
|
|
71
|
+
normalLocal.assign( skinNormal );
|
|
72
72
|
|
|
73
73
|
if ( builder.hasGeometryAttribute( 'tangent' ) ) {
|
|
74
74
|
|
|
75
|
-
|
|
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
|
|
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
|
|
|
@@ -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 );
|
|
@@ -56,14 +56,9 @@ class Node extends EventDispatcher {
|
|
|
56
56
|
|
|
57
57
|
const self = this;
|
|
58
58
|
|
|
59
|
-
for ( const {
|
|
59
|
+
for ( const { childNode } of getNodeChildren( this ) ) {
|
|
60
60
|
|
|
61
|
-
yield
|
|
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
|
|
73
|
+
traverse( callback ) {
|
|
79
74
|
|
|
80
|
-
callback( this
|
|
75
|
+
callback( this );
|
|
81
76
|
|
|
82
|
-
for ( const
|
|
77
|
+
for ( const childNode of this.getChildren() ) {
|
|
83
78
|
|
|
84
|
-
childNode.traverse( callback
|
|
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
|
|
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.
|
|
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
|
|
585
|
+
const lastStack = this.stack;
|
|
586
|
+
this.stack = lastStack.parent;
|
|
579
587
|
|
|
580
|
-
this.
|
|
588
|
+
setCurrentStack( this.stacks.pop() );
|
|
581
589
|
|
|
582
|
-
return
|
|
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
|
-
|
|
695
|
+
const vars = this.vars[ shaderStage ] || ( this.vars[ shaderStage ] = [] );
|
|
696
|
+
|
|
697
|
+
if ( name === null ) name = 'nodeVar' + vars.length;
|
|
689
698
|
|
|
690
|
-
nodeVar = new NodeVar(
|
|
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
|
-
|
|
959
|
+
if ( vars !== undefined ) {
|
|
879
960
|
|
|
880
|
-
|
|
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
|
-
|
|
985
|
+
if ( codes !== undefined ) {
|
|
901
986
|
|
|
902
|
-
|
|
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 (
|
|
140
|
+
if ( params.length === 1 ) { // ensure same behaviour as in NodeBuilder.format()
|
|
141
141
|
|
|
142
|
-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
52
|
-
const name = this.name;
|
|
35
|
+
const { node, name } = this;
|
|
53
36
|
|
|
54
|
-
|
|
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 );
|