super-three 0.158.0 → 0.160.1
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/build/three.cjs +1720 -380
- package/build/three.js +1720 -380
- package/build/three.min.js +1 -1
- package/build/three.module.js +1719 -381
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +2 -1
- package/examples/jsm/controls/OrbitControls.js +50 -40
- package/examples/jsm/csm/CSMShader.js +52 -47
- package/examples/jsm/exporters/GLTFExporter.js +79 -1
- package/examples/jsm/exporters/USDZExporter.js +27 -19
- package/examples/jsm/helpers/TextureHelper.js +237 -0
- package/examples/jsm/interactive/HTMLMesh.js +9 -2
- package/examples/jsm/lines/LineMaterial.js +16 -33
- package/examples/jsm/loaders/ColladaLoader.js +0 -6
- package/examples/jsm/loaders/DRACOLoader.js +4 -3
- package/examples/jsm/loaders/FBXLoader.js +294 -124
- package/examples/jsm/loaders/GLTFLoader.js +71 -3
- package/examples/jsm/loaders/MaterialXLoader.js +73 -54
- package/examples/jsm/loaders/NRRDLoader.js +0 -13
- package/examples/jsm/loaders/SVGLoader.js +4 -4
- package/examples/jsm/loaders/USDZLoader.js +3 -17
- package/examples/jsm/math/Octree.js +15 -4
- package/examples/jsm/misc/Timer.js +119 -0
- package/examples/jsm/misc/TubePainter.js +3 -6
- package/examples/jsm/modifiers/CurveModifier.js +20 -2
- package/examples/jsm/nodes/Nodes.js +11 -7
- package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
- package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
- package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
- package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
- package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
- package/examples/jsm/nodes/accessors/TextureNode.js +122 -36
- package/examples/jsm/nodes/code/CodeNode.js +3 -3
- package/examples/jsm/nodes/core/AttributeNode.js +7 -1
- package/examples/jsm/nodes/core/CacheNode.js +4 -1
- package/examples/jsm/nodes/core/ConstNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +6 -3
- package/examples/jsm/nodes/core/NodeBuilder.js +84 -27
- package/examples/jsm/nodes/core/NodeFrame.js +10 -8
- package/examples/jsm/nodes/core/NodeUniform.js +12 -0
- package/examples/jsm/nodes/core/NodeUtils.js +3 -7
- package/examples/jsm/nodes/core/OutputStructNode.js +3 -3
- package/examples/jsm/nodes/core/PropertyNode.js +17 -2
- package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
- package/examples/jsm/nodes/core/UniformGroup.js +13 -0
- package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
- package/examples/jsm/nodes/core/UniformNode.js +17 -0
- package/examples/jsm/nodes/core/VarNode.js +2 -0
- package/examples/jsm/nodes/core/VaryingNode.js +1 -7
- package/examples/jsm/nodes/display/BumpMapNode.js +1 -1
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
- package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
- package/examples/jsm/nodes/display/PassNode.js +182 -0
- package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
- package/examples/jsm/nodes/display/ViewportNode.js +5 -8
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +52 -17
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -12
- package/examples/jsm/nodes/lighting/LightsNode.js +34 -32
- package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +12 -12
- package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +1 -1
- package/examples/jsm/nodes/materials/NodeMaterial.js +66 -41
- package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
- package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
- package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
- package/examples/jsm/nodes/math/MathNode.js +2 -0
- package/examples/jsm/nodes/math/OperatorNode.js +19 -6
- package/examples/jsm/nodes/shadernode/ShaderNode.js +32 -3
- package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
- package/examples/jsm/nodes/utils/RemapNode.js +2 -2
- package/examples/jsm/nodes/utils/SplitNode.js +8 -2
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
- package/examples/jsm/objects/QuadMesh.js +60 -0
- package/examples/jsm/postprocessing/GTAOPass.js +572 -0
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/renderers/common/Animation.js +10 -21
- package/examples/jsm/renderers/common/Backend.js +19 -3
- package/examples/jsm/renderers/common/Background.js +20 -22
- package/examples/jsm/renderers/common/Bindings.js +30 -21
- package/examples/jsm/renderers/common/ChainMap.js +3 -3
- package/examples/jsm/renderers/common/Color4.js +37 -0
- package/examples/jsm/renderers/common/Geometries.js +4 -4
- package/examples/jsm/renderers/common/Info.js +12 -2
- package/examples/jsm/renderers/common/Pipelines.js +3 -51
- package/examples/jsm/renderers/common/PostProcessing.js +25 -0
- package/examples/jsm/renderers/common/RenderContext.js +1 -1
- package/examples/jsm/renderers/common/RenderContexts.js +1 -1
- package/examples/jsm/renderers/common/RenderObject.js +13 -1
- package/examples/jsm/renderers/common/RenderObjects.js +4 -2
- package/examples/jsm/renderers/common/Renderer.js +137 -37
- package/examples/jsm/renderers/common/StorageTexture.js +1 -0
- package/examples/jsm/renderers/common/Textures.js +4 -1
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
- package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +74 -7
- package/examples/jsm/renderers/webgl/WebGLBackend.js +91 -33
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +100 -31
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +57 -5
- package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
- package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +186 -137
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +209 -90
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
- package/examples/jsm/shaders/FXAAShader.js +133 -133
- package/examples/jsm/shaders/GTAOShader.js +424 -0
- package/examples/jsm/shaders/OutputShader.js +4 -0
- package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
- package/examples/jsm/shaders/SAOShader.js +2 -3
- package/examples/jsm/shaders/SSAOShader.js +2 -3
- package/examples/jsm/transpiler/AST.js +40 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +50 -8
- package/examples/jsm/transpiler/ShaderToyDecoder.js +4 -4
- package/examples/jsm/transpiler/TSLEncoder.js +124 -20
- package/examples/jsm/utils/SortUtils.js +158 -0
- package/examples/jsm/utils/TextureUtils.js +33 -21
- package/examples/jsm/webxr/ARButton.js +14 -0
- package/examples/jsm/webxr/VRButton.js +23 -8
- package/examples/jsm/webxr/XRButton.js +25 -11
- package/package.json +5 -6
- package/src/Three.js +1 -0
- package/src/constants.js +2 -1
- package/src/core/BufferAttribute.js +21 -2
- package/src/core/InterleavedBuffer.js +21 -1
- package/src/core/Object3D.js +60 -12
- package/src/core/UniformsGroup.js +7 -1
- package/src/extras/curves/LineCurve3.js +4 -0
- package/src/loaders/AudioLoader.js +1 -1
- package/src/loaders/BufferGeometryLoader.js +0 -7
- package/src/loaders/ImageBitmapLoader.js +25 -1
- package/src/loaders/ObjectLoader.js +49 -0
- package/src/materials/ShaderMaterial.js +2 -1
- package/src/math/ColorManagement.js +0 -16
- package/src/math/Quaternion.js +5 -4
- package/src/math/Sphere.js +2 -0
- package/src/math/Triangle.js +17 -5
- package/src/objects/BatchedMesh.js +1020 -0
- package/src/objects/Skeleton.js +1 -3
- package/src/renderers/WebGL3DRenderTarget.js +2 -2
- package/src/renderers/WebGLArrayRenderTarget.js +2 -2
- package/src/renderers/WebGLRenderer.js +24 -19
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
- package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
- package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
- package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk.js +4 -0
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
- package/src/renderers/webgl/WebGLAttributes.js +39 -5
- package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
- package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
- package/src/renderers/webgl/WebGLExtensions.js +1 -0
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
- package/src/renderers/webgl/WebGLLights.js +11 -2
- package/src/renderers/webgl/WebGLProgram.js +20 -1
- package/src/renderers/webgl/WebGLPrograms.js +5 -0
- package/src/renderers/webgl/WebGLShadowMap.js +35 -0
- package/src/renderers/webgl/WebGLTextures.js +7 -11
- package/src/renderers/webgl/WebGLUniforms.js +11 -1
- package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
- package/src/renderers/webxr/WebXRManager.js +16 -0
- package/examples/jsm/objects/BatchedMesh.js +0 -586
|
@@ -27,6 +27,32 @@ export class VariableDeclaration {
|
|
|
27
27
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
export class Uniform {
|
|
31
|
+
|
|
32
|
+
constructor( type, name ) {
|
|
33
|
+
|
|
34
|
+
this.type = type;
|
|
35
|
+
this.name = name;
|
|
36
|
+
|
|
37
|
+
this.isUniform = true;
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class Varying {
|
|
44
|
+
|
|
45
|
+
constructor( type, name ) {
|
|
46
|
+
|
|
47
|
+
this.type = type;
|
|
48
|
+
this.name = name;
|
|
49
|
+
|
|
50
|
+
this.isVarying = true;
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
30
56
|
export class FunctionParameter {
|
|
31
57
|
|
|
32
58
|
constructor( type, name, qualifier = null, immutable = true ) {
|
|
@@ -125,6 +151,19 @@ export class Number {
|
|
|
125
151
|
|
|
126
152
|
}
|
|
127
153
|
|
|
154
|
+
export class String {
|
|
155
|
+
|
|
156
|
+
constructor( value ) {
|
|
157
|
+
|
|
158
|
+
this.value = value;
|
|
159
|
+
|
|
160
|
+
this.isString = true;
|
|
161
|
+
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
|
|
128
167
|
export class Conditional {
|
|
129
168
|
|
|
130
169
|
constructor( cond = null ) {
|
|
@@ -228,4 +267,4 @@ export class For {
|
|
|
228
267
|
|
|
229
268
|
}
|
|
230
269
|
|
|
231
|
-
}
|
|
270
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Program, FunctionDeclaration, For, AccessorElements, Ternary, DynamicElement, StaticElement, FunctionParameter, Unary, Conditional, VariableDeclaration, Operator, Number, FunctionCall, Return, Accessor } from './AST.js';
|
|
1
|
+
import { Program, FunctionDeclaration, For, AccessorElements, Ternary, Varying, DynamicElement, StaticElement, FunctionParameter, Unary, Conditional, VariableDeclaration, Operator, Number, String, FunctionCall, Return, Accessor, Uniform } from './AST.js';
|
|
2
2
|
|
|
3
3
|
const unaryOperators = [
|
|
4
4
|
'+', '-', '~', '!', '++', '--'
|
|
@@ -180,7 +180,7 @@ class Tokenizer {
|
|
|
180
180
|
|
|
181
181
|
const token = new Token( this, parser.type, result[ parser.group || 0 ], this.position );
|
|
182
182
|
|
|
183
|
-
this.position +=
|
|
183
|
+
this.position += result[ 0 ].length;
|
|
184
184
|
|
|
185
185
|
if ( parser.isTag ) {
|
|
186
186
|
|
|
@@ -218,11 +218,11 @@ class GLSLDecoder {
|
|
|
218
218
|
|
|
219
219
|
this._currentFunction = null;
|
|
220
220
|
|
|
221
|
-
this.
|
|
221
|
+
this.addPolyfill( 'gl_FragCoord', 'vec2 gl_FragCoord = vec2( viewportCoordinate.x, viewportCoordinate.y.oneMinus() );' );
|
|
222
222
|
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
addPolyfill( name, polyfill ) {
|
|
226
226
|
|
|
227
227
|
this.keywords.push( { name, polyfill } );
|
|
228
228
|
|
|
@@ -406,15 +406,27 @@ class GLSLDecoder {
|
|
|
406
406
|
|
|
407
407
|
let type;
|
|
408
408
|
|
|
409
|
-
|
|
409
|
+
const isHex = /^(0x)/.test( firstToken.str );
|
|
410
|
+
|
|
411
|
+
if ( isHex ) type = 'int';
|
|
410
412
|
else if ( /u$/.test( firstToken.str ) ) type = 'uint';
|
|
411
413
|
else if ( /f|e|\./.test( firstToken.str ) ) type = 'float';
|
|
412
414
|
else type = 'int';
|
|
413
415
|
|
|
414
|
-
|
|
416
|
+
let str = firstToken.str.replace( /u|i$/, '' );
|
|
417
|
+
|
|
418
|
+
if ( isHex === false ) {
|
|
419
|
+
|
|
420
|
+
str = str.replace( /f$/, '' );
|
|
421
|
+
|
|
422
|
+
}
|
|
415
423
|
|
|
416
424
|
return new Number( str, type );
|
|
417
425
|
|
|
426
|
+
} else if ( firstToken.isString ) {
|
|
427
|
+
|
|
428
|
+
return new String( firstToken.str );
|
|
429
|
+
|
|
418
430
|
} else if ( firstToken.isLiteral ) {
|
|
419
431
|
|
|
420
432
|
if ( firstToken.str === 'return' ) {
|
|
@@ -629,6 +641,28 @@ class GLSLDecoder {
|
|
|
629
641
|
|
|
630
642
|
}
|
|
631
643
|
|
|
644
|
+
parseUniform() {
|
|
645
|
+
|
|
646
|
+
const tokens = this.readTokensUntil( ';' );
|
|
647
|
+
|
|
648
|
+
const type = tokens[ 1 ].str;
|
|
649
|
+
const name = tokens[ 2 ].str;
|
|
650
|
+
|
|
651
|
+
return new Uniform( type, name );
|
|
652
|
+
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
parseVarying() {
|
|
656
|
+
|
|
657
|
+
const tokens = this.readTokensUntil( ';' );
|
|
658
|
+
|
|
659
|
+
const type = tokens[ 1 ].str;
|
|
660
|
+
const name = tokens[ 2 ].str;
|
|
661
|
+
|
|
662
|
+
return new Varying( type, name );
|
|
663
|
+
|
|
664
|
+
}
|
|
665
|
+
|
|
632
666
|
parseReturn() {
|
|
633
667
|
|
|
634
668
|
this.readToken(); // skip 'return'
|
|
@@ -716,7 +750,7 @@ class GLSLDecoder {
|
|
|
716
750
|
|
|
717
751
|
let current = conditional;
|
|
718
752
|
|
|
719
|
-
while ( this.getToken().str === 'else' ) {
|
|
753
|
+
while ( this.getToken() && this.getToken().str === 'else' ) {
|
|
720
754
|
|
|
721
755
|
this.readToken(); // skip 'else'
|
|
722
756
|
|
|
@@ -778,6 +812,14 @@ class GLSLDecoder {
|
|
|
778
812
|
|
|
779
813
|
statement = this.parseVariables();
|
|
780
814
|
|
|
815
|
+
} else if ( token.str === 'uniform' ) {
|
|
816
|
+
|
|
817
|
+
statement = this.parseUniform();
|
|
818
|
+
|
|
819
|
+
} else if ( token.str === 'varying' ) {
|
|
820
|
+
|
|
821
|
+
statement = this.parseVarying();
|
|
822
|
+
|
|
781
823
|
} else if ( isType( token.str ) ) {
|
|
782
824
|
|
|
783
825
|
if ( this.getToken( 2 ).str === '(' ) {
|
|
@@ -896,4 +938,4 @@ class GLSLDecoder {
|
|
|
896
938
|
|
|
897
939
|
}
|
|
898
940
|
|
|
899
|
-
export default GLSLDecoder;
|
|
941
|
+
export default GLSLDecoder;
|
|
@@ -7,9 +7,9 @@ class ShaderToyDecoder extends GLSLDecoder {
|
|
|
7
7
|
|
|
8
8
|
super();
|
|
9
9
|
|
|
10
|
-
this.
|
|
11
|
-
this.
|
|
12
|
-
this.
|
|
10
|
+
this.addPolyfill( 'iTime', 'float iTime = timerGlobal();' );
|
|
11
|
+
this.addPolyfill( 'iResolution', 'vec2 iResolution = viewportResolution;' );
|
|
12
|
+
this.addPolyfill( 'fragCoord', 'vec2 fragCoord = vec2( viewportCoordinate.x, viewportResolution.y - viewportCoordinate.y );' );
|
|
13
13
|
|
|
14
14
|
}
|
|
15
15
|
|
|
@@ -46,4 +46,4 @@ class ShaderToyDecoder extends GLSLDecoder {
|
|
|
46
46
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
export default ShaderToyDecoder;
|
|
49
|
+
export default ShaderToyDecoder;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { REVISION } from 'three';
|
|
2
2
|
import { VariableDeclaration, Accessor } from './AST.js';
|
|
3
|
-
import * as Nodes from '
|
|
3
|
+
import * as Nodes from '../nodes/Nodes.js';
|
|
4
4
|
|
|
5
5
|
const opLib = {
|
|
6
6
|
'=': 'assign',
|
|
@@ -27,7 +27,7 @@ const opLib = {
|
|
|
27
27
|
'*=': 'mulAssign',
|
|
28
28
|
'/=': 'divAssign',
|
|
29
29
|
'%=': 'remainderAssign',
|
|
30
|
-
'^=': '
|
|
30
|
+
'^=': 'bitXorAssign',
|
|
31
31
|
'&=': 'bitAndAssign',
|
|
32
32
|
'|=': 'bitOrAssign',
|
|
33
33
|
'<<=': 'shiftLeftAssign',
|
|
@@ -51,13 +51,15 @@ class TSLEncoder {
|
|
|
51
51
|
|
|
52
52
|
this.tab = '';
|
|
53
53
|
this.imports = new Set();
|
|
54
|
-
this.
|
|
54
|
+
this.global = new Set();
|
|
55
|
+
this.overloadings = new Map();
|
|
55
56
|
this.layoutsCode = '';
|
|
56
57
|
this.iife = false;
|
|
57
58
|
this.uniqueNames = false;
|
|
59
|
+
this.reference = false;
|
|
58
60
|
|
|
59
61
|
this._currentProperties = {};
|
|
60
|
-
this.
|
|
62
|
+
this._lastStatement = null;
|
|
61
63
|
|
|
62
64
|
}
|
|
63
65
|
|
|
@@ -67,7 +69,7 @@ class TSLEncoder {
|
|
|
67
69
|
|
|
68
70
|
name = name.split( '.' )[ 0 ];
|
|
69
71
|
|
|
70
|
-
if ( Nodes[ name ] !== undefined && this.
|
|
72
|
+
if ( Nodes[ name ] !== undefined && this.global.has( name ) === false && this._currentProperties[ name ] === undefined ) {
|
|
71
73
|
|
|
72
74
|
this.imports.add( name );
|
|
73
75
|
|
|
@@ -75,10 +77,45 @@ class TSLEncoder {
|
|
|
75
77
|
|
|
76
78
|
}
|
|
77
79
|
|
|
80
|
+
emitUniform( node ) {
|
|
81
|
+
|
|
82
|
+
let code = `const ${ node.name } = `;
|
|
83
|
+
|
|
84
|
+
if ( this.reference === true ) {
|
|
85
|
+
|
|
86
|
+
this.addImport( 'reference' );
|
|
87
|
+
|
|
88
|
+
this.global.add( node.name );
|
|
89
|
+
|
|
90
|
+
//code += `reference( '${ node.name }', '${ node.type }', uniforms )`;
|
|
91
|
+
|
|
92
|
+
// legacy
|
|
93
|
+
code += `reference( 'value', '${ node.type }', uniforms[ '${ node.name }' ] )`;
|
|
94
|
+
|
|
95
|
+
} else {
|
|
96
|
+
|
|
97
|
+
this.addImport( 'uniform' );
|
|
98
|
+
|
|
99
|
+
this.global.add( node.name );
|
|
100
|
+
|
|
101
|
+
code += `uniform( '${ node.type }' )`;
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return code;
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
78
109
|
emitExpression( node ) {
|
|
79
110
|
|
|
80
111
|
let code;
|
|
81
112
|
|
|
113
|
+
/*@TODO: else if ( node.isVarying ) {
|
|
114
|
+
|
|
115
|
+
code = this.emitVarying( node );
|
|
116
|
+
|
|
117
|
+
}*/
|
|
118
|
+
|
|
82
119
|
if ( node.isAccessor ) {
|
|
83
120
|
|
|
84
121
|
this.addImport( node.property );
|
|
@@ -99,6 +136,10 @@ class TSLEncoder {
|
|
|
99
136
|
|
|
100
137
|
}
|
|
101
138
|
|
|
139
|
+
} else if ( node.isString ) {
|
|
140
|
+
|
|
141
|
+
code = '\'' + node.value + '\'';
|
|
142
|
+
|
|
102
143
|
} else if ( node.isOperator ) {
|
|
103
144
|
|
|
104
145
|
const opFn = opLib[ node.type ] || node.type;
|
|
@@ -194,6 +235,10 @@ class TSLEncoder {
|
|
|
194
235
|
|
|
195
236
|
code = this.emitVariables( node );
|
|
196
237
|
|
|
238
|
+
} else if ( node.isUniform ) {
|
|
239
|
+
|
|
240
|
+
code = this.emitUniform( node );
|
|
241
|
+
|
|
197
242
|
} else if ( node.isTernary ) {
|
|
198
243
|
|
|
199
244
|
code = this.emitTernary( node );
|
|
@@ -204,7 +249,7 @@ class TSLEncoder {
|
|
|
204
249
|
|
|
205
250
|
} else if ( node.isUnary && node.expression.isNumber ) {
|
|
206
251
|
|
|
207
|
-
code = node.type + node.expression.value;
|
|
252
|
+
code = node.type + ' ' + node.expression.value;
|
|
208
253
|
|
|
209
254
|
} else if ( node.isUnary ) {
|
|
210
255
|
|
|
@@ -232,7 +277,7 @@ class TSLEncoder {
|
|
|
232
277
|
|
|
233
278
|
} else {
|
|
234
279
|
|
|
235
|
-
console.
|
|
280
|
+
console.warn( 'Unknown node type', node );
|
|
236
281
|
|
|
237
282
|
}
|
|
238
283
|
|
|
@@ -291,7 +336,7 @@ class TSLEncoder {
|
|
|
291
336
|
|
|
292
337
|
let ifStr = `If( ${ condStr }, () => {
|
|
293
338
|
|
|
294
|
-
${ bodyStr }
|
|
339
|
+
${ bodyStr }
|
|
295
340
|
|
|
296
341
|
${ this.tab }} )`;
|
|
297
342
|
|
|
@@ -305,7 +350,7 @@ ${ this.tab }} )`;
|
|
|
305
350
|
|
|
306
351
|
const elseCondStr = this.emitExpression( current.elseConditional.cond );
|
|
307
352
|
|
|
308
|
-
ifStr += `.elseif(
|
|
353
|
+
ifStr += `.elseif( ${ elseCondStr }, () => {
|
|
309
354
|
|
|
310
355
|
${ elseBodyStr }
|
|
311
356
|
|
|
@@ -449,6 +494,18 @@ ${ this.tab }} )`;
|
|
|
449
494
|
|
|
450
495
|
}
|
|
451
496
|
|
|
497
|
+
/*emitVarying( node ) { }*/
|
|
498
|
+
|
|
499
|
+
emitOverloadingFunction( nodes ) {
|
|
500
|
+
|
|
501
|
+
const { name } = nodes[ 0 ];
|
|
502
|
+
|
|
503
|
+
this.addImport( 'overloadingFn' );
|
|
504
|
+
|
|
505
|
+
return `const ${ name } = overloadingFn( [ ${ nodes.map( node => node.name + '_' + nodes.indexOf( node ) ).join( ', ' ) } ] );\n`;
|
|
506
|
+
|
|
507
|
+
}
|
|
508
|
+
|
|
452
509
|
emitFunction( node ) {
|
|
453
510
|
|
|
454
511
|
const { name, type } = node;
|
|
@@ -503,7 +560,30 @@ ${ this.tab }} )`;
|
|
|
503
560
|
const paramsStr = params.length > 0 ? ' [ ' + params.join( ', ' ) + ' ] ' : '';
|
|
504
561
|
const bodyStr = this.emitBody( node.body );
|
|
505
562
|
|
|
506
|
-
|
|
563
|
+
let fnName = name;
|
|
564
|
+
let overloadingNodes = null;
|
|
565
|
+
|
|
566
|
+
if ( this.overloadings.has( name ) ) {
|
|
567
|
+
|
|
568
|
+
const overloadings = this.overloadings.get( name );
|
|
569
|
+
|
|
570
|
+
if ( overloadings.length > 1 ) {
|
|
571
|
+
|
|
572
|
+
const index = overloadings.indexOf( node );
|
|
573
|
+
|
|
574
|
+
fnName += '_' + index;
|
|
575
|
+
|
|
576
|
+
if ( index === overloadings.length - 1 ) {
|
|
577
|
+
|
|
578
|
+
overloadingNodes = overloadings;
|
|
579
|
+
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
let funcStr = `const ${ fnName } = tslFn( (${ paramsStr }) => {
|
|
507
587
|
|
|
508
588
|
${ bodyStr }
|
|
509
589
|
|
|
@@ -513,9 +593,9 @@ ${ this.tab }} );\n`;
|
|
|
513
593
|
|
|
514
594
|
if ( node.layout !== false && hasPointer === false ) {
|
|
515
595
|
|
|
516
|
-
const uniqueName = this.uniqueNames ?
|
|
596
|
+
const uniqueName = this.uniqueNames ? fnName + '_' + Math.random().toString( 36 ).slice( 2 ) : fnName;
|
|
517
597
|
|
|
518
|
-
this.layoutsCode += `${ this.tab +
|
|
598
|
+
this.layoutsCode += `${ this.tab + fnName }.setLayout( {
|
|
519
599
|
${ this.tab }\tname: '${ uniqueName }',
|
|
520
600
|
${ this.tab }\ttype: '${ type }',
|
|
521
601
|
${ this.tab }\tinputs: [${ layoutInput }]
|
|
@@ -525,7 +605,13 @@ ${ this.tab }} );\n\n`;
|
|
|
525
605
|
|
|
526
606
|
this.imports.add( 'tslFn' );
|
|
527
607
|
|
|
528
|
-
this.
|
|
608
|
+
this.global.add( node.name );
|
|
609
|
+
|
|
610
|
+
if ( overloadingNodes !== null ) {
|
|
611
|
+
|
|
612
|
+
funcStr += '\n' + this.emitOverloadingFunction( overloadingNodes );
|
|
613
|
+
|
|
614
|
+
}
|
|
529
615
|
|
|
530
616
|
return funcStr;
|
|
531
617
|
|
|
@@ -533,13 +619,13 @@ ${ this.tab }} );\n\n`;
|
|
|
533
619
|
|
|
534
620
|
setLastStatement( statement ) {
|
|
535
621
|
|
|
536
|
-
this.
|
|
622
|
+
this._lastStatement = statement;
|
|
537
623
|
|
|
538
624
|
}
|
|
539
625
|
|
|
540
626
|
emitExtraLine( statement ) {
|
|
541
627
|
|
|
542
|
-
const last = this.
|
|
628
|
+
const last = this._lastStatement;
|
|
543
629
|
if ( last === null ) return '';
|
|
544
630
|
|
|
545
631
|
if ( statement.isReturn ) return '\n';
|
|
@@ -560,6 +646,24 @@ ${ this.tab }} );\n\n`;
|
|
|
560
646
|
|
|
561
647
|
if ( this.iife ) this.tab += '\t';
|
|
562
648
|
|
|
649
|
+
const overloadings = this.overloadings;
|
|
650
|
+
|
|
651
|
+
for ( const statement of ast.body ) {
|
|
652
|
+
|
|
653
|
+
if ( statement.isFunctionDeclaration ) {
|
|
654
|
+
|
|
655
|
+
if ( overloadings.has( statement.name ) === false ) {
|
|
656
|
+
|
|
657
|
+
overloadings.set( statement.name, [] );
|
|
658
|
+
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
overloadings.get( statement.name ).push( statement );
|
|
662
|
+
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
}
|
|
666
|
+
|
|
563
667
|
for ( const statement of ast.body ) {
|
|
564
668
|
|
|
565
669
|
code += this.emitExtraLine( statement );
|
|
@@ -579,7 +683,7 @@ ${ this.tab }} );\n\n`;
|
|
|
579
683
|
}
|
|
580
684
|
|
|
581
685
|
const imports = [ ...this.imports ];
|
|
582
|
-
const
|
|
686
|
+
const exports = [ ...this.global ];
|
|
583
687
|
|
|
584
688
|
const layouts = this.layoutsCode.length > 0 ? `\n${ this.tab }// layouts\n\n` + this.layoutsCode : '';
|
|
585
689
|
|
|
@@ -588,17 +692,17 @@ ${ this.tab }} );\n\n`;
|
|
|
588
692
|
|
|
589
693
|
if ( this.iife ) {
|
|
590
694
|
|
|
591
|
-
header += '( function ( TSL ) {\n\n';
|
|
695
|
+
header += '( function ( TSL, uniforms ) {\n\n';
|
|
592
696
|
|
|
593
697
|
header += imports.length > 0 ? '\tconst { ' + imports.join( ', ' ) + ' } = TSL;\n' : '';
|
|
594
|
-
footer +=
|
|
698
|
+
footer += exports.length > 0 ? '\treturn { ' + exports.join( ', ' ) + ' };\n' : '';
|
|
595
699
|
|
|
596
700
|
footer += '\n} );';
|
|
597
701
|
|
|
598
702
|
} else {
|
|
599
703
|
|
|
600
704
|
header += imports.length > 0 ? 'import { ' + imports.join( ', ' ) + ' } from \'three/nodes\';\n' : '';
|
|
601
|
-
footer +=
|
|
705
|
+
footer += exports.length > 0 ? 'export { ' + exports.join( ', ' ) + ' };\n' : '';
|
|
602
706
|
|
|
603
707
|
}
|
|
604
708
|
|
|
@@ -608,4 +712,4 @@ ${ this.tab }} );\n\n`;
|
|
|
608
712
|
|
|
609
713
|
}
|
|
610
714
|
|
|
611
|
-
export default TSLEncoder;
|
|
715
|
+
export default TSLEncoder;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// Hybrid radix sort from
|
|
2
|
+
// - https://gist.github.com/sciecode/93ed864dd77c5c8803c6a86698d68dab
|
|
3
|
+
// - https://github.com/mrdoob/three.js/pull/27202#issuecomment-1817640271
|
|
4
|
+
const POWER = 3;
|
|
5
|
+
const BIT_MAX = 32;
|
|
6
|
+
const BIN_BITS = 1 << POWER;
|
|
7
|
+
const BIN_SIZE = 1 << BIN_BITS;
|
|
8
|
+
const BIN_MAX = BIN_SIZE - 1;
|
|
9
|
+
const ITERATIONS = BIT_MAX / BIN_BITS;
|
|
10
|
+
|
|
11
|
+
const bins = new Array( ITERATIONS );
|
|
12
|
+
const bins_buffer = new ArrayBuffer( ( ITERATIONS + 1 ) * BIN_SIZE * 4 );
|
|
13
|
+
|
|
14
|
+
let c = 0;
|
|
15
|
+
for ( let i = 0; i < ( ITERATIONS + 1 ); i ++ ) {
|
|
16
|
+
bins[ i ] = new Uint32Array( bins_buffer, c, BIN_SIZE );
|
|
17
|
+
c += BIN_SIZE * 4;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const defaultGet = ( el ) => el;
|
|
21
|
+
|
|
22
|
+
export const radixSort = ( arr, opt ) => {
|
|
23
|
+
|
|
24
|
+
const len = arr.length;
|
|
25
|
+
|
|
26
|
+
const options = opt || {};
|
|
27
|
+
const aux = options.aux || new arr.constructor( len );
|
|
28
|
+
const get = options.get || defaultGet;
|
|
29
|
+
|
|
30
|
+
const data = [ arr, aux ];
|
|
31
|
+
|
|
32
|
+
let compare, accumulate, recurse;
|
|
33
|
+
|
|
34
|
+
if ( options.reversed ) {
|
|
35
|
+
|
|
36
|
+
compare = ( a, b ) => a < b;
|
|
37
|
+
accumulate = ( bin ) => {
|
|
38
|
+
|
|
39
|
+
for ( let j = BIN_SIZE - 2; j >= 0; j -- )
|
|
40
|
+
bin[ j ] += bin[ j + 1 ];
|
|
41
|
+
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
recurse = ( cache, depth, start ) => {
|
|
45
|
+
|
|
46
|
+
let prev = 0;
|
|
47
|
+
for ( let j = BIN_MAX; j >= 0; j -- ) {
|
|
48
|
+
|
|
49
|
+
const cur = cache[ j ], diff = cur - prev;
|
|
50
|
+
if ( diff != 0 ) {
|
|
51
|
+
|
|
52
|
+
if ( diff > 32 )
|
|
53
|
+
radixSortBlock( depth + 1, start + prev, diff );
|
|
54
|
+
else
|
|
55
|
+
insertionSortBlock( depth + 1, start + prev, diff );
|
|
56
|
+
prev = cur;
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
} else {
|
|
65
|
+
|
|
66
|
+
compare = ( a, b ) => a > b;
|
|
67
|
+
accumulate = ( bin ) => {
|
|
68
|
+
|
|
69
|
+
for ( let j = 1; j < BIN_SIZE; j ++ )
|
|
70
|
+
bin[ j ] += bin[ j - 1 ];
|
|
71
|
+
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
recurse = ( cache, depth, start ) => {
|
|
75
|
+
|
|
76
|
+
let prev = 0;
|
|
77
|
+
for ( let j = 0; j < BIN_SIZE; j ++ ) {
|
|
78
|
+
|
|
79
|
+
const cur = cache[ j ], diff = cur - prev;
|
|
80
|
+
if ( diff != 0 ) {
|
|
81
|
+
|
|
82
|
+
if ( diff > 32 )
|
|
83
|
+
radixSortBlock( depth + 1, start + prev, diff );
|
|
84
|
+
else
|
|
85
|
+
insertionSortBlock( depth + 1, start + prev, diff );
|
|
86
|
+
prev = cur;
|
|
87
|
+
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const insertionSortBlock = ( depth, start, len ) => {
|
|
97
|
+
|
|
98
|
+
const a = data[ depth & 1 ];
|
|
99
|
+
const b = data[ ( depth + 1 ) & 1 ];
|
|
100
|
+
|
|
101
|
+
for ( let j = start + 1; j < start + len; j ++ ) {
|
|
102
|
+
|
|
103
|
+
const p = a[ j ], t = get( p );
|
|
104
|
+
let i = j;
|
|
105
|
+
while ( i > 0 ) {
|
|
106
|
+
|
|
107
|
+
if ( compare( get( a[ i - 1 ] ), t ) )
|
|
108
|
+
a[ i ] = a[ -- i ];
|
|
109
|
+
else
|
|
110
|
+
break;
|
|
111
|
+
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
a[ i ] = p;
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if ( ( depth & 1 ) == 1 ) {
|
|
119
|
+
|
|
120
|
+
for ( let i = start; i < start + len; i ++ )
|
|
121
|
+
b[ i ] = a[ i ];
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
const radixSortBlock = ( depth, start, len ) => {
|
|
128
|
+
|
|
129
|
+
const a = data[ depth & 1 ];
|
|
130
|
+
const b = data[ ( depth + 1 ) & 1 ];
|
|
131
|
+
|
|
132
|
+
const shift = ( 3 - depth ) << POWER;
|
|
133
|
+
const end = start + len;
|
|
134
|
+
|
|
135
|
+
const cache = bins[ depth ];
|
|
136
|
+
const bin = bins[ depth + 1 ];
|
|
137
|
+
|
|
138
|
+
bin.fill( 0 );
|
|
139
|
+
|
|
140
|
+
for ( let j = start; j < end; j ++ )
|
|
141
|
+
bin[ ( get( a[ j ] ) >> shift ) & BIN_MAX ] ++;
|
|
142
|
+
|
|
143
|
+
accumulate( bin );
|
|
144
|
+
|
|
145
|
+
cache.set( bin );
|
|
146
|
+
|
|
147
|
+
for ( let j = end - 1; j >= start; j -- )
|
|
148
|
+
b[ start + -- bin[ ( get( a[ j ] ) >> shift ) & BIN_MAX ] ] = a[ j ];
|
|
149
|
+
|
|
150
|
+
if ( depth == ITERATIONS - 1 ) return;
|
|
151
|
+
|
|
152
|
+
recurse( cache, depth, start );
|
|
153
|
+
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
radixSortBlock( 0, 0, len );
|
|
157
|
+
|
|
158
|
+
};
|