@plastic-software/three 0.167.1 → 0.167.3

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 (94) hide show
  1. package/build/three.cjs +17 -8
  2. package/build/three.module.js +17 -8
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +746 -374
  5. package/build/three.webgpu.min.js +1 -1
  6. package/examples/jsm/controls/Controls.js +32 -0
  7. package/examples/jsm/controls/DragControls.js +260 -132
  8. package/examples/jsm/transpiler/TSLEncoder.js +8 -8
  9. package/package.json +1 -1
  10. package/src/loaders/ObjectLoader.js +3 -3
  11. package/src/nodes/Nodes.js +3 -2
  12. package/src/nodes/accessors/BatchNode.js +2 -2
  13. package/src/nodes/accessors/ClippingNode.js +8 -8
  14. package/src/nodes/accessors/MorphNode.js +4 -4
  15. package/src/nodes/accessors/TangentNode.js +2 -2
  16. package/src/nodes/accessors/Texture3DNode.js +8 -8
  17. package/src/nodes/accessors/UniformArrayNode.js +5 -3
  18. package/src/nodes/core/StackNode.js +22 -6
  19. package/src/nodes/display/AfterImageNode.js +3 -3
  20. package/src/nodes/display/AnamorphicNode.js +4 -4
  21. package/src/nodes/display/BleachBypassNode.js +2 -2
  22. package/src/nodes/display/BlendModeNode.js +8 -8
  23. package/src/nodes/display/BloomNode.js +9 -9
  24. package/src/nodes/display/BumpMapNode.js +3 -3
  25. package/src/nodes/display/ColorAdjustmentNode.js +4 -4
  26. package/src/nodes/display/ColorSpaceNode.js +3 -3
  27. package/src/nodes/display/DenoiseNode.js +8 -8
  28. package/src/nodes/display/DepthOfFieldNode.js +2 -2
  29. package/src/nodes/display/DotScreenNode.js +3 -3
  30. package/src/nodes/display/FXAANode.js +11 -11
  31. package/src/nodes/display/FilmNode.js +2 -2
  32. package/src/nodes/display/GTAONode.js +9 -9
  33. package/src/nodes/display/GaussianBlurNode.js +2 -2
  34. package/src/nodes/display/Lut3DNode.js +2 -2
  35. package/src/nodes/display/NormalMapNode.js +2 -2
  36. package/src/nodes/display/PassNode.js +71 -3
  37. package/src/nodes/display/PixelationPassNode.js +3 -3
  38. package/src/nodes/display/RGBShiftNode.js +2 -2
  39. package/src/nodes/display/SepiaNode.js +2 -2
  40. package/src/nodes/display/SobelOperatorNode.js +2 -2
  41. package/src/nodes/display/ToneMappingNode.js +13 -13
  42. package/src/nodes/display/TransitionNode.js +3 -3
  43. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -2
  44. package/src/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
  45. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  46. package/src/nodes/functions/BSDF/DFGApprox.js +2 -2
  47. package/src/nodes/functions/BSDF/D_GGX.js +2 -2
  48. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +2 -2
  49. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  50. package/src/nodes/functions/BSDF/F_Schlick.js +2 -2
  51. package/src/nodes/functions/BSDF/LTC.js +6 -6
  52. package/src/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
  53. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
  54. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  55. package/src/nodes/functions/PhongLightingModel.js +3 -3
  56. package/src/nodes/functions/PhysicalLightingModel.js +18 -18
  57. package/src/nodes/functions/ToonLightingModel.js +2 -2
  58. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  59. package/src/nodes/functions/material/getRoughness.js +2 -2
  60. package/src/nodes/lighting/AnalyticLightNode.js +5 -5
  61. package/src/nodes/lighting/BasicEnvironmentNode.js +2 -1
  62. package/src/nodes/lighting/LightProbeNode.js +80 -0
  63. package/src/nodes/lighting/LightUtils.js +3 -3
  64. package/src/nodes/materials/InstancedPointsNodeMaterial.js +3 -3
  65. package/src/nodes/materials/Line2NodeMaterial.js +17 -17
  66. package/src/nodes/materials/MeshPhysicalNodeMaterial.js +1 -1
  67. package/src/nodes/materials/VolumeNodeMaterial.js +5 -5
  68. package/src/nodes/materialx/lib/mx_hsv.js +12 -12
  69. package/src/nodes/materialx/lib/mx_noise.js +80 -80
  70. package/src/nodes/materialx/lib/mx_transform_color.js +2 -2
  71. package/src/nodes/math/CondNode.js +13 -2
  72. package/src/nodes/math/MathNode.js +2 -2
  73. package/src/nodes/math/TriNoise3D.js +6 -6
  74. package/src/nodes/pmrem/PMREMUtils.js +34 -34
  75. package/src/nodes/procedural/CheckerNode.js +2 -2
  76. package/src/nodes/shadernode/ShaderNode.js +11 -4
  77. package/src/nodes/utils/CubeMapNode.js +157 -0
  78. package/src/nodes/utils/LoopNode.js +10 -4
  79. package/src/nodes/utils/SpriteUtils.js +2 -2
  80. package/src/nodes/utils/UVUtils.js +3 -3
  81. package/src/nodes/utils/ViewportUtils.js +3 -3
  82. package/src/renderers/WebGLRenderer.js +8 -0
  83. package/src/renderers/common/RenderContext.js +24 -0
  84. package/src/renderers/common/RenderObject.js +1 -1
  85. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +1 -1
  86. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  87. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +0 -2
  88. package/src/renderers/shaders/ShaderLib/points.glsl.js +0 -2
  89. package/src/renderers/webgl/WebGLPrograms.js +2 -1
  90. package/src/renderers/webgl-fallback/WebGLBackend.js +31 -27
  91. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +12 -8
  92. package/src/renderers/webgpu/WebGPUBackend.js +10 -14
  93. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +30 -2
  94. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -1
@@ -47,7 +47,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
47
47
  }
48
48
 
49
49
  function getParameters( material, lights, shadows, scene, object ) {
50
-
51
50
  const fog = scene.fog;
52
51
  const geometry = object.geometry;
53
52
  const environment = material.isMeshStandardMaterial ? scene.environment : null;
@@ -513,6 +512,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
513
512
  _programLayers.enable( 20 );
514
513
  if ( parameters.batchingColor )
515
514
  _programLayers.enable( 21 );
515
+ if ( parameters.batchingMatrix )
516
+ _programLayers.enable( 22 );
516
517
 
517
518
  array.push( _programLayers.mask );
518
519
  _programLayers.disableAll();
@@ -1,5 +1,6 @@
1
1
  import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
2
2
  import Backend from '../common/Backend.js';
3
+ import { getCacheKey } from '../common/RenderContext.js';
3
4
 
4
5
  import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
5
6
  import WebGLState from './utils/WebGLState.js';
@@ -255,12 +256,13 @@ class WebGLBackend extends Backend {
255
256
  const renderTargetContextData = this.get( renderContext.renderTarget );
256
257
 
257
258
  const { samples } = renderContext.renderTarget;
258
- const fb = renderTargetContextData.framebuffer;
259
-
260
- const mask = gl.COLOR_BUFFER_BIT;
261
259
 
262
260
  if ( samples > 0 ) {
263
261
 
262
+ const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
263
+
264
+ const mask = gl.COLOR_BUFFER_BIT;
265
+
264
266
  const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
265
267
 
266
268
  const textures = renderContext.textures;
@@ -1236,38 +1238,38 @@ class WebGLBackend extends Backend {
1236
1238
 
1237
1239
  }
1238
1240
 
1239
- _setFramebuffer( renderContext ) {
1241
+ _setFramebuffer( descriptor ) {
1240
1242
 
1241
1243
  const { gl, state } = this;
1242
1244
 
1243
1245
  let currentFrameBuffer = null;
1244
1246
 
1245
- if ( renderContext.textures !== null ) {
1247
+ if ( descriptor.textures !== null ) {
1246
1248
 
1247
- const renderTarget = renderContext.renderTarget;
1249
+ const renderTarget = descriptor.renderTarget;
1248
1250
  const renderTargetContextData = this.get( renderTarget );
1249
1251
  const { samples, depthBuffer, stencilBuffer } = renderTarget;
1250
- const cubeFace = this.renderer._activeCubeFace;
1252
+
1251
1253
  const isCube = renderTarget.isWebGLCubeRenderTarget === true;
1252
1254
 
1253
1255
  let msaaFb = renderTargetContextData.msaaFrameBuffer;
1254
1256
  let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
1255
1257
 
1258
+ const cacheKey = getCacheKey( descriptor );
1259
+
1256
1260
  let fb;
1257
1261
 
1258
1262
  if ( isCube ) {
1259
1263
 
1260
- if ( renderTargetContextData.cubeFramebuffers === undefined ) {
1261
-
1262
- renderTargetContextData.cubeFramebuffers = [];
1263
-
1264
- }
1264
+ renderTargetContextData.cubeFramebuffers || ( renderTargetContextData.cubeFramebuffers = {} );
1265
1265
 
1266
- fb = renderTargetContextData.cubeFramebuffers[ cubeFace ];
1266
+ fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
1267
1267
 
1268
1268
  } else {
1269
1269
 
1270
- fb = renderTargetContextData.framebuffer;
1270
+ renderTargetContextData.framebuffers || ( renderTargetContextData.framebuffers = {} );
1271
+
1272
+ fb = renderTargetContextData.framebuffers[ cacheKey ];
1271
1273
 
1272
1274
  }
1273
1275
 
@@ -1277,22 +1279,27 @@ class WebGLBackend extends Backend {
1277
1279
 
1278
1280
  state.bindFramebuffer( gl.FRAMEBUFFER, fb );
1279
1281
 
1280
- const textures = renderContext.textures;
1282
+ const textures = descriptor.textures;
1281
1283
 
1282
1284
  if ( isCube ) {
1283
1285
 
1284
- renderTargetContextData.cubeFramebuffers[ cubeFace ] = fb;
1286
+ renderTargetContextData.cubeFramebuffers[ cacheKey ] = fb;
1287
+
1285
1288
  const { textureGPU } = this.get( textures[ 0 ] );
1286
1289
 
1290
+ const cubeFace = this.renderer._activeCubeFace;
1291
+
1287
1292
  gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
1288
1293
 
1289
1294
  } else {
1290
1295
 
1296
+ renderTargetContextData.framebuffers[ cacheKey ] = fb;
1297
+
1291
1298
  for ( let i = 0; i < textures.length; i ++ ) {
1292
1299
 
1293
1300
  const texture = textures[ i ];
1294
1301
  const textureData = this.get( texture );
1295
- textureData.renderTarget = renderContext.renderTarget;
1302
+ textureData.renderTarget = descriptor.renderTarget;
1296
1303
 
1297
1304
  const attachment = gl.COLOR_ATTACHMENT0 + i;
1298
1305
 
@@ -1300,15 +1307,13 @@ class WebGLBackend extends Backend {
1300
1307
 
1301
1308
  }
1302
1309
 
1303
- renderTargetContextData.framebuffer = fb;
1304
-
1305
- state.drawBuffers( renderContext, fb );
1310
+ state.drawBuffers( descriptor, fb );
1306
1311
 
1307
1312
  }
1308
1313
 
1309
- if ( renderContext.depthTexture !== null ) {
1314
+ if ( descriptor.depthTexture !== null ) {
1310
1315
 
1311
- const textureData = this.get( renderContext.depthTexture );
1316
+ const textureData = this.get( descriptor.depthTexture );
1312
1317
  const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
1313
1318
 
1314
1319
  gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
@@ -1329,11 +1334,10 @@ class WebGLBackend extends Backend {
1329
1334
 
1330
1335
  const msaaRenderbuffers = [];
1331
1336
 
1332
- const textures = renderContext.textures;
1337
+ const textures = descriptor.textures;
1333
1338
 
1334
1339
  for ( let i = 0; i < textures.length; i ++ ) {
1335
1340
 
1336
-
1337
1341
  msaaRenderbuffers[ i ] = gl.createRenderbuffer();
1338
1342
 
1339
1343
  gl.bindRenderbuffer( gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
@@ -1347,10 +1351,10 @@ class WebGLBackend extends Backend {
1347
1351
 
1348
1352
  }
1349
1353
 
1350
- const texture = renderContext.textures[ i ];
1354
+ const texture = descriptor.textures[ i ];
1351
1355
  const textureData = this.get( texture );
1352
1356
 
1353
- gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, renderContext.width, renderContext.height );
1357
+ gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, descriptor.width, descriptor.height );
1354
1358
  gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
1355
1359
 
1356
1360
 
@@ -1362,7 +1366,7 @@ class WebGLBackend extends Backend {
1362
1366
  if ( depthRenderbuffer === undefined ) {
1363
1367
 
1364
1368
  depthRenderbuffer = gl.createRenderbuffer();
1365
- this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, renderContext );
1369
+ this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor );
1366
1370
 
1367
1371
  renderTargetContextData.depthRenderbuffer = depthRenderbuffer;
1368
1372
 
@@ -527,7 +527,6 @@ class WebGLTextureUtils {
527
527
 
528
528
  deallocateRenderBuffers( renderTarget ) {
529
529
 
530
-
531
530
  const { gl, backend } = this;
532
531
 
533
532
  // remove framebuffer reference
@@ -537,31 +536,36 @@ class WebGLTextureUtils {
537
536
 
538
537
  renderContextData.renderBufferStorageSetup = undefined;
539
538
 
540
- if ( renderContextData.framebuffer ) {
539
+ if ( renderContextData.framebuffers ) {
540
+
541
+ for ( const cacheKey in renderContextData.framebuffers ) {
542
+
543
+ gl.deleteFramebuffer( renderContextData.framebuffers[ cacheKey ] );
544
+
545
+ }
541
546
 
542
- gl.deleteFramebuffer( renderContextData.framebuffer );
543
- renderContextData.framebuffer = undefined;
547
+ delete renderContextData.framebuffers;
544
548
 
545
549
  }
546
550
 
547
551
  if ( renderContextData.depthRenderbuffer ) {
548
552
 
549
553
  gl.deleteRenderbuffer( renderContextData.depthRenderbuffer );
550
- renderContextData.depthRenderbuffer = undefined;
554
+ delete renderContextData.depthRenderbuffer;
551
555
 
552
556
  }
553
557
 
554
558
  if ( renderContextData.stencilRenderbuffer ) {
555
559
 
556
560
  gl.deleteRenderbuffer( renderContextData.stencilRenderbuffer );
557
- renderContextData.stencilRenderbuffer = undefined;
561
+ delete renderContextData.stencilRenderbuffer;
558
562
 
559
563
  }
560
564
 
561
565
  if ( renderContextData.msaaFrameBuffer ) {
562
566
 
563
567
  gl.deleteFramebuffer( renderContextData.msaaFrameBuffer );
564
- renderContextData.msaaFrameBuffer = undefined;
568
+ delete renderContextData.msaaFrameBuffer;
565
569
 
566
570
  }
567
571
 
@@ -573,7 +577,7 @@ class WebGLTextureUtils {
573
577
 
574
578
  }
575
579
 
576
- renderContextData.msaaRenderbuffers = undefined;
580
+ delete renderContextData.msaaRenderbuffers;
577
581
 
578
582
  }
579
583
 
@@ -193,22 +193,16 @@ class WebGPUBackend extends Backend {
193
193
 
194
194
  let descriptors = renderTargetData.descriptors;
195
195
 
196
- if ( descriptors === undefined ) {
197
-
198
- descriptors = [];
199
-
200
- renderTargetData.descriptors = descriptors;
201
-
202
- }
203
-
204
- if ( renderTargetData.width !== renderTarget.width ||
196
+ if ( descriptors === undefined ||
197
+ renderTargetData.width !== renderTarget.width ||
205
198
  renderTargetData.height !== renderTarget.height ||
206
199
  renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
207
- renderTargetData.samples !== renderTarget.samples ||
208
- descriptors.length !== renderTarget.textures.length
200
+ renderTargetData.samples !== renderTarget.samples
209
201
  ) {
210
202
 
211
- descriptors.length = 0;
203
+ descriptors = {};
204
+
205
+ renderTargetData.descriptors = descriptors;
212
206
 
213
207
  // dispose
214
208
 
@@ -224,7 +218,9 @@ class WebGPUBackend extends Backend {
224
218
 
225
219
  }
226
220
 
227
- let descriptor = descriptors[ renderContext.activeCubeFace ];
221
+ const cacheKey = renderContext.getCacheKey();
222
+
223
+ let descriptor = descriptors[ cacheKey ];
228
224
 
229
225
  if ( descriptor === undefined ) {
230
226
 
@@ -276,7 +272,7 @@ class WebGPUBackend extends Backend {
276
272
  depthStencilAttachment
277
273
  };
278
274
 
279
- descriptors[ renderContext.activeCubeFace ] = descriptor;
275
+ descriptors[ cacheKey ] = descriptor;
280
276
 
281
277
  renderTargetData.width = renderTarget.width;
282
278
  renderTargetData.height = renderTarget.height;
@@ -623,6 +623,22 @@ ${ flowData.code }
623
623
 
624
624
  }
625
625
 
626
+ getSubgroupSize() {
627
+
628
+ this.enableSubGroups();
629
+
630
+ return this.getBuiltin( 'subgroup_size', 'subgroupSize', 'u32', 'attribute' );
631
+
632
+ }
633
+
634
+ getSubgroupIndex() {
635
+
636
+ this.enableSubGroups();
637
+
638
+ return this.getBuiltin( 'subgroup_invocation_id', 'subgroupIndex', 'u32', 'attribute' );
639
+
640
+ }
641
+
626
642
  getDrawIndex() {
627
643
 
628
644
  return null;
@@ -655,8 +671,8 @@ ${ flowData.code }
655
671
 
656
672
  enableDirective( name, shaderStage = this.shaderStage ) {
657
673
 
658
- const stage = this.directives[ shaderStage ] || ( this.directives[ shaderStage ] = [] );
659
- stage.push( name );
674
+ const stage = this.directives[ shaderStage ] || ( this.directives[ shaderStage ] = new Set() );
675
+ stage.add( name );
660
676
 
661
677
  }
662
678
 
@@ -679,6 +695,18 @@ ${ flowData.code }
679
695
 
680
696
  }
681
697
 
698
+ enableSubGroups() {
699
+
700
+ this.enableDirective( 'subgroups' );
701
+
702
+ }
703
+
704
+ enableSubgroupsF16() {
705
+
706
+ this.enableDirective( 'subgroups-f16' );
707
+
708
+ }
709
+
682
710
  enableClipDistances() {
683
711
 
684
712
  this.enableDirective( 'clip_distances' );
@@ -328,5 +328,6 @@ export const GPUFeatureName = {
328
328
  BGRA8UNormStorage: 'bgra8unorm-storage',
329
329
  Float32Filterable: 'float32-filterable',
330
330
  ClipDistances: 'clip-distances',
331
- DualSourceBlending: 'dual-source-blending'
331
+ DualSourceBlending: 'dual-source-blending',
332
+ Subgroups: 'subgroups'
332
333
  };