super-three 0.154.0 → 0.155.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 (107) hide show
  1. package/build/three.cjs +257 -40
  2. package/build/three.js +257 -40
  3. package/build/three.min.js +1 -2
  4. package/build/three.module.js +256 -41
  5. package/build/three.module.min.js +1 -2
  6. package/examples/jsm/controls/OrbitControls.js +143 -21
  7. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  8. package/examples/jsm/exporters/USDZExporter.js +1 -0
  9. package/examples/jsm/interactive/SelectionHelper.js +7 -0
  10. package/examples/jsm/loaders/FBXLoader.js +1 -1
  11. package/examples/jsm/loaders/GLTFLoader.js +8 -3
  12. package/examples/jsm/loaders/KTX2Loader.js +4 -4
  13. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  14. package/examples/jsm/loaders/NRRDLoader.js +3 -3
  15. package/examples/jsm/loaders/PLYLoader.js +1 -1
  16. package/examples/jsm/loaders/TGALoader.js +10 -10
  17. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  18. package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
  19. package/examples/jsm/misc/Volume.js +4 -6
  20. package/examples/jsm/nodes/Nodes.js +5 -6
  21. package/examples/jsm/nodes/accessors/BufferAttributeNode.js +1 -1
  22. package/examples/jsm/nodes/accessors/CubeTextureNode.js +2 -0
  23. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +14 -1
  24. package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
  25. package/examples/jsm/nodes/accessors/MaterialNode.js +34 -44
  26. package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
  27. package/examples/jsm/nodes/accessors/TextureNode.js +48 -7
  28. package/examples/jsm/nodes/core/LightingModel.js +7 -9
  29. package/examples/jsm/nodes/core/Node.js +11 -2
  30. package/examples/jsm/nodes/core/PropertyNode.js +4 -0
  31. package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
  32. package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
  33. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
  34. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
  35. package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
  36. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
  37. package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
  38. package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
  39. package/examples/jsm/nodes/lighting/AONode.js +1 -1
  40. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
  41. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
  42. package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
  43. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
  44. package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
  45. package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
  46. package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
  47. package/examples/jsm/nodes/materials/Materials.js +1 -0
  48. package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
  49. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
  50. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
  51. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
  52. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
  53. package/examples/jsm/nodes/materials/NodeMaterial.js +50 -24
  54. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
  55. package/examples/jsm/nodes/shadernode/ShaderNode.js +2 -2
  56. package/examples/jsm/objects/Reflector.js +1 -9
  57. package/examples/jsm/objects/Refractor.js +0 -8
  58. package/examples/jsm/offscreen/scene.js +0 -1
  59. package/examples/jsm/postprocessing/MaskPass.js +4 -1
  60. package/examples/jsm/postprocessing/OutputPass.js +33 -14
  61. package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
  62. package/examples/jsm/renderers/common/Background.js +22 -20
  63. package/examples/jsm/renderers/common/Binding.js +8 -0
  64. package/examples/jsm/renderers/common/Bindings.js +2 -6
  65. package/examples/jsm/renderers/common/Geometries.js +1 -1
  66. package/examples/jsm/renderers/common/Pipelines.js +94 -45
  67. package/examples/jsm/renderers/common/RenderContext.js +1 -0
  68. package/examples/jsm/renderers/common/RenderContexts.js +16 -5
  69. package/examples/jsm/renderers/common/RenderObject.js +20 -4
  70. package/examples/jsm/renderers/common/RenderObjects.js +10 -7
  71. package/examples/jsm/renderers/common/Renderer.js +70 -39
  72. package/examples/jsm/renderers/common/Textures.js +20 -8
  73. package/examples/jsm/renderers/common/nodes/Nodes.js +15 -4
  74. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +51 -54
  75. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +33 -9
  76. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
  77. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +83 -5
  78. package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
  79. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +83 -130
  80. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +35 -8
  81. package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +1 -1
  82. package/examples/jsm/shaders/OutputShader.js +19 -2
  83. package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
  84. package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
  85. package/package.json +2 -2
  86. package/src/Three.js +2 -0
  87. package/src/animation/PropertyBinding.js +1 -1
  88. package/src/cameras/CubeCamera.js +1 -4
  89. package/src/constants.js +1 -1
  90. package/src/core/BufferAttribute.js +20 -0
  91. package/src/core/Object3D.js +1 -1
  92. package/src/core/RenderTarget.js +122 -0
  93. package/src/geometries/CapsuleGeometry.js +1 -1
  94. package/src/loaders/DataTextureLoader.js +21 -2
  95. package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
  96. package/src/renderers/WebGLRenderTarget.js +3 -110
  97. package/src/renderers/WebGLRenderer.js +62 -8
  98. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
  99. package/src/renderers/webgl/WebGLGeometries.js +5 -1
  100. package/src/renderers/webgl/WebGLMaterials.js +1 -1
  101. package/src/renderers/webgl/WebGLPrograms.js +14 -2
  102. package/src/renderers/webgl/WebGLTextures.js +97 -12
  103. package/src/renderers/webxr/WebXRManager.js +1 -1
  104. package/src/textures/CompressedCubeTexture.js +19 -0
  105. package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
  106. package/examples/jsm/renderers/common/RenderTarget.js +0 -15
  107. package/examples/jsm/renderers/common/nodes/NodeRender.js +0 -302
@@ -157,6 +157,17 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
157
157
 
158
158
  }
159
159
 
160
+ if ( glFormat === _gl.RED_INTEGER ) {
161
+
162
+ if ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;
163
+ if ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;
164
+ if ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;
165
+ if ( glType === _gl.BYTE ) internalFormat = _gl.R8I;
166
+ if ( glType === _gl.SHORT ) internalFormat = _gl.R16I;
167
+ if ( glType === _gl.INT ) internalFormat = _gl.R32I;
168
+
169
+ }
170
+
160
171
  if ( glFormat === _gl.RG ) {
161
172
 
162
173
  if ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;
@@ -333,14 +344,32 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
333
344
 
334
345
  for ( let i = 0; i < 6; i ++ ) {
335
346
 
336
- _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
347
+ if ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {
348
+
349
+ for ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );
350
+
351
+ } else {
352
+
353
+ _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );
354
+
355
+ }
356
+
337
357
  if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );
338
358
 
339
359
  }
340
360
 
341
361
  } else {
342
362
 
343
- _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
363
+ if ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {
364
+
365
+ for ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );
366
+
367
+ } else {
368
+
369
+ _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );
370
+
371
+ }
372
+
344
373
  if ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );
345
374
  if ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );
346
375
 
@@ -1315,7 +1344,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1315
1344
  // Render targets
1316
1345
 
1317
1346
  // Setup storage for target texture and bind it to correct framebuffer
1318
- function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {
1347
+ function setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {
1319
1348
 
1320
1349
  const glFormat = utils.convert( texture.format, texture.colorSpace );
1321
1350
  const glType = utils.convert( texture.type );
@@ -1324,13 +1353,16 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1324
1353
 
1325
1354
  if ( ! renderTargetProperties.__hasExternalTextures ) {
1326
1355
 
1356
+ const width = Math.max( 1, renderTarget.width >> level );
1357
+ const height = Math.max( 1, renderTarget.height >> level );
1358
+
1327
1359
  if ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {
1328
1360
 
1329
- state.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );
1361
+ state.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );
1330
1362
 
1331
1363
  } else {
1332
1364
 
1333
- state.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );
1365
+ state.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );
1334
1366
 
1335
1367
  }
1336
1368
 
@@ -1344,7 +1376,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1344
1376
 
1345
1377
  } else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753
1346
1378
 
1347
- _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );
1379
+ _gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( texture ).__webglTexture, level );
1348
1380
 
1349
1381
  }
1350
1382
 
@@ -1565,7 +1597,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1565
1597
 
1566
1598
  if ( colorTexture !== undefined ) {
1567
1599
 
1568
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );
1600
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );
1569
1601
 
1570
1602
  }
1571
1603
 
@@ -1612,13 +1644,41 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1612
1644
 
1613
1645
  for ( let i = 0; i < 6; i ++ ) {
1614
1646
 
1615
- renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
1647
+ if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {
1648
+
1649
+ renderTargetProperties.__webglFramebuffer[ i ] = [];
1650
+
1651
+ for ( let level = 0; level < texture.mipmaps.length; level ++ ) {
1652
+
1653
+ renderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();
1654
+
1655
+ }
1656
+
1657
+ } else {
1658
+
1659
+ renderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();
1660
+
1661
+ }
1616
1662
 
1617
1663
  }
1618
1664
 
1619
1665
  } else {
1620
1666
 
1621
- renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
1667
+ if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {
1668
+
1669
+ renderTargetProperties.__webglFramebuffer = [];
1670
+
1671
+ for ( let level = 0; level < texture.mipmaps.length; level ++ ) {
1672
+
1673
+ renderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();
1674
+
1675
+ }
1676
+
1677
+ } else {
1678
+
1679
+ renderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();
1680
+
1681
+ }
1622
1682
 
1623
1683
  if ( isMultipleRenderTargets ) {
1624
1684
 
@@ -1698,7 +1758,19 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1698
1758
 
1699
1759
  for ( let i = 0; i < 6; i ++ ) {
1700
1760
 
1701
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );
1761
+ if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {
1762
+
1763
+ for ( let level = 0; level < texture.mipmaps.length; level ++ ) {
1764
+
1765
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );
1766
+
1767
+ }
1768
+
1769
+ } else {
1770
+
1771
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );
1772
+
1773
+ }
1702
1774
 
1703
1775
  }
1704
1776
 
@@ -1721,7 +1793,7 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1721
1793
 
1722
1794
  state.bindTexture( _gl.TEXTURE_2D, attachmentProperties.__webglTexture );
1723
1795
  setTextureParameters( _gl.TEXTURE_2D, attachment, supportsMips );
1724
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D );
1796
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, 0 );
1725
1797
 
1726
1798
  if ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {
1727
1799
 
@@ -1753,7 +1825,20 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
1753
1825
 
1754
1826
  state.bindTexture( glTextureType, textureProperties.__webglTexture );
1755
1827
  setTextureParameters( glTextureType, texture, supportsMips );
1756
- setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType );
1828
+
1829
+ if ( isWebGL2 && texture.mipmaps && texture.mipmaps.length > 0 ) {
1830
+
1831
+ for ( let level = 0; level < texture.mipmaps.length; level ++ ) {
1832
+
1833
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );
1834
+
1835
+ }
1836
+
1837
+ } else {
1838
+
1839
+ setupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );
1840
+
1841
+ }
1757
1842
 
1758
1843
  if ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {
1759
1844
 
@@ -585,7 +585,7 @@ class WebXRManager extends EventDispatcher {
585
585
 
586
586
  }
587
587
 
588
- updateUserCamera( camera, cameraXR, parent );
588
+ updateUserCamera( camera, cameraXR, object );
589
589
 
590
590
  };
591
591
 
@@ -0,0 +1,19 @@
1
+ import { CubeReflectionMapping } from '../constants.js';
2
+ import { CompressedTexture } from './CompressedTexture.js';
3
+
4
+ class CompressedCubeTexture extends CompressedTexture {
5
+
6
+ constructor( images, format, type ) {
7
+
8
+ super( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );
9
+
10
+ this.isCompressedCubeTexture = true;
11
+ this.isCubeTexture = true;
12
+
13
+ this.image = images;
14
+
15
+ }
16
+
17
+ }
18
+
19
+ export { CompressedCubeTexture };
@@ -1,30 +0,0 @@
1
- import F_Schlick from './F_Schlick.js';
2
- import { shininess, specularColor } from '../../core/PropertyNode.js';
3
- import { transformedNormalView } from '../../accessors/NormalNode.js';
4
- import { positionViewDirection } from '../../accessors/PositionNode.js';
5
- import { tslFn, float } from '../../shadernode/ShaderNode.js';
6
-
7
- const G_BlinnPhong_Implicit = () => float( 0.25 );
8
-
9
- const D_BlinnPhong = tslFn( ( { dotNH } ) => {
10
-
11
- return shininess.mul( 0.5 / Math.PI ).add( 1.0 ).mul( dotNH.pow( shininess ) );
12
-
13
- } );
14
-
15
- const BRDF_BlinnPhong = tslFn( ( { lightDirection } ) => {
16
-
17
- const halfDir = lightDirection.add( positionViewDirection ).normalize();
18
-
19
- const dotNH = transformedNormalView.dot( halfDir ).clamp();
20
- const dotVH = positionViewDirection.dot( halfDir ).clamp();
21
-
22
- const F = F_Schlick( { f0: specularColor, f90: 1.0, dotVH } );
23
- const G = G_BlinnPhong_Implicit();
24
- const D = D_BlinnPhong( { dotNH } );
25
-
26
- return F.mul( G ).mul( D );
27
-
28
- } );
29
-
30
- export default BRDF_BlinnPhong;
@@ -1,15 +0,0 @@
1
- import { WebGLRenderTarget } from 'three';
2
-
3
- // @TODO: Consider rename WebGLRenderTarget to just RenderTarget
4
-
5
- class RenderTarget extends WebGLRenderTarget {
6
-
7
- constructor( width, height, options = {} ) {
8
-
9
- super( width, height, options );
10
-
11
- }
12
-
13
- }
14
-
15
- export default RenderTarget;
@@ -1,302 +0,0 @@
1
- import WebGPUNodeBuilder from '../../webgpu/backends/webgpu/builder/WGSLNodeBuilder.js';
2
- import { NoToneMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from 'three';
3
- import { NodeFrame, cubeTexture, texture, rangeFog, densityFog, reference, toneMapping, positionWorld, modelWorldMatrix, transformDirection, equirectUV, viewportBottomLeft } from '../../../nodes/Nodes.js';
4
-
5
- class NodeRender {
6
-
7
- constructor( renderer, properties ) {
8
-
9
- this.renderer = renderer;
10
- this.properties = properties;
11
-
12
- this.nodeFrame = new NodeFrame();
13
-
14
- }
15
-
16
- get( renderObject ) {
17
-
18
- const renderObjectProperties = this.properties.get( renderObject );
19
-
20
- let nodeBuilder = renderObjectProperties.nodeBuilder;
21
-
22
- if ( nodeBuilder === undefined ) {
23
-
24
- nodeBuilder = new WebGPUNodeBuilder( renderObject.object, this.renderer );
25
- nodeBuilder.material = renderObject.material;
26
- nodeBuilder.lightsNode = renderObject.lightsNode;
27
- nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
28
- nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
29
- nodeBuilder.toneMappingNode = this.getToneMappingNode();
30
- nodeBuilder.build();
31
-
32
- renderObjectProperties.nodeBuilder = nodeBuilder;
33
-
34
- }
35
-
36
- return nodeBuilder;
37
-
38
- }
39
-
40
- getForCompute( computeNode ) {
41
-
42
- const computeProperties = this.properties.get( computeNode );
43
-
44
- let nodeBuilder = computeProperties.nodeBuilder;
45
-
46
- if ( nodeBuilder === undefined ) {
47
-
48
- nodeBuilder = new WebGPUNodeBuilder( computeNode, this.renderer );
49
- nodeBuilder.build();
50
-
51
- computeProperties.nodeBuilder = nodeBuilder;
52
-
53
- }
54
-
55
- return nodeBuilder;
56
-
57
- }
58
-
59
- remove( renderObject ) {
60
-
61
- const objectProperties = this.properties.get( renderObject );
62
-
63
- delete objectProperties.nodeBuilder;
64
-
65
- }
66
-
67
- getEnvironmentNode( scene ) {
68
-
69
- return scene.environmentNode || this.properties.get( scene ).environmentNode || null;
70
-
71
- }
72
-
73
- getFogNode( scene ) {
74
-
75
- return scene.fogNode || this.properties.get( scene ).fogNode || null;
76
-
77
- }
78
-
79
- getToneMappingNode() {
80
-
81
- return this.renderer.toneMappingNode || this.properties.get( this.renderer ).toneMappingNode || null;
82
-
83
- }
84
-
85
- getCacheKey( scene, lightsNode ) {
86
-
87
- const environmentNode = this.getEnvironmentNode( scene );
88
- const fogNode = this.getFogNode( scene );
89
- const toneMappingNode = this.getToneMappingNode();
90
-
91
- const cacheKey = [];
92
-
93
- if ( lightsNode ) cacheKey.push( 'lightsNode:' + lightsNode.getCacheKey() );
94
- if ( environmentNode ) cacheKey.push( 'environmentNode:' + environmentNode.getCacheKey() );
95
- if ( fogNode ) cacheKey.push( 'fogNode:' + fogNode.getCacheKey() );
96
- if ( toneMappingNode ) cacheKey.push( 'toneMappingNode:' + toneMappingNode.getCacheKey() );
97
-
98
- return '{' + cacheKey.join( ',' ) + '}';
99
-
100
- }
101
-
102
- updateToneMapping() {
103
-
104
- const renderer = this.renderer;
105
- const rendererProperties = this.properties.get( renderer );
106
- const rendererToneMapping = renderer.toneMapping;
107
-
108
- if ( rendererToneMapping !== NoToneMapping ) {
109
-
110
- if ( rendererProperties.toneMapping !== rendererToneMapping ) {
111
-
112
- rendererProperties.toneMappingNode = toneMapping( rendererToneMapping, reference( 'toneMappingExposure', 'float', renderer ) );
113
- rendererProperties.toneMapping = rendererToneMapping;
114
-
115
- }
116
-
117
- } else {
118
-
119
- delete rendererProperties.toneMappingNode;
120
- delete rendererProperties.toneMapping;
121
-
122
- }
123
-
124
- }
125
-
126
- updateBackground( scene ) {
127
-
128
- const sceneProperties = this.properties.get( scene );
129
- const background = scene.background;
130
-
131
- if ( background ) {
132
-
133
- if ( sceneProperties.background !== background ) {
134
-
135
- let backgroundNode = null;
136
-
137
- if ( background.isCubeTexture === true ) {
138
-
139
- backgroundNode = cubeTexture( background, transformDirection( positionWorld, modelWorldMatrix ) );
140
-
141
- } else if ( background.isTexture === true ) {
142
-
143
- let nodeUV = null;
144
-
145
- if ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) {
146
-
147
- nodeUV = equirectUV();
148
-
149
- } else {
150
-
151
- nodeUV = viewportBottomLeft;
152
-
153
- }
154
-
155
- backgroundNode = texture( background, nodeUV );
156
-
157
- } else if ( background.isColor !== true ) {
158
-
159
- console.error( 'WebGPUNodes: Unsupported background configuration.', background );
160
-
161
- }
162
-
163
- sceneProperties.backgroundNode = backgroundNode;
164
- sceneProperties.background = background;
165
-
166
- }
167
-
168
- } else if ( sceneProperties.backgroundNode ) {
169
-
170
- delete sceneProperties.backgroundNode;
171
- delete sceneProperties.background;
172
-
173
- }
174
-
175
- }
176
-
177
- updateFog( scene ) {
178
-
179
- const sceneProperties = this.properties.get( scene );
180
- const fog = scene.fog;
181
-
182
- if ( fog ) {
183
-
184
- if ( sceneProperties.fog !== fog ) {
185
-
186
- let fogNode = null;
187
-
188
- if ( fog.isFogExp2 ) {
189
-
190
- fogNode = densityFog( reference( 'color', 'color', fog ), reference( 'density', 'float', fog ) );
191
-
192
- } else if ( fog.isFog ) {
193
-
194
- fogNode = rangeFog( reference( 'color', 'color', fog ), reference( 'near', 'float', fog ), reference( 'far', 'float', fog ) );
195
-
196
- } else {
197
-
198
- console.error( 'WebGPUNodes: Unsupported fog configuration.', fog );
199
-
200
- }
201
-
202
- sceneProperties.fogNode = fogNode;
203
- sceneProperties.fog = fog;
204
-
205
- }
206
-
207
- } else {
208
-
209
- delete sceneProperties.fogNode;
210
- delete sceneProperties.fog;
211
-
212
- }
213
-
214
- }
215
-
216
- updateEnvironment( scene ) {
217
-
218
- const sceneProperties = this.properties.get( scene );
219
- const environment = scene.environment;
220
-
221
- if ( environment ) {
222
-
223
- if ( sceneProperties.environment !== environment ) {
224
-
225
- let environmentNode = null;
226
-
227
- if ( environment.isCubeTexture === true ) {
228
-
229
- environmentNode = cubeTexture( environment );
230
-
231
- } else if ( environment.isTexture === true ) {
232
-
233
- environmentNode = texture( environment );
234
-
235
- } else {
236
-
237
- console.error( 'WebGPUNodes: Unsupported environment configuration.', environment );
238
-
239
- }
240
-
241
- sceneProperties.environmentNode = environmentNode;
242
- sceneProperties.environment = environment;
243
-
244
- }
245
-
246
- } else if ( sceneProperties.environmentNode ) {
247
-
248
- delete sceneProperties.environmentNode;
249
- delete sceneProperties.environment;
250
-
251
- }
252
-
253
- }
254
-
255
- getNodeFrame( renderObject ) {
256
-
257
- const nodeFrame = this.nodeFrame;
258
- nodeFrame.scene = renderObject.scene;
259
- nodeFrame.object = renderObject.object;
260
- nodeFrame.camera = renderObject.camera;
261
- nodeFrame.renderer = renderObject.renderer;
262
- nodeFrame.material = renderObject.material;
263
-
264
- return nodeFrame;
265
-
266
- }
267
-
268
- updateBefore( renderObject ) {
269
-
270
- const nodeFrame = this.getNodeFrame( renderObject );
271
- const nodeBuilder = this.get( renderObject );
272
-
273
- for ( const node of nodeBuilder.updateBeforeNodes ) {
274
-
275
- nodeFrame.updateBeforeNode( node );
276
-
277
- }
278
-
279
- }
280
-
281
- update( renderObject ) {
282
-
283
- const nodeFrame = this.getNodeFrame( renderObject );
284
- const nodeBuilder = this.get( renderObject );
285
-
286
- for ( const node of nodeBuilder.updateNodes ) {
287
-
288
- nodeFrame.updateNode( node );
289
-
290
- }
291
-
292
- }
293
-
294
- dispose() {
295
-
296
- this.nodeFrame = new NodeFrame();
297
-
298
- }
299
-
300
- }
301
-
302
- export default NodeRender;