super-three 0.154.1 → 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.
- package/build/three.cjs +256 -38
- package/build/three.js +256 -38
- package/build/three.min.js +1 -1
- package/build/three.module.js +255 -39
- package/build/three.module.min.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +143 -21
- package/examples/jsm/environments/RoomEnvironment.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +1 -0
- package/examples/jsm/interactive/SelectionHelper.js +7 -0
- package/examples/jsm/loaders/FBXLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +8 -3
- package/examples/jsm/loaders/KTX2Loader.js +4 -4
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/NRRDLoader.js +3 -3
- package/examples/jsm/loaders/PLYLoader.js +1 -1
- package/examples/jsm/loaders/TGALoader.js +10 -10
- package/examples/jsm/loaders/VRMLLoader.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +0 -9
- package/examples/jsm/misc/Volume.js +4 -6
- package/examples/jsm/nodes/Nodes.js +5 -6
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +1 -1
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +2 -0
- package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +14 -1
- package/examples/jsm/nodes/accessors/InstanceNode.js +8 -8
- package/examples/jsm/nodes/accessors/MaterialNode.js +34 -44
- package/examples/jsm/nodes/accessors/SceneNode.js +6 -0
- package/examples/jsm/nodes/accessors/TextureNode.js +48 -7
- package/examples/jsm/nodes/core/LightingModel.js +7 -9
- package/examples/jsm/nodes/core/Node.js +11 -2
- package/examples/jsm/nodes/core/PropertyNode.js +4 -0
- package/examples/jsm/nodes/display/BumpMapNode.js +77 -0
- package/examples/jsm/nodes/display/NormalMapNode.js +2 -2
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +10 -2
- package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +13 -0
- package/examples/jsm/nodes/functions/PhongLightingModel.js +53 -14
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +236 -97
- package/examples/jsm/nodes/geometry/RangeNode.js +2 -2
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +13 -0
- package/examples/jsm/nodes/lighting/AONode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +58 -20
- package/examples/jsm/nodes/lighting/DirectionalLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/EnvironmentNode.js +22 -12
- package/examples/jsm/nodes/lighting/HemisphereLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/LightingContextNode.js +12 -9
- package/examples/jsm/nodes/lighting/PointLightNode.js +7 -10
- package/examples/jsm/nodes/lighting/SpotLightNode.js +7 -10
- package/examples/jsm/nodes/materials/Materials.js +1 -0
- package/examples/jsm/nodes/materials/MeshLambertNodeMaterial.js +34 -0
- package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +2 -0
- package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +19 -2
- package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +2 -2
- package/examples/jsm/nodes/materials/NodeMaterial.js +50 -24
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +2 -2
- package/examples/jsm/nodes/shadernode/ShaderNode.js +2 -2
- package/examples/jsm/objects/Reflector.js +1 -9
- package/examples/jsm/objects/Refractor.js +0 -8
- package/examples/jsm/offscreen/scene.js +0 -1
- package/examples/jsm/postprocessing/MaskPass.js +4 -1
- package/examples/jsm/postprocessing/OutputPass.js +33 -14
- package/examples/jsm/postprocessing/UnrealBloomPass.js +21 -17
- package/examples/jsm/renderers/common/Background.js +22 -20
- package/examples/jsm/renderers/common/Binding.js +8 -0
- package/examples/jsm/renderers/common/Bindings.js +2 -6
- package/examples/jsm/renderers/common/Geometries.js +1 -1
- package/examples/jsm/renderers/common/Pipelines.js +94 -45
- package/examples/jsm/renderers/common/RenderContext.js +1 -0
- package/examples/jsm/renderers/common/RenderContexts.js +16 -5
- package/examples/jsm/renderers/common/RenderObject.js +20 -4
- package/examples/jsm/renderers/common/RenderObjects.js +10 -7
- package/examples/jsm/renderers/common/Renderer.js +70 -39
- package/examples/jsm/renderers/common/Textures.js +20 -8
- package/examples/jsm/renderers/common/nodes/Nodes.js +15 -4
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +51 -54
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +33 -9
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +55 -36
- package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +83 -5
- package/examples/jsm/renderers/webgpu/utils/WebGPUConstants.js +24 -22
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +83 -130
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +35 -8
- package/examples/jsm/renderers/webgpu/utils/WebGPUUtils.js +1 -1
- package/examples/jsm/shaders/OutputShader.js +19 -2
- package/examples/jsm/utils/BufferGeometryUtils.js +13 -4
- package/examples/jsm/webxr/OculusHandPointerModel.js +2 -2
- package/package.json +2 -2
- package/src/Three.js +2 -0
- package/src/animation/PropertyBinding.js +1 -1
- package/src/cameras/CubeCamera.js +1 -4
- package/src/constants.js +1 -1
- package/src/core/BufferAttribute.js +20 -0
- package/src/core/Object3D.js +1 -1
- package/src/core/RenderTarget.js +122 -0
- package/src/geometries/CapsuleGeometry.js +1 -1
- package/src/loaders/DataTextureLoader.js +21 -2
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -2
- package/src/renderers/WebGLRenderTarget.js +3 -110
- package/src/renderers/WebGLRenderer.js +62 -8
- package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +1 -2
- package/src/renderers/webgl/WebGLGeometries.js +5 -1
- package/src/renderers/webgl/WebGLMaterials.js +1 -1
- package/src/renderers/webgl/WebGLPrograms.js +14 -2
- package/src/renderers/webgl/WebGLTextures.js +97 -12
- package/src/textures/CompressedCubeTexture.js +19 -0
- package/examples/jsm/nodes/functions/BSDF/BRDF_BlinnPhong.js +0 -30
- package/examples/jsm/renderers/common/RenderTarget.js +0 -15
- 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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
|
@@ -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;
|