super-three 0.158.0 → 0.160.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 (191) hide show
  1. package/build/three.cjs +1719 -379
  2. package/build/three.js +1719 -379
  3. package/build/three.min.js +1 -1
  4. package/build/three.module.js +1718 -380
  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 +23 -18
  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
@@ -8,6 +8,7 @@ import WebGLState from './utils/WebGLState.js';
8
8
  import WebGLUtils from './utils/WebGLUtils.js';
9
9
  import WebGLTextureUtils from './utils/WebGLTextureUtils.js';
10
10
  import WebGLExtensions from './utils/WebGLExtensions.js';
11
+ import WebGLCapabilities from './utils/WebGLCapabilities.js';
11
12
 
12
13
  //
13
14
 
@@ -34,6 +35,7 @@ class WebGLBackend extends Backend {
34
35
  this.gl = glContext;
35
36
 
36
37
  this.extensions = new WebGLExtensions( this );
38
+ this.capabilities = new WebGLCapabilities( this );
37
39
  this.attributeUtils = new WebGLAttributeUtils( this );
38
40
  this.textureUtils = new WebGLTextureUtils( this );
39
41
  this.state = new WebGLState( this );
@@ -51,6 +53,12 @@ class WebGLBackend extends Backend {
51
53
 
52
54
  }
53
55
 
56
+ async getArrayBufferAsync( attribute ) {
57
+
58
+ return await this.attributeUtils.getArrayBufferAsync( attribute );
59
+
60
+ }
61
+
54
62
  beginRender( renderContext ) {
55
63
 
56
64
  const { gl } = this;
@@ -63,7 +71,7 @@ class WebGLBackend extends Backend {
63
71
 
64
72
  this._setFramebuffer( renderContext );
65
73
 
66
- this.clear( renderContext, renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil );
74
+ this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext );
67
75
 
68
76
  //
69
77
 
@@ -190,7 +198,7 @@ class WebGLBackend extends Backend {
190
198
 
191
199
  }
192
200
 
193
- }
201
+ };
194
202
 
195
203
  check();
196
204
 
@@ -215,10 +223,19 @@ class WebGLBackend extends Backend {
215
223
 
216
224
  }
217
225
 
218
- clear( renderContext, color, depth, stencil ) {
226
+ clear( color, depth, stencil, descriptor = null ) {
219
227
 
220
228
  const { gl } = this;
221
229
 
230
+ if ( descriptor === null ) {
231
+
232
+ descriptor = {
233
+ textures: null,
234
+ clearColorValue: this.getClearColor()
235
+ };
236
+
237
+ }
238
+
222
239
  //
223
240
 
224
241
  let clear = 0;
@@ -229,11 +246,11 @@ class WebGLBackend extends Backend {
229
246
 
230
247
  if ( clear !== 0 ) {
231
248
 
232
- const clearColor = renderContext.clearColorValue;
249
+ const clearColor = descriptor.clearColorValue;
233
250
 
234
251
  if ( depth ) this.state.setDepthMask( true );
235
252
 
236
- if ( renderContext.textures === null ) {
253
+ if ( descriptor.textures === null ) {
237
254
 
238
255
  gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a );
239
256
  gl.clear( clear );
@@ -242,11 +259,12 @@ class WebGLBackend extends Backend {
242
259
 
243
260
  if ( color ) {
244
261
 
245
- for ( let i = 0; i < renderContext.textures.length; i ++ ) {
262
+ for ( let i = 0; i < descriptor.textures.length; i ++ ) {
246
263
 
247
264
  gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
248
265
 
249
266
  }
267
+
250
268
  }
251
269
 
252
270
  if ( depth && stencil ) {
@@ -260,6 +278,7 @@ class WebGLBackend extends Backend {
260
278
  } else if ( stencil ) {
261
279
 
262
280
  gl.clearBufferiv( gl.STENCIL, 0, [ 0 ] );
281
+
263
282
  }
264
283
 
265
284
  }
@@ -420,15 +439,15 @@ class WebGLBackend extends Backend {
420
439
 
421
440
  }
422
441
 
423
- needsUpdate( renderObject ) {
442
+ needsRenderUpdate( renderObject ) {
424
443
 
425
444
  return false;
426
445
 
427
446
  }
428
447
 
429
- getCacheKey( renderObject ) {
448
+ getRenderCacheKey( renderObject ) {
430
449
 
431
- return renderObject.geometry.id;
450
+ return renderObject.id;
432
451
 
433
452
  }
434
453
 
@@ -440,12 +459,6 @@ class WebGLBackend extends Backend {
440
459
 
441
460
  }
442
461
 
443
- destroySampler( /*texture*/ ) {
444
-
445
- console.warn( 'Abstract class.' );
446
-
447
- }
448
-
449
462
  createDefaultTexture( texture ) {
450
463
 
451
464
  const { gl, textureUtils, defaultTextures } = this;
@@ -479,7 +492,7 @@ class WebGLBackend extends Backend {
479
492
  createTexture( texture, options ) {
480
493
 
481
494
  const { gl, utils, textureUtils } = this;
482
- const { levels, width, height } = options;
495
+ const { levels, width, height, depth } = options;
483
496
 
484
497
  const glFormat = utils.convert( texture.format, texture.colorSpace );
485
498
  const glType = utils.convert( texture.type );
@@ -499,7 +512,11 @@ class WebGLBackend extends Backend {
499
512
 
500
513
  gl.bindTexture( glTextureType, textureGPU );
501
514
 
502
- if ( ! texture.isVideoTexture ) {
515
+ if ( texture.isDataArrayTexture ) {
516
+
517
+ gl.texStorage3D( gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, width, height, depth );
518
+
519
+ } else if ( ! texture.isVideoTexture ) {
503
520
 
504
521
  gl.texStorage2D( glTextureType, levels, glInternalFormat, width, height );
505
522
 
@@ -551,6 +568,12 @@ class WebGLBackend extends Backend {
551
568
 
552
569
  }
553
570
 
571
+ } else if ( texture.isDataArrayTexture ) {
572
+
573
+ const image = options.image;
574
+
575
+ gl.texSubImage3D( gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );
576
+
554
577
  } else if ( texture.isVideoTexture ) {
555
578
 
556
579
  texture.update();
@@ -578,15 +601,22 @@ class WebGLBackend extends Backend {
578
601
 
579
602
  }
580
603
 
581
- destroyTexture( /*texture*/ ) {
604
+ destroyTexture( texture ) {
582
605
 
583
- console.warn( 'Abstract class.' );
606
+ const { gl } = this;
607
+ const { textureGPU } = this.get( texture );
608
+
609
+ gl.deleteTexture( textureGPU );
610
+
611
+ this.delete( texture );
584
612
 
585
613
  }
586
614
 
587
- copyTextureToBuffer( /*texture, x, y, width, height*/ ) {
615
+ destroySampler() {}
588
616
 
589
- console.warn( 'Abstract class.' );
617
+ copyTextureToBuffer( texture, x, y, width, height ) {
618
+
619
+ return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height );
590
620
 
591
621
  }
592
622
 
@@ -713,13 +743,13 @@ class WebGLBackend extends Backend {
713
743
 
714
744
  }
715
745
 
716
- if ( attributeData.isFloat ) {
746
+ if ( attributeData.isInteger ) {
717
747
 
718
- gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, false, stride, offset );
748
+ gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
719
749
 
720
750
  } else {
721
751
 
722
- gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
752
+ gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );
723
753
 
724
754
  }
725
755
 
@@ -856,26 +886,54 @@ class WebGLBackend extends Backend {
856
886
 
857
887
  }
858
888
 
859
- hasFeature( name ) {
889
+ hasFeature( /*name*/ ) {
860
890
 
861
891
  return true;
862
892
 
863
893
  }
864
894
 
865
- copyFramebufferToTexture( texture /*, renderContext */ ) {
895
+ getMaxAnisotropy() {
896
+
897
+ return this.capabilities.getMaxAnisotropy();
898
+
899
+ }
900
+
901
+ copyFramebufferToTexture( texture, renderContext ) {
866
902
 
867
903
  const { gl } = this;
868
904
 
869
905
  const { textureGPU } = this.get( texture );
870
906
 
871
- gl.bindFramebuffer( gl.FRAMEBUFFER, null );
872
- gl.bindTexture( gl.TEXTURE_2D, textureGPU );
907
+ const width = texture.image.width;
908
+ const height = texture.image.height;
909
+
910
+ gl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );
911
+
912
+ if ( texture.isDepthTexture ) {
913
+
914
+ const fb = gl.createFramebuffer();
873
915
 
874
- gl.copyTexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, 0, 0, texture.image.width, texture.image.height );
916
+ gl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
875
917
 
876
- if ( texture.generateMipmaps ) gl.generateMipmap( gl.TEXTURE_2D );
918
+ gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, textureGPU, 0 );
877
919
 
878
- gl.bindTexture( gl.TEXTURE_2D, null );
920
+ gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, gl.DEPTH_BUFFER_BIT, gl.NEAREST );
921
+
922
+ gl.deleteFramebuffer( fb );
923
+
924
+
925
+ } else {
926
+
927
+ gl.bindTexture( gl.TEXTURE_2D, textureGPU );
928
+ gl.copyTexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, 0, 0, width, height );
929
+
930
+ gl.bindTexture( gl.TEXTURE_2D, null );
931
+
932
+ }
933
+
934
+ if ( texture.generateMipmaps ) this.generateMipmaps( texture );
935
+
936
+ this._setFramebuffer( renderContext );
879
937
 
880
938
  }
881
939
 
@@ -885,7 +943,7 @@ class WebGLBackend extends Backend {
885
943
 
886
944
  if ( renderContext.textures !== null ) {
887
945
 
888
- const renderContextData = this.get( renderContext );
946
+ const renderContextData = this.get( renderContext.renderTarget );
889
947
 
890
948
  let fb = renderContextData.framebuffer;
891
949
 
@@ -899,7 +957,7 @@ class WebGLBackend extends Backend {
899
957
 
900
958
  const drawBuffers = [];
901
959
 
902
- for ( let i = 0; i < textures.length; i++ ) {
960
+ for ( let i = 0; i < textures.length; i ++ ) {
903
961
 
904
962
  const texture = textures[ i ];
905
963
  const { textureGPU } = this.get( texture );
@@ -1,9 +1,12 @@
1
- import { MathNode, GLSLNodeParser, NodeBuilder, NodeMaterial, FunctionNode } from '../../../nodes/Nodes.js';
1
+ import { MathNode, GLSLNodeParser, NodeBuilder, NodeMaterial } from '../../../nodes/Nodes.js';
2
2
 
3
3
  import UniformBuffer from '../../common/UniformBuffer.js';
4
- import UniformsGroup from '../../common/UniformsGroup.js';
4
+ import NodeUniformsGroup from '../../common/nodes/NodeUniformsGroup.js';
5
+
5
6
  import { NodeSampledTexture, NodeSampledCubeTexture } from '../../common/nodes/NodeSampledTexture.js';
6
7
 
8
+ import { IntType } from 'three';
9
+
7
10
  const glslMethods = {
8
11
  [ MathNode.ATAN2 ]: 'atan',
9
12
  textureDimensions: 'textureSize'
@@ -19,13 +22,20 @@ const supports = {
19
22
  instance: true
20
23
  };
21
24
 
25
+ const defaultPrecisions = `
26
+ precision highp float;
27
+ precision highp int;
28
+ precision mediump sampler2DArray;
29
+ precision lowp sampler2DShadow;
30
+ `;
31
+
22
32
  class GLSLNodeBuilder extends NodeBuilder {
23
33
 
24
34
  constructor( object, renderer, scene = null ) {
25
35
 
26
36
  super( object, renderer, new GLSLNodeParser(), scene );
27
37
 
28
- this.uniformsGroup = {};
38
+ this.uniformGroups = {};
29
39
 
30
40
  }
31
41
 
@@ -43,7 +53,7 @@ class GLSLNodeBuilder extends NodeBuilder {
43
53
 
44
54
  }
45
55
 
46
- buildFunctionNode( shaderNode ) {
56
+ buildFunctionCode( shaderNode ) {
47
57
 
48
58
  const layout = shaderNode.layout;
49
59
  const flowData = this.flowShaderNode( shaderNode );
@@ -69,39 +79,55 @@ ${ flowData.code }
69
79
 
70
80
  //
71
81
 
72
- return new FunctionNode( code );
82
+ return code;
73
83
 
74
84
  }
75
85
 
76
- getTexture( texture, textureProperty, uvSnippet ) {
86
+ generateTextureLoad( texture, textureProperty, uvIndexSnippet, depthSnippet, levelSnippet = '0' ) {
87
+
88
+ if ( depthSnippet ) {
89
+
90
+ return `texelFetch( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), ${ levelSnippet } )`;
91
+
92
+ } else {
93
+
94
+ return `texelFetch( ${ textureProperty }, ${ uvIndexSnippet }, ${ levelSnippet } )`;
95
+
96
+ }
97
+
98
+ }
99
+
100
+ generateTexture( texture, textureProperty, uvSnippet, depthSnippet ) {
77
101
 
78
102
  if ( texture.isTextureCube ) {
79
103
 
80
- return `textureCube( ${textureProperty}, ${uvSnippet} )`;
104
+ return `textureCube( ${ textureProperty }, ${ uvSnippet } )`;
81
105
 
82
106
  } else if ( texture.isDepthTexture ) {
83
107
 
84
- return `texture( ${textureProperty}, ${uvSnippet} ).x`;
108
+ return `texture( ${ textureProperty }, ${ uvSnippet } ).x`;
85
109
 
86
110
  } else {
87
111
 
88
- return `texture( ${textureProperty}, ${uvSnippet} )`;
112
+ if ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;
113
+
114
+ return `texture( ${ textureProperty }, ${ uvSnippet } )`;
89
115
 
90
116
  }
91
117
 
92
118
  }
93
119
 
94
- getTextureLevel( texture, textureProperty, uvSnippet, biasSnippet ) {
120
+ generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet ) {
95
121
 
96
- return `textureLod( ${textureProperty}, ${uvSnippet}, ${biasSnippet} )`;
122
+ return `textureLod( ${ textureProperty }, ${ uvSnippet }, ${ levelSnippet } )`;
97
123
 
98
124
  }
99
125
 
100
- getTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, shaderStage = this.shaderStage ) {
126
+ generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, shaderStage = this.shaderStage ) {
101
127
 
102
128
  if ( shaderStage === 'fragment' ) {
103
129
 
104
- return `texture( ${textureProperty}, vec3( ${uvSnippet}, ${compareSnippet} ) )`;
130
+ return `texture( ${ textureProperty }, vec3( ${ uvSnippet }, ${ compareSnippet } ) )`;
105
131
 
106
132
  } else {
107
133
 
@@ -138,7 +164,7 @@ ${ flowData.code }
138
164
  const uniforms = this.uniforms[ shaderStage ];
139
165
 
140
166
  const bindingSnippets = [];
141
- const groupSnippets = [];
167
+ const uniformGroups = {};
142
168
 
143
169
  for ( const uniform of uniforms ) {
144
170
 
@@ -147,19 +173,25 @@ ${ flowData.code }
147
173
 
148
174
  if ( uniform.type === 'texture' ) {
149
175
 
150
- if ( uniform.node.value.compareFunction ) {
176
+ const texture = uniform.node.value;
177
+
178
+ if ( texture.compareFunction ) {
151
179
 
152
- snippet = `sampler2DShadow ${uniform.name};`;
180
+ snippet = `sampler2DShadow ${ uniform.name };`;
181
+
182
+ } else if ( texture.isDataArrayTexture === true ) {
183
+
184
+ snippet = `sampler2DArray ${ uniform.name };`;
153
185
 
154
186
  } else {
155
187
 
156
- snippet = `sampler2D ${uniform.name};`;
188
+ snippet = `sampler2D ${ uniform.name };`;
157
189
 
158
190
  }
159
191
 
160
192
  } else if ( uniform.type === 'cubeTexture' ) {
161
193
 
162
- snippet = `samplerCube ${uniform.name};`;
194
+ snippet = `samplerCube ${ uniform.name };`;
163
195
 
164
196
  } else if ( uniform.type === 'buffer' ) {
165
197
 
@@ -168,7 +200,7 @@ ${ flowData.code }
168
200
  const bufferCount = bufferNode.bufferCount;
169
201
 
170
202
  const bufferCountSnippet = bufferCount > 0 ? bufferCount : '';
171
- snippet = `${bufferNode.name} {\n\t${bufferType} ${uniform.name}[${bufferCountSnippet}];\n};\n`;
203
+ snippet = `${bufferNode.name} {\n\t${ bufferType } ${ uniform.name }[${ bufferCountSnippet }];\n};\n`;
172
204
 
173
205
  } else {
174
206
 
@@ -192,6 +224,9 @@ ${ flowData.code }
192
224
 
193
225
  snippet = '\t' + snippet;
194
226
 
227
+ const groupName = uniform.groupNode.name;
228
+ const groupSnippets = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = [] );
229
+
195
230
  groupSnippets.push( snippet );
196
231
 
197
232
  } else {
@@ -206,9 +241,11 @@ ${ flowData.code }
206
241
 
207
242
  let output = '';
208
243
 
209
- if ( groupSnippets.length > 0 ) {
244
+ for ( const name in uniformGroups ) {
210
245
 
211
- output += this._getGLSLUniformStruct( shaderStage + 'NodeUniforms', groupSnippets.join( '\n' ) ) + '\n';
246
+ const groupSnippets = uniformGroups[ name ];
247
+
248
+ output += this._getGLSLUniformStruct( shaderStage + '_' + name, groupSnippets.join( '\n' ) ) + '\n';
212
249
 
213
250
  }
214
251
 
@@ -218,6 +255,30 @@ ${ flowData.code }
218
255
 
219
256
  }
220
257
 
258
+ getTypeFromAttribute( attribute ) {
259
+
260
+ let nodeType = super.getTypeFromAttribute( attribute );
261
+
262
+ if ( /^[iu]/.test( nodeType ) && attribute.gpuType !== IntType ) {
263
+
264
+ let dataAttribute = attribute;
265
+
266
+ if ( attribute.isInterleavedBufferAttribute ) dataAttribute = attribute.data;
267
+
268
+ const array = dataAttribute.array;
269
+
270
+ if ( ( array instanceof Uint32Array || array instanceof Int32Array ) === false ) {
271
+
272
+ nodeType = nodeType.slice( 1 );
273
+
274
+ }
275
+
276
+ }
277
+
278
+ return nodeType;
279
+
280
+ }
281
+
221
282
  getAttributes( shaderStage ) {
222
283
 
223
284
  let snippet = '';
@@ -323,7 +384,7 @@ ${ flowData.code }
323
384
 
324
385
  getVertexIndex() {
325
386
 
326
- return 'gl_VertexID';
387
+ return 'uint( gl_VertexID )';
327
388
 
328
389
  }
329
390
 
@@ -345,6 +406,12 @@ ${ flowData.code }
345
406
 
346
407
  }
347
408
 
409
+ getFragDepth() {
410
+
411
+ return 'gl_FragDepth';
412
+
413
+ }
414
+
348
415
  isAvailable( name ) {
349
416
 
350
417
  return supports[ name ] === true;
@@ -374,8 +441,7 @@ ${vars}
374
441
  ${ this.getSignature() }
375
442
 
376
443
  // precision
377
- precision highp float;
378
- precision highp int;
444
+ ${ defaultPrecisions }
379
445
 
380
446
  // uniforms
381
447
  ${shaderData.uniforms}
@@ -411,9 +477,7 @@ void main() {
411
477
  ${ this.getSignature() }
412
478
 
413
479
  // precision
414
- precision highp float;
415
- precision highp int;
416
- precision lowp sampler2DShadow;
480
+ ${ defaultPrecisions }
417
481
 
418
482
  // uniforms
419
483
  ${shaderData.uniforms}
@@ -519,7 +583,7 @@ void main() {
519
583
  getUniformFromNode( node, type, shaderStage, name = null ) {
520
584
 
521
585
  const uniformNode = super.getUniformFromNode( node, type, shaderStage, name );
522
- const nodeData = this.getDataFromNode( node, shaderStage );
586
+ const nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );
523
587
 
524
588
  let uniformGPU = nodeData.uniformGPU;
525
589
 
@@ -551,14 +615,19 @@ void main() {
551
615
 
552
616
  } else {
553
617
 
554
- let uniformsGroup = this.uniformsGroup[ shaderStage ];
618
+ const group = node.groupNode;
619
+ const groupName = group.name;
620
+
621
+ const uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );
622
+
623
+ let uniformsGroup = uniformsStage[ groupName ];
555
624
 
556
625
  if ( uniformsGroup === undefined ) {
557
626
 
558
- uniformsGroup = new UniformsGroup( shaderStage + 'NodeUniforms' );
627
+ uniformsGroup = new NodeUniformsGroup( shaderStage + '_' + groupName, group );
559
628
  //uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );
560
629
 
561
- this.uniformsGroup[ shaderStage ] = uniformsGroup;
630
+ uniformsStage[ groupName ] = uniformsGroup;
562
631
 
563
632
  this.bindings[ shaderStage ].push( uniformsGroup );
564
633
 
@@ -1,3 +1,5 @@
1
+ import { IntType } from 'three';
2
+
1
3
  class WebGLAttributeUtils {
2
4
 
3
5
  constructor( backend ) {
@@ -36,19 +38,16 @@ class WebGLAttributeUtils {
36
38
  //attribute.onUploadCallback();
37
39
 
38
40
  let type;
39
- let isFloat = false;
40
41
 
41
42
  if ( array instanceof Float32Array ) {
42
43
 
43
44
  type = gl.FLOAT;
44
- isFloat = true;
45
45
 
46
46
  } else if ( array instanceof Uint16Array ) {
47
47
 
48
48
  if ( attribute.isFloat16BufferAttribute ) {
49
49
 
50
50
  type = gl.HALF_FLOAT;
51
- isFloat = true;
52
51
 
53
52
  } else {
54
53
 
@@ -91,7 +90,7 @@ class WebGLAttributeUtils {
91
90
  type,
92
91
  bytesPerElement: array.BYTES_PER_ELEMENT,
93
92
  version: attribute.version,
94
- isFloat
93
+ isInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType
95
94
  } );
96
95
 
97
96
  }
@@ -105,15 +104,68 @@ class WebGLAttributeUtils {
105
104
  const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
106
105
  const bufferData = backend.get( bufferAttribute );
107
106
  const bufferType = bufferData.bufferType;
107
+ const updateRanges = attribute.isInterleavedBufferAttribute ? attribute.data.updateRanges : attribute.updateRanges;
108
108
 
109
109
  gl.bindBuffer( bufferType, bufferData.bufferGPU );
110
- gl.bufferSubData( bufferType, 0, array );
110
+
111
+ if ( updateRanges.length === 0 ) {
112
+
113
+ // Not using update ranges
114
+
115
+ gl.bufferSubData( bufferType, 0, array );
116
+
117
+ } else {
118
+
119
+ for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
120
+
121
+ const range = updateRanges[ i ];
122
+ gl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,
123
+ array, range.start, range.count );
124
+
125
+ }
126
+
127
+ bufferAttribute.clearUpdateRanges();
128
+
129
+ }
130
+
111
131
  gl.bindBuffer( bufferType, null );
112
132
 
113
133
  bufferData.version = bufferAttribute.version;
114
134
 
115
135
  }
116
136
 
137
+ async getArrayBufferAsync( attribute ) {
138
+
139
+ const backend = this.backend;
140
+ const { gl } = backend;
141
+
142
+ const bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;
143
+ const { bufferGPU } = backend.get( bufferAttribute );
144
+
145
+ const array = attribute.array;
146
+ const byteLength = array.byteLength;
147
+
148
+ gl.bindBuffer( gl.COPY_READ_BUFFER, bufferGPU );
149
+
150
+ const writeBuffer = gl.createBuffer();
151
+
152
+ gl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );
153
+ gl.bufferData( gl.COPY_WRITE_BUFFER, byteLength, gl.STREAM_READ );
154
+
155
+ gl.copyBufferSubData( gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, byteLength );
156
+
157
+ await backend.utils._clientWaitAsync();
158
+
159
+ const dstBuffer = new attribute.array.constructor( array.length );
160
+
161
+ gl.getBufferSubData( gl.COPY_WRITE_BUFFER, 0, dstBuffer );
162
+
163
+ gl.deleteBuffer( writeBuffer );
164
+
165
+ return dstBuffer.buffer;
166
+
167
+ }
168
+
117
169
  }
118
170
 
119
171
  export default WebGLAttributeUtils;
@@ -0,0 +1,36 @@
1
+ class WebGLCapabilities {
2
+
3
+ constructor( backend ) {
4
+
5
+ this.backend = backend;
6
+
7
+ this.maxAnisotropy = null;
8
+
9
+ }
10
+
11
+ getMaxAnisotropy() {
12
+
13
+ if ( this.maxAnisotropy !== null ) return this.maxAnisotropy;
14
+
15
+ const gl = this.backend.gl;
16
+ const extensions = this.backend.extensions;
17
+
18
+ if ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {
19
+
20
+ const extension = extensions.get( 'EXT_texture_filter_anisotropic' );
21
+
22
+ this.maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );
23
+
24
+ } else {
25
+
26
+ this.maxAnisotropy = 0;
27
+
28
+ }
29
+
30
+ return this.maxAnisotropy;
31
+
32
+ }
33
+
34
+ }
35
+
36
+ export default WebGLCapabilities;