super-three 0.157.1 → 0.158.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +1013 -790
  3. package/build/three.js +1013 -790
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +1008 -791
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +290 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +12 -1
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +1 -1
  12. package/examples/jsm/exporters/GLTFExporter.js +72 -2
  13. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  14. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  15. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  16. package/examples/jsm/libs/opentype.module.js +13 -75
  17. package/examples/jsm/libs/surfaceNet.js +201 -0
  18. package/examples/jsm/loaders/GLTFLoader.js +12 -3
  19. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  20. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  21. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  22. package/examples/jsm/math/Capsule.js +0 -55
  23. package/examples/jsm/math/Octree.js +70 -3
  24. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  25. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  26. package/examples/jsm/nodes/Nodes.js +6 -6
  27. package/examples/jsm/nodes/accessors/CubeTextureNode.js +3 -3
  28. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  29. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  30. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  31. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  32. package/examples/jsm/nodes/accessors/MorphNode.js +5 -5
  33. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  34. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  35. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  36. package/examples/jsm/nodes/accessors/TextureNode.js +3 -3
  37. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  38. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  39. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  40. package/examples/jsm/nodes/core/Node.js +7 -12
  41. package/examples/jsm/nodes/core/NodeBuilder.js +126 -16
  42. package/examples/jsm/nodes/core/NodeUtils.js +4 -2
  43. package/examples/jsm/nodes/core/OutputStructNode.js +1 -1
  44. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  45. package/examples/jsm/nodes/core/PropertyNode.js +4 -10
  46. package/examples/jsm/nodes/core/StackNode.js +7 -17
  47. package/examples/jsm/nodes/core/TempNode.js +1 -1
  48. package/examples/jsm/nodes/core/VarNode.js +6 -35
  49. package/examples/jsm/nodes/core/VaryingNode.js +2 -0
  50. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  51. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  52. package/examples/jsm/nodes/display/ViewportNode.js +14 -4
  53. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  54. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  55. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  56. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  57. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  58. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  59. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  60. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  61. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +19 -5
  62. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  63. package/examples/jsm/nodes/lighting/EnvironmentNode.js +0 -6
  64. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  65. package/examples/jsm/nodes/lighting/LightsNode.js +62 -4
  66. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  67. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  68. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  69. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +70 -71
  70. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  71. package/examples/jsm/nodes/materials/Materials.js +1 -0
  72. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -2
  73. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  74. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  75. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  76. package/examples/jsm/nodes/materials/NodeMaterial.js +17 -20
  77. package/examples/jsm/nodes/materialx/lib/mx_noise.js +5 -5
  78. package/examples/jsm/nodes/math/OperatorNode.js +5 -21
  79. package/examples/jsm/nodes/shadernode/ShaderNode.js +128 -9
  80. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  81. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  82. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  83. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  84. package/examples/jsm/nodes/utils/SplitNode.js +2 -0
  85. package/examples/jsm/objects/BatchedMesh.js +586 -0
  86. package/examples/jsm/objects/InstancedPoints.js +21 -0
  87. package/examples/jsm/objects/Lensflare.js +20 -0
  88. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  89. package/examples/jsm/objects/Refractor.js +3 -0
  90. package/examples/jsm/objects/Sky.js +5 -3
  91. package/examples/jsm/objects/Water.js +5 -2
  92. package/examples/jsm/objects/Water2.js +3 -0
  93. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  94. package/examples/jsm/physics/RapierPhysics.js +21 -0
  95. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  96. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  97. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  98. package/examples/jsm/postprocessing/Pass.js +14 -3
  99. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  100. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  101. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  102. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  103. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  104. package/examples/jsm/renderers/common/Bindings.js +1 -1
  105. package/examples/jsm/renderers/common/RenderObject.js +8 -1
  106. package/examples/jsm/renderers/common/RenderObjects.js +1 -1
  107. package/examples/jsm/renderers/common/Textures.js +4 -36
  108. package/examples/jsm/renderers/common/nodes/Nodes.js +53 -18
  109. package/examples/jsm/renderers/webgl/WebGLBackend.js +291 -50
  110. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +88 -12
  111. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +40 -5
  112. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  113. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +2 -0
  114. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +36 -4
  115. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  116. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  117. package/examples/jsm/shaders/BasicShader.js +2 -0
  118. package/examples/jsm/shaders/BlendShader.js +2 -0
  119. package/examples/jsm/shaders/BokehShader.js +2 -0
  120. package/examples/jsm/shaders/BokehShader2.js +4 -0
  121. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  122. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  123. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  124. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  125. package/examples/jsm/shaders/FXAAShader.js +2 -0
  126. package/examples/jsm/shaders/FilmShader.js +1 -1
  127. package/examples/jsm/shaders/FocusShader.js +2 -0
  128. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  129. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  130. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  131. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  132. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  133. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  134. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  135. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  136. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  137. package/examples/jsm/shaders/MirrorShader.js +2 -0
  138. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  139. package/examples/jsm/shaders/OutputShader.js +4 -5
  140. package/examples/jsm/shaders/SAOShader.js +5 -0
  141. package/examples/jsm/shaders/SMAAShader.js +6 -0
  142. package/examples/jsm/shaders/SSAOShader.js +6 -0
  143. package/examples/jsm/shaders/SSRShader.js +6 -0
  144. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  145. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  146. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  147. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  148. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  149. package/examples/jsm/shaders/VelocityShader.js +2 -0
  150. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  151. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  152. package/examples/jsm/transpiler/AST.js +231 -0
  153. package/examples/jsm/transpiler/GLSLDecoder.js +899 -0
  154. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  155. package/examples/jsm/transpiler/TSLEncoder.js +611 -0
  156. package/examples/jsm/transpiler/Transpiler.js +18 -0
  157. package/examples/jsm/webxr/VRButton.js +1 -1
  158. package/examples/jsm/webxr/XRButton.js +7 -5
  159. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  160. package/package.json +4 -1
  161. package/src/constants.js +7 -1
  162. package/src/extras/PMREMGenerator.js +7 -1
  163. package/src/loaders/MaterialLoader.js +10 -2
  164. package/src/materials/Material.js +27 -13
  165. package/src/math/Box3.js +35 -18
  166. package/src/math/Vector3.js +11 -12
  167. package/src/objects/SkinnedMesh.js +6 -7
  168. package/src/renderers/WebGLRenderer.js +142 -25
  169. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  170. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  171. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  172. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  173. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -2
  174. package/src/renderers/webgl/WebGLProgram.js +80 -50
  175. package/src/renderers/webgl/WebGLPrograms.js +3 -0
  176. package/src/renderers/webgl/WebGLState.js +25 -4
  177. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  178. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -1,5 +1,6 @@
1
- import { MathNode, GLSLNodeParser, NodeBuilder, NodeMaterial } from '../../../nodes/Nodes.js';
1
+ import { MathNode, GLSLNodeParser, NodeBuilder, NodeMaterial, FunctionNode } from '../../../nodes/Nodes.js';
2
2
 
3
+ import UniformBuffer from '../../common/UniformBuffer.js';
3
4
  import UniformsGroup from '../../common/UniformsGroup.js';
4
5
  import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
5
6
 
@@ -14,6 +15,10 @@ const precisionLib = {
14
15
  high: 'highp'
15
16
  };
16
17
 
18
+ const supports = {
19
+ instance: true
20
+ };
21
+
17
22
  class GLSLNodeBuilder extends NodeBuilder {
18
23
 
19
24
  constructor( object, renderer, scene = null ) {
@@ -38,6 +43,36 @@ class GLSLNodeBuilder extends NodeBuilder {
38
43
 
39
44
  }
40
45
 
46
+ buildFunctionNode( shaderNode ) {
47
+
48
+ const layout = shaderNode.layout;
49
+ const flowData = this.flowShaderNode( shaderNode );
50
+
51
+ const parameters = [];
52
+
53
+ for ( const input of layout.inputs ) {
54
+
55
+ parameters.push( this.getType( input.type ) + ' ' + input.name );
56
+
57
+ }
58
+
59
+ //
60
+
61
+ const code = `${ this.getType( layout.type ) } ${ layout.name }( ${ parameters.join( ', ' ) } ) {
62
+
63
+ ${ flowData.vars }
64
+
65
+ ${ flowData.code }
66
+ return ${ flowData.result };
67
+
68
+ }`;
69
+
70
+ //
71
+
72
+ return new FunctionNode( code );
73
+
74
+ }
75
+
41
76
  getTexture( texture, textureProperty, uvSnippet ) {
42
77
 
43
78
  if ( texture.isTextureCube ) {
@@ -82,11 +117,15 @@ class GLSLNodeBuilder extends NodeBuilder {
82
117
 
83
118
  const vars = this.vars[ shaderStage ];
84
119
 
85
- for ( const variable of vars ) {
120
+ if ( vars !== undefined ) {
121
+
122
+ for ( const variable of vars ) {
86
123
 
87
- if ( variable.isOutputStructVar ) continue;
124
+ if ( variable.isOutputStructVar ) continue;
88
125
 
89
- snippets.push( `${ this.getVar( variable.type, variable.name ) };` );
126
+ snippets.push( `${ this.getVar( variable.type, variable.name ) };` );
127
+
128
+ }
90
129
 
91
130
  }
92
131
 
@@ -122,6 +161,15 @@ class GLSLNodeBuilder extends NodeBuilder {
122
161
 
123
162
  snippet = `samplerCube ${uniform.name};`;
124
163
 
164
+ } else if ( uniform.type === 'buffer' ) {
165
+
166
+ const bufferNode = uniform.node;
167
+ const bufferType = this.getType( bufferNode.bufferType );
168
+ const bufferCount = bufferNode.bufferCount;
169
+
170
+ const bufferCountSnippet = bufferCount > 0 ? bufferCount : '';
171
+ snippet = `${bufferNode.name} {\n\t${bufferType} ${uniform.name}[${bufferCountSnippet}];\n};\n`;
172
+
125
173
  } else {
126
174
 
127
175
  const vectorType = this.getVectorType( uniform.type );
@@ -176,7 +224,7 @@ class GLSLNodeBuilder extends NodeBuilder {
176
224
 
177
225
  if ( shaderStage === 'vertex' ) {
178
226
 
179
- const attributes = this.attributes;
227
+ const attributes = this.getAttributesArray();
180
228
 
181
229
  let location = 0;
182
230
 
@@ -215,7 +263,7 @@ class GLSLNodeBuilder extends NodeBuilder {
215
263
 
216
264
  if ( structs.length === 0 ) {
217
265
 
218
- return "layout( location = 0 ) out vec4 fragColor;\n";
266
+ return 'layout( location = 0 ) out vec4 fragColor;\n';
219
267
 
220
268
  }
221
269
 
@@ -223,7 +271,7 @@ class GLSLNodeBuilder extends NodeBuilder {
223
271
 
224
272
  const struct = structs[ index ];
225
273
 
226
- let snippet = `\n`;
274
+ let snippet = '\n';
227
275
  snippet += this.getStructMembers( struct );
228
276
  snippet += '\n';
229
277
 
@@ -245,7 +293,10 @@ class GLSLNodeBuilder extends NodeBuilder {
245
293
 
246
294
  for ( const varying of varyings ) {
247
295
 
248
- snippet += `${varying.needsInterpolation ? 'out' : '/*out*/'} ${varying.type} ${varying.name};\n`;
296
+ const type = varying.type;
297
+ const flat = type === 'int' || type === 'uint' ? 'flat ' : '';
298
+
299
+ snippet += `${flat}${varying.needsInterpolation ? 'out' : '/*out*/'} ${type} ${varying.name};\n`;
249
300
 
250
301
  }
251
302
 
@@ -255,7 +306,10 @@ class GLSLNodeBuilder extends NodeBuilder {
255
306
 
256
307
  if ( varying.needsInterpolation ) {
257
308
 
258
- snippet += `in ${varying.type} ${varying.name};\n`;
309
+ const type = varying.type;
310
+ const flat = type === 'int' || type === 'uint' ? 'flat ' : '';
311
+
312
+ snippet += `${flat}in ${type} ${varying.name};\n`;
259
313
 
260
314
  }
261
315
 
@@ -273,6 +327,12 @@ class GLSLNodeBuilder extends NodeBuilder {
273
327
 
274
328
  }
275
329
 
330
+ getInstanceIndex() {
331
+
332
+ return 'uint( gl_InstanceID )';
333
+
334
+ }
335
+
276
336
  getFrontFacing() {
277
337
 
278
338
  return 'gl_FrontFacing';
@@ -285,6 +345,13 @@ class GLSLNodeBuilder extends NodeBuilder {
285
345
 
286
346
  }
287
347
 
348
+ isAvailable( name ) {
349
+
350
+ return supports[ name ] === true;
351
+
352
+ }
353
+
354
+
288
355
  isFlipY() {
289
356
 
290
357
  return true;
@@ -440,9 +507,6 @@ void main() {
440
507
  this.vertexShader = this._getGLSLVertexCode( shadersData.vertex );
441
508
  this.fragmentShader = this._getGLSLFragmentCode( shadersData.fragment );
442
509
 
443
- //console.log( this.vertexShader );
444
- //console.log( this.fragmentShader );
445
-
446
510
  } else {
447
511
 
448
512
  console.warn( 'GLSLNodeBuilder: compute shaders are not supported.' );
@@ -473,6 +537,18 @@ void main() {
473
537
 
474
538
  this.bindings[ shaderStage ].push( uniformGPU );
475
539
 
540
+ } else if ( type === 'buffer' ) {
541
+
542
+ node.name = `NodeBuffer_${node.id}`;
543
+
544
+ const buffer = new UniformBuffer( node.name, node.value );
545
+
546
+ uniformNode.name = `buffer${node.id}`;
547
+
548
+ this.bindings[ shaderStage ].push( buffer );
549
+
550
+ uniformGPU = buffer;
551
+
476
552
  } else {
477
553
 
478
554
  let uniformsGroup = this.uniformsGroup[ shaderStage ];
@@ -14,25 +14,41 @@ class WebGLAttributeUtils {
14
14
  const array = attribute.array;
15
15
  const usage = attribute.usage || gl.STATIC_DRAW;
16
16
 
17
- const bufferGPU = gl.createBuffer();
17
+ const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
18
+ const bufferData = backend.get( bufferAttribute );
18
19
 
19
- gl.bindBuffer( bufferType, bufferGPU );
20
- gl.bufferData( bufferType, array, usage );
21
- gl.bindBuffer( bufferType, null );
20
+ let bufferGPU = bufferData.bufferGPU;
21
+
22
+ if ( bufferGPU === undefined ) {
23
+
24
+ bufferGPU = gl.createBuffer();
25
+
26
+ gl.bindBuffer( bufferType, bufferGPU );
27
+ gl.bufferData( bufferType, array, usage );
28
+ gl.bindBuffer( bufferType, null );
29
+
30
+ bufferData.bufferGPU = bufferGPU;
31
+ bufferData.bufferType = bufferType;
32
+ bufferData.version = bufferAttribute.version;
33
+
34
+ }
22
35
 
23
36
  //attribute.onUploadCallback();
24
37
 
25
38
  let type;
39
+ let isFloat = false;
26
40
 
27
41
  if ( array instanceof Float32Array ) {
28
42
 
29
43
  type = gl.FLOAT;
44
+ isFloat = true;
30
45
 
31
46
  } else if ( array instanceof Uint16Array ) {
32
47
 
33
48
  if ( attribute.isFloat16BufferAttribute ) {
34
49
 
35
50
  type = gl.HALF_FLOAT;
51
+ isFloat = true;
36
52
 
37
53
  } else {
38
54
 
@@ -74,11 +90,30 @@ class WebGLAttributeUtils {
74
90
  bufferGPU,
75
91
  type,
76
92
  bytesPerElement: array.BYTES_PER_ELEMENT,
77
- version: attribute.version
93
+ version: attribute.version,
94
+ isFloat
78
95
  } );
79
96
 
80
97
  }
81
98
 
99
+ updateAttribute( attribute ) {
100
+
101
+ const backend = this.backend;
102
+ const { gl } = backend;
103
+
104
+ const array = attribute.array;
105
+ const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
106
+ const bufferData = backend.get( bufferAttribute );
107
+ const bufferType = bufferData.bufferType;
108
+
109
+ gl.bindBuffer( bufferType, bufferData.bufferGPU );
110
+ gl.bufferSubData( bufferType, 0, array );
111
+ gl.bindBuffer( bufferType, null );
112
+
113
+ bufferData.version = bufferAttribute.version;
114
+
115
+ }
116
+
82
117
  }
83
118
 
84
119
  export default WebGLAttributeUtils;
@@ -21,7 +21,7 @@ class WebGLState {
21
21
  this.currentFlipSided = null;
22
22
  this.currentCullFace = null;
23
23
  this.currentProgram = null;
24
- this.currentBlendingEnabled = null;
24
+ this.currentBlendingEnabled = false;
25
25
  this.currentBlending = null;
26
26
  this.currentBlendSrc = null;
27
27
  this.currentBlendDst = null;
@@ -30,6 +30,7 @@ class WebGLState {
30
30
  this.currentPremultipledAlpha = null;
31
31
  this.currentPolygonOffsetFactor = null;
32
32
  this.currentPolygonOffsetUnits = null;
33
+ this.currentColorMask = null;
33
34
  this.currentDepthFunc = null;
34
35
  this.currentDepthMask = null;
35
36
  this.currentStencilFunc = null;
@@ -296,6 +297,17 @@ class WebGLState {
296
297
 
297
298
  }
298
299
 
300
+ setColorMask( colorMask ) {
301
+
302
+ if ( this.currentColorMask !== colorMask ) {
303
+
304
+ this.gl.colorMask( colorMask, colorMask, colorMask, colorMask );
305
+ this.currentColorMask = colorMask;
306
+
307
+ }
308
+
309
+ }
310
+
299
311
  setDepthTest( depthTest ) {
300
312
 
301
313
  const { gl } = this;
@@ -462,7 +474,7 @@ class WebGLState {
462
474
  this.setDepthFunc( material.depthFunc );
463
475
  this.setDepthTest( material.depthTest );
464
476
  this.setDepthMask( material.depthWrite );
465
- this.setDepthMask( material.colorWrite );
477
+ this.setColorMask( material.colorWrite );
466
478
 
467
479
  const stencilWrite = material.stencilWrite;
468
480
  this.setStencilTest( stencilWrite );
@@ -33,6 +33,8 @@ class WebGPUBackend extends Backend {
33
33
 
34
34
  super( parameters );
35
35
 
36
+ this.isWebGPUBackend = true;
37
+
36
38
  // some parameters require default values other than "undefined"
37
39
 
38
40
  this.parameters.antialias = ( parameters.antialias === true );
@@ -9,7 +9,7 @@ import UniformBuffer from '../../common/UniformBuffer.js';
9
9
  import StorageBuffer from '../../common/StorageBuffer.js';
10
10
  import { getVectorLength, getStrideLength } from '../../common/BufferUtils.js';
11
11
 
12
- import { NodeBuilder, CodeNode, NodeMaterial } from '../../../nodes/Nodes.js';
12
+ import { NodeBuilder, CodeNode, NodeMaterial, FunctionNode } from '../../../nodes/Nodes.js';
13
13
 
14
14
  import { getFormat } from '../utils/WebGPUTextureUtils.js';
15
15
 
@@ -436,6 +436,34 @@ class WGSLNodeBuilder extends NodeBuilder {
436
436
 
437
437
  }
438
438
 
439
+ buildFunctionNode( shaderNode ) {
440
+
441
+ const layout = shaderNode.layout;
442
+ const flowData = this.flowShaderNode( shaderNode );
443
+
444
+ const parameters = [];
445
+
446
+ for ( const input of layout.inputs ) {
447
+
448
+ parameters.push( input.name + ' : ' + this.getType( input.type ) );
449
+
450
+ }
451
+
452
+ //
453
+
454
+ const code = `fn ${ layout.name }( ${ parameters.join( ', ' ) } ) -> ${ this.getType( layout.type ) } {
455
+ ${ flowData.vars }
456
+ ${ flowData.code }
457
+ return ${ flowData.result };
458
+
459
+ }`;
460
+
461
+ //
462
+
463
+ return new FunctionNode( code );
464
+
465
+ }
466
+
439
467
  getInstanceIndex() {
440
468
 
441
469
  if ( this.shaderStage === 'vertex' ) {
@@ -551,9 +579,13 @@ class WGSLNodeBuilder extends NodeBuilder {
551
579
  const snippets = [];
552
580
  const vars = this.vars[ shaderStage ];
553
581
 
554
- for ( const variable of vars ) {
582
+ if ( vars !== undefined ) {
583
+
584
+ for ( const variable of vars ) {
555
585
 
556
- snippets.push( `\t${ this.getVar( variable.type, variable.name ) };` );
586
+ snippets.push( `\t${ this.getVar( variable.type, variable.name ) };` );
587
+
588
+ }
557
589
 
558
590
  }
559
591
 
@@ -584,7 +616,7 @@ class WGSLNodeBuilder extends NodeBuilder {
584
616
 
585
617
  let attributesSnippet = `@location( ${index} )`;
586
618
 
587
- if ( varying.type === 'int' || varying.type === 'uint' ) {
619
+ if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {
588
620
 
589
621
  attributesSnippet += ' @interpolate( flat )';
590
622
 
@@ -8,6 +8,8 @@
8
8
 
9
9
  const ACESFilmicToneMappingShader = {
10
10
 
11
+ name: 'ACESFilmicToneMappingShader',
12
+
11
13
  uniforms: {
12
14
 
13
15
  'tDiffuse': { value: null },
@@ -6,6 +6,8 @@
6
6
 
7
7
  const AfterimageShader = {
8
8
 
9
+ name: 'AfterimageShader',
10
+
9
11
  uniforms: {
10
12
 
11
13
  'damp': { value: 0.96 },
@@ -4,6 +4,8 @@
4
4
 
5
5
  const BasicShader = {
6
6
 
7
+ name: 'BasicShader',
8
+
7
9
  uniforms: {},
8
10
 
9
11
  vertexShader: /* glsl */`
@@ -4,6 +4,8 @@
4
4
 
5
5
  const BlendShader = {
6
6
 
7
+ name: 'BlendShader',
8
+
7
9
  uniforms: {
8
10
 
9
11
  'tDiffuse1': { value: null },
@@ -6,6 +6,8 @@
6
6
 
7
7
  const BokehShader = {
8
8
 
9
+ name: 'BokehShader',
10
+
9
11
  defines: {
10
12
  'DEPTH_PACKING': 1,
11
13
  'PERSPECTIVE_CAMERA': 1,
@@ -11,6 +11,8 @@ import {
11
11
  */
12
12
  const BokehShader = {
13
13
 
14
+ name: 'BokehShader',
15
+
14
16
  uniforms: {
15
17
 
16
18
  'textureWidth': { value: 1.0 },
@@ -354,6 +356,8 @@ const BokehShader = {
354
356
 
355
357
  const BokehDepthShader = {
356
358
 
359
+ name: 'BokehDepthShader',
360
+
357
361
  uniforms: {
358
362
 
359
363
  'mNear': { value: 1.0 },
@@ -7,6 +7,8 @@
7
7
 
8
8
  const BrightnessContrastShader = {
9
9
 
10
+ name: 'BrightnessContrastShader',
11
+
10
12
  uniforms: {
11
13
 
12
14
  'tDiffuse': { value: null },
@@ -8,6 +8,8 @@ import {
8
8
 
9
9
  const ColorCorrectionShader = {
10
10
 
11
+ name: 'ColorCorrectionShader',
12
+
11
13
  uniforms: {
12
14
 
13
15
  'tDiffuse': { value: null },
@@ -6,6 +6,8 @@
6
6
 
7
7
  const DOFMipMapShader = {
8
8
 
9
+ name: 'DOFMipMapShader',
10
+
9
11
  uniforms: {
10
12
 
11
13
  'tColor': { value: null },
@@ -7,11 +7,15 @@ import {
7
7
  */
8
8
 
9
9
  const DepthLimitedBlurShader = {
10
+
11
+ name: 'DepthLimitedBlurShader',
12
+
10
13
  defines: {
11
14
  'KERNEL_RADIUS': 4,
12
15
  'DEPTH_PACKING': 1,
13
16
  'PERSPECTIVE_CAMERA': 1
14
17
  },
18
+
15
19
  uniforms: {
16
20
  'tDiffuse': { value: null },
17
21
  'size': { value: new Vector2( 512, 512 ) },
@@ -22,6 +26,7 @@ const DepthLimitedBlurShader = {
22
26
  'cameraFar': { value: 1000 },
23
27
  'depthCutoff': { value: 10 },
24
28
  },
29
+
25
30
  vertexShader: /* glsl */`
26
31
 
27
32
  #include <common>
@@ -12,6 +12,8 @@ import {
12
12
 
13
13
  const FXAAShader = {
14
14
 
15
+ name: 'FXAAShader',
16
+
15
17
  uniforms: {
16
18
 
17
19
  'tDiffuse': { value: null },
@@ -38,7 +38,7 @@ const FilmShader = {
38
38
 
39
39
  vec4 base = texture2D( tDiffuse, vUv );
40
40
 
41
- float noise = rand( vUv + time );
41
+ float noise = rand( fract( vUv + time ) );
42
42
 
43
43
  vec3 color = base.rgb + base.rgb * clamp( 0.1 + noise, 0.0, 1.0 );
44
44
 
@@ -6,6 +6,8 @@
6
6
 
7
7
  const FocusShader = {
8
8
 
9
+ name: 'FocusShader',
10
+
9
11
  uniforms: {
10
12
 
11
13
  'tDiffuse': { value: null },
@@ -11,6 +11,8 @@ import {
11
11
 
12
12
  const FreiChenShader = {
13
13
 
14
+ name: 'FreiChenShader',
15
+
14
16
  uniforms: {
15
17
 
16
18
  'tDiffuse': { value: null },
@@ -23,6 +23,8 @@ import {
23
23
 
24
24
  const GodRaysDepthMaskShader = {
25
25
 
26
+ name: 'GodRaysDepthMaskShader',
27
+
26
28
  uniforms: {
27
29
 
28
30
  tInput: {
@@ -74,6 +76,8 @@ const GodRaysDepthMaskShader = {
74
76
 
75
77
  const GodRaysGenerateShader = {
76
78
 
79
+ name: 'GodRaysGenerateShader',
80
+
77
81
  uniforms: {
78
82
 
79
83
  tInput: {
@@ -194,6 +198,8 @@ const GodRaysGenerateShader = {
194
198
 
195
199
  const GodRaysCombineShader = {
196
200
 
201
+ name: 'GodRaysCombineShader',
202
+
197
203
  uniforms: {
198
204
 
199
205
  tColors: {
@@ -251,6 +257,8 @@ const GodRaysCombineShader = {
251
257
 
252
258
  const GodRaysFakeSunShader = {
253
259
 
260
+ name: 'GodRaysFakeSunShader',
261
+
254
262
  uniforms: {
255
263
 
256
264
  vSunPositionScreenSpace: {
@@ -7,6 +7,8 @@
7
7
 
8
8
  const HalftoneShader = {
9
9
 
10
+ name: 'HalftoneShader',
11
+
10
12
  uniforms: {
11
13
  'tDiffuse': { value: null },
12
14
  'shape': { value: 1 },
@@ -9,6 +9,8 @@
9
9
 
10
10
  const HorizontalTiltShiftShader = {
11
11
 
12
+ name: 'HorizontalTiltShiftShader',
13
+
12
14
  uniforms: {
13
15
 
14
16
  'tDiffuse': { value: null },
@@ -7,6 +7,8 @@
7
7
 
8
8
  const HueSaturationShader = {
9
9
 
10
+ name: 'HueSaturationShader',
11
+
10
12
  uniforms: {
11
13
 
12
14
  'tDiffuse': { value: null },
@@ -10,6 +10,8 @@
10
10
 
11
11
  const KaleidoShader = {
12
12
 
13
+ name: 'KaleidoShader',
14
+
13
15
  uniforms: {
14
16
 
15
17
  'tDiffuse': { value: null },
@@ -9,6 +9,8 @@ import {
9
9
 
10
10
  const LuminosityHighPassShader = {
11
11
 
12
+ name: 'LuminosityHighPassShader',
13
+
12
14
  shaderID: 'luminosityHighPass',
13
15
 
14
16
  uniforms: {
@@ -5,6 +5,8 @@
5
5
 
6
6
  const LuminosityShader = {
7
7
 
8
+ name: 'LuminosityShader',
9
+
8
10
  uniforms: {
9
11
 
10
12
  'tDiffuse': { value: null }
@@ -71,6 +71,8 @@ const mmd_toon_matcap_fragment = /* glsl */`
71
71
 
72
72
  const MMDToonShader = {
73
73
 
74
+ name: 'MMDToonShader',
75
+
74
76
  defines: {
75
77
  TOON: true,
76
78
  MATCAP: true,
@@ -7,6 +7,8 @@
7
7
 
8
8
  const MirrorShader = {
9
9
 
10
+ name: 'MirrorShader',
11
+
10
12
  uniforms: {
11
13
 
12
14
  'tDiffuse': { value: null },
@@ -9,6 +9,8 @@ import {
9
9
 
10
10
  const NormalMapShader = {
11
11
 
12
+ name: 'NormalMapShader',
13
+
12
14
  uniforms: {
13
15
 
14
16
  'heightMap': { value: null },