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.
Files changed (191) hide show
  1. package/build/three.cjs +1720 -380
  2. package/build/three.js +1720 -380
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +1719 -381
  5. package/build/three.module.min.js +1 -1
  6. package/examples/jsm/Addons.js +2 -1
  7. package/examples/jsm/controls/OrbitControls.js +50 -40
  8. package/examples/jsm/csm/CSMShader.js +52 -47
  9. package/examples/jsm/exporters/GLTFExporter.js +79 -1
  10. package/examples/jsm/exporters/USDZExporter.js +27 -19
  11. package/examples/jsm/helpers/TextureHelper.js +237 -0
  12. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  13. package/examples/jsm/lines/LineMaterial.js +16 -33
  14. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  15. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  16. package/examples/jsm/loaders/FBXLoader.js +294 -124
  17. package/examples/jsm/loaders/GLTFLoader.js +71 -3
  18. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  19. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  20. package/examples/jsm/loaders/SVGLoader.js +4 -4
  21. package/examples/jsm/loaders/USDZLoader.js +3 -17
  22. package/examples/jsm/math/Octree.js +15 -4
  23. package/examples/jsm/misc/Timer.js +119 -0
  24. package/examples/jsm/misc/TubePainter.js +3 -6
  25. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  26. package/examples/jsm/nodes/Nodes.js +11 -7
  27. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  28. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  29. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  30. package/examples/jsm/nodes/accessors/ModelNode.js +1 -1
  31. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  32. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  33. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  34. package/examples/jsm/nodes/accessors/TextureNode.js +122 -36
  35. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  36. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  37. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  38. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  39. package/examples/jsm/nodes/core/Node.js +6 -3
  40. package/examples/jsm/nodes/core/NodeBuilder.js +84 -27
  41. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  42. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  43. package/examples/jsm/nodes/core/NodeUtils.js +3 -7
  44. package/examples/jsm/nodes/core/OutputStructNode.js +3 -3
  45. package/examples/jsm/nodes/core/PropertyNode.js +17 -2
  46. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  47. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  48. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  49. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  50. package/examples/jsm/nodes/core/VarNode.js +2 -0
  51. package/examples/jsm/nodes/core/VaryingNode.js +1 -7
  52. package/examples/jsm/nodes/display/BumpMapNode.js +1 -1
  53. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  54. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  55. package/examples/jsm/nodes/display/PassNode.js +182 -0
  56. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  57. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  58. package/examples/jsm/nodes/display/ViewportNode.js +5 -8
  59. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +1 -1
  60. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +52 -17
  61. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -12
  62. package/examples/jsm/nodes/lighting/LightsNode.js +34 -32
  63. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +1 -1
  64. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +12 -12
  65. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  66. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +1 -1
  67. package/examples/jsm/nodes/materials/NodeMaterial.js +66 -41
  68. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  69. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  70. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  71. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  72. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  73. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  74. package/examples/jsm/nodes/math/MathNode.js +2 -0
  75. package/examples/jsm/nodes/math/OperatorNode.js +19 -6
  76. package/examples/jsm/nodes/shadernode/ShaderNode.js +32 -3
  77. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  78. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  79. package/examples/jsm/nodes/utils/SplitNode.js +8 -2
  80. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  81. package/examples/jsm/objects/QuadMesh.js +60 -0
  82. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  83. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  84. package/examples/jsm/renderers/common/Animation.js +10 -21
  85. package/examples/jsm/renderers/common/Backend.js +19 -3
  86. package/examples/jsm/renderers/common/Background.js +20 -22
  87. package/examples/jsm/renderers/common/Bindings.js +30 -21
  88. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  89. package/examples/jsm/renderers/common/Color4.js +37 -0
  90. package/examples/jsm/renderers/common/Geometries.js +4 -4
  91. package/examples/jsm/renderers/common/Info.js +12 -2
  92. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  93. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  94. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  95. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  96. package/examples/jsm/renderers/common/RenderObject.js +13 -1
  97. package/examples/jsm/renderers/common/RenderObjects.js +4 -2
  98. package/examples/jsm/renderers/common/Renderer.js +137 -37
  99. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  100. package/examples/jsm/renderers/common/Textures.js +4 -1
  101. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  102. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  103. package/examples/jsm/renderers/common/nodes/Nodes.js +74 -7
  104. package/examples/jsm/renderers/webgl/WebGLBackend.js +91 -33
  105. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +100 -31
  106. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +57 -5
  107. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  108. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  109. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  110. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  111. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  112. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  113. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  114. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +186 -137
  115. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  116. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +209 -90
  117. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  118. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  119. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  120. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  121. package/examples/jsm/shaders/FXAAShader.js +133 -133
  122. package/examples/jsm/shaders/GTAOShader.js +424 -0
  123. package/examples/jsm/shaders/OutputShader.js +4 -0
  124. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  125. package/examples/jsm/shaders/SAOShader.js +2 -3
  126. package/examples/jsm/shaders/SSAOShader.js +2 -3
  127. package/examples/jsm/transpiler/AST.js +40 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +50 -8
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +4 -4
  130. package/examples/jsm/transpiler/TSLEncoder.js +124 -20
  131. package/examples/jsm/utils/SortUtils.js +158 -0
  132. package/examples/jsm/utils/TextureUtils.js +33 -21
  133. package/examples/jsm/webxr/ARButton.js +14 -0
  134. package/examples/jsm/webxr/VRButton.js +23 -8
  135. package/examples/jsm/webxr/XRButton.js +25 -11
  136. package/package.json +5 -6
  137. package/src/Three.js +1 -0
  138. package/src/constants.js +2 -1
  139. package/src/core/BufferAttribute.js +21 -2
  140. package/src/core/InterleavedBuffer.js +21 -1
  141. package/src/core/Object3D.js +60 -12
  142. package/src/core/UniformsGroup.js +7 -1
  143. package/src/extras/curves/LineCurve3.js +4 -0
  144. package/src/loaders/AudioLoader.js +1 -1
  145. package/src/loaders/BufferGeometryLoader.js +0 -7
  146. package/src/loaders/ImageBitmapLoader.js +25 -1
  147. package/src/loaders/ObjectLoader.js +49 -0
  148. package/src/materials/ShaderMaterial.js +2 -1
  149. package/src/math/ColorManagement.js +0 -16
  150. package/src/math/Quaternion.js +5 -4
  151. package/src/math/Sphere.js +2 -0
  152. package/src/math/Triangle.js +17 -5
  153. package/src/objects/BatchedMesh.js +1020 -0
  154. package/src/objects/Skeleton.js +1 -3
  155. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  156. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  157. package/src/renderers/WebGLRenderer.js +24 -19
  158. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  159. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  160. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  161. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  162. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  163. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  164. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  165. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  166. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  167. package/src/renderers/shaders/ShaderChunk.js +4 -0
  168. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  169. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  170. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  171. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  172. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  173. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  174. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  175. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -0
  176. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  177. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  178. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  179. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  180. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  181. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  182. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  183. package/src/renderers/webgl/WebGLLights.js +11 -2
  184. package/src/renderers/webgl/WebGLProgram.js +20 -1
  185. package/src/renderers/webgl/WebGLPrograms.js +5 -0
  186. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  187. package/src/renderers/webgl/WebGLTextures.js +7 -11
  188. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  189. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  190. package/src/renderers/webxr/WebXRManager.js +16 -0
  191. 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 += token.str.length;
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.addKeyword( 'gl_FragCoord', 'vec2 gl_FragCoord = vec2( viewportCoordinate.x, viewportCoordinate.y.oneMinus() );' );
221
+ this.addPolyfill( 'gl_FragCoord', 'vec2 gl_FragCoord = vec2( viewportCoordinate.x, viewportCoordinate.y.oneMinus() );' );
222
222
 
223
223
  }
224
224
 
225
- addKeyword( name, polyfill ) {
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
- if ( /^(0x)/.test( firstToken.str ) ) type = 'int';
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
- const str = firstToken.str.replace( /u$/, '' );
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.addKeyword( 'iTime', 'float iTime = timerGlobal();' );
11
- this.addKeyword( 'iResolution', 'vec2 iResolution = viewportResolution;' );
12
- this.addKeyword( 'fragCoord', 'vec2 fragCoord = vec2( viewportCoordinate.x, viewportResolution.y - viewportCoordinate.y );' );
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 'three/nodes';
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
- '^=': 'xorAssign',
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.functions = new Set();
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._lastStatment = null;
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.functions.has( name ) === false && this._currentProperties[ name ] === undefined ) {
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.error( 'Unknown node type', node );
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( ( ${ elseCondStr } ) => {
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
- const funcStr = `const ${ name } = tslFn( (${ paramsStr }) => {
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 ? name + '_' + Math.random().toString( 36 ).slice( 2 ) : name;
596
+ const uniqueName = this.uniqueNames ? fnName + '_' + Math.random().toString( 36 ).slice( 2 ) : fnName;
517
597
 
518
- this.layoutsCode += `${ this.tab + name }.setLayout( {
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.functions.add( node.name );
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._lastStatment = statement;
622
+ this._lastStatement = statement;
537
623
 
538
624
  }
539
625
 
540
626
  emitExtraLine( statement ) {
541
627
 
542
- const last = this._lastStatment;
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 functions = [ ...this.functions ];
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 += functions.length > 0 ? '\treturn { ' + functions.join( ', ' ) + ' };\n' : '';
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 += functions.length > 0 ? 'export { ' + functions.join( ', ' ) + ' };\n' : '';
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
+ };