From 1e48aa39345679304a3c3a42d00f24e83d71e81d Mon Sep 17 00:00:00 2001 From: sunag Date: Fri, 30 Aug 2024 12:02:49 -0300 Subject: [PATCH] added basic `three.webgpu.nodes.js` --- src/Three.WebGPU.Nodes.js | 200 ++++++++++++++++++ src/Three.WebGPU.js | 2 +- src/nodes/lighting/LightsNode.js | 2 +- src/renderers/common/StandardRenderer.js | 18 -- src/renderers/webgpu/WebGPURenderer.Nodes.js | 42 ++++ src/renderers/webgpu/WebGPURenderer.js | 7 +- .../webgpu/nodes/BasicNodeLibrary.js | 59 ++++++ .../nodes/StandardNodeLibrary.js | 2 +- utils/build/rollup.config.js | 55 +++-- 9 files changed, 349 insertions(+), 38 deletions(-) create mode 100644 src/Three.WebGPU.Nodes.js delete mode 100644 src/renderers/common/StandardRenderer.js create mode 100644 src/renderers/webgpu/WebGPURenderer.Nodes.js create mode 100644 src/renderers/webgpu/nodes/BasicNodeLibrary.js rename src/renderers/{common => webgpu}/nodes/StandardNodeLibrary.js (98%) diff --git a/src/Three.WebGPU.Nodes.js b/src/Three.WebGPU.Nodes.js new file mode 100644 index 00000000000000..319efa3d2076b0 --- /dev/null +++ b/src/Three.WebGPU.Nodes.js @@ -0,0 +1,200 @@ +import { REVISION } from './constants.js'; + +export { WebGLArrayRenderTarget } from './renderers/WebGLArrayRenderTarget.js'; +export { WebGL3DRenderTarget } from './renderers/WebGL3DRenderTarget.js'; +export { WebGLCubeRenderTarget } from './renderers/WebGLCubeRenderTarget.js'; +export { WebGLRenderTarget } from './renderers/WebGLRenderTarget.js'; +//export { WebGLRenderer } from './renderers/WebGLRenderer.js'; +//export { ShaderLib } from './renderers/shaders/ShaderLib.js'; +//export { UniformsLib } from './renderers/shaders/UniformsLib.js'; +//export { UniformsUtils } from './renderers/shaders/UniformsUtils.js'; +//export { ShaderChunk } from './renderers/shaders/ShaderChunk.js'; +export { FogExp2 } from './scenes/FogExp2.js'; +export { Fog } from './scenes/Fog.js'; +export { Scene } from './scenes/Scene.js'; +export { Sprite } from './objects/Sprite.js'; +export { LOD } from './objects/LOD.js'; +export { SkinnedMesh } from './objects/SkinnedMesh.js'; +export { Skeleton } from './objects/Skeleton.js'; +export { Bone } from './objects/Bone.js'; +export { Mesh } from './objects/Mesh.js'; +export { InstancedMesh } from './objects/InstancedMesh.js'; +export { BatchedMesh } from './objects/BatchedMesh.js'; +export { LineSegments } from './objects/LineSegments.js'; +export { LineLoop } from './objects/LineLoop.js'; +export { Line } from './objects/Line.js'; +export { Points } from './objects/Points.js'; +export { Group } from './objects/Group.js'; +export { VideoTexture } from './textures/VideoTexture.js'; +export { FramebufferTexture } from './textures/FramebufferTexture.js'; +export { Source } from './textures/Source.js'; +export { DataTexture } from './textures/DataTexture.js'; +export { DataArrayTexture } from './textures/DataArrayTexture.js'; +export { Data3DTexture } from './textures/Data3DTexture.js'; +export { CompressedTexture } from './textures/CompressedTexture.js'; +export { CompressedArrayTexture } from './textures/CompressedArrayTexture.js'; +export { CompressedCubeTexture } from './textures/CompressedCubeTexture.js'; +export { CubeTexture } from './textures/CubeTexture.js'; +export { CanvasTexture } from './textures/CanvasTexture.js'; +export { DepthTexture } from './textures/DepthTexture.js'; +export { Texture } from './textures/Texture.js'; +export * from './geometries/Geometries.js'; +export * from './materials/Materials.js'; +export { Material } from './materials/Material.js'; +export { AnimationLoader } from './loaders/AnimationLoader.js'; +export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js'; +export { CubeTextureLoader } from './loaders/CubeTextureLoader.js'; +export { DataTextureLoader } from './loaders/DataTextureLoader.js'; +export { TextureLoader } from './loaders/TextureLoader.js'; +export { ObjectLoader } from './loaders/ObjectLoader.js'; +export { MaterialLoader } from './loaders/MaterialLoader.js'; +export { BufferGeometryLoader } from './loaders/BufferGeometryLoader.js'; +export { DefaultLoadingManager, LoadingManager } from './loaders/LoadingManager.js'; +export { ImageLoader } from './loaders/ImageLoader.js'; +export { ImageBitmapLoader } from './loaders/ImageBitmapLoader.js'; +export { FileLoader } from './loaders/FileLoader.js'; +export { Loader } from './loaders/Loader.js'; +export { LoaderUtils } from './loaders/LoaderUtils.js'; +export { Cache } from './loaders/Cache.js'; +export { AudioLoader } from './loaders/AudioLoader.js'; +export { SpotLight } from './lights/SpotLight.js'; +export { PointLight } from './lights/PointLight.js'; +export { RectAreaLight } from './lights/RectAreaLight.js'; +export { HemisphereLight } from './lights/HemisphereLight.js'; +export { DirectionalLight } from './lights/DirectionalLight.js'; +export { AmbientLight } from './lights/AmbientLight.js'; +export { Light } from './lights/Light.js'; +export { LightProbe } from './lights/LightProbe.js'; +export { StereoCamera } from './cameras/StereoCamera.js'; +export { PerspectiveCamera } from './cameras/PerspectiveCamera.js'; +export { OrthographicCamera } from './cameras/OrthographicCamera.js'; +export { CubeCamera } from './cameras/CubeCamera.js'; +export { ArrayCamera } from './cameras/ArrayCamera.js'; +export { Camera } from './cameras/Camera.js'; +export { AudioListener } from './audio/AudioListener.js'; +export { PositionalAudio } from './audio/PositionalAudio.js'; +export { AudioContext } from './audio/AudioContext.js'; +export { AudioAnalyser } from './audio/AudioAnalyser.js'; +export { Audio } from './audio/Audio.js'; +export { VectorKeyframeTrack } from './animation/tracks/VectorKeyframeTrack.js'; +export { StringKeyframeTrack } from './animation/tracks/StringKeyframeTrack.js'; +export { QuaternionKeyframeTrack } from './animation/tracks/QuaternionKeyframeTrack.js'; +export { NumberKeyframeTrack } from './animation/tracks/NumberKeyframeTrack.js'; +export { ColorKeyframeTrack } from './animation/tracks/ColorKeyframeTrack.js'; +export { BooleanKeyframeTrack } from './animation/tracks/BooleanKeyframeTrack.js'; +export { PropertyMixer } from './animation/PropertyMixer.js'; +export { PropertyBinding } from './animation/PropertyBinding.js'; +export { KeyframeTrack } from './animation/KeyframeTrack.js'; +export { AnimationUtils } from './animation/AnimationUtils.js'; +export { AnimationObjectGroup } from './animation/AnimationObjectGroup.js'; +export { AnimationMixer } from './animation/AnimationMixer.js'; +export { AnimationClip } from './animation/AnimationClip.js'; +export { AnimationAction } from './animation/AnimationAction.js'; +export { RenderTarget } from './core/RenderTarget.js'; +export { Uniform } from './core/Uniform.js'; +export { UniformsGroup } from './core/UniformsGroup.js'; +export { InstancedBufferGeometry } from './core/InstancedBufferGeometry.js'; +export { BufferGeometry } from './core/BufferGeometry.js'; +export { InterleavedBufferAttribute } from './core/InterleavedBufferAttribute.js'; +export { InstancedInterleavedBuffer } from './core/InstancedInterleavedBuffer.js'; +export { InterleavedBuffer } from './core/InterleavedBuffer.js'; +export { InstancedBufferAttribute } from './core/InstancedBufferAttribute.js'; +export { GLBufferAttribute } from './core/GLBufferAttribute.js'; +export * from './core/BufferAttribute.js'; +export { Object3D } from './core/Object3D.js'; +export { Raycaster } from './core/Raycaster.js'; +export { Layers } from './core/Layers.js'; +export { EventDispatcher } from './core/EventDispatcher.js'; +export { Clock } from './core/Clock.js'; +export { QuaternionLinearInterpolant } from './math/interpolants/QuaternionLinearInterpolant.js'; +export { LinearInterpolant } from './math/interpolants/LinearInterpolant.js'; +export { DiscreteInterpolant } from './math/interpolants/DiscreteInterpolant.js'; +export { CubicInterpolant } from './math/interpolants/CubicInterpolant.js'; +export { Interpolant } from './math/Interpolant.js'; +export { Triangle } from './math/Triangle.js'; +export { MathUtils } from './math/MathUtils.js'; +export { Spherical } from './math/Spherical.js'; +export { Cylindrical } from './math/Cylindrical.js'; +export { Plane } from './math/Plane.js'; +export { Frustum } from './math/Frustum.js'; +export { Sphere } from './math/Sphere.js'; +export { Ray } from './math/Ray.js'; +export { Matrix4 } from './math/Matrix4.js'; +export { Matrix3 } from './math/Matrix3.js'; +export { Matrix2 } from './math/Matrix2.js'; +export { Box3 } from './math/Box3.js'; +export { Box2 } from './math/Box2.js'; +export { Line3 } from './math/Line3.js'; +export { Euler } from './math/Euler.js'; +export { Vector4 } from './math/Vector4.js'; +export { Vector3 } from './math/Vector3.js'; +export { Vector2 } from './math/Vector2.js'; +export { Quaternion } from './math/Quaternion.js'; +export { Color } from './math/Color.js'; +export { ColorManagement } from './math/ColorManagement.js'; +export { SphericalHarmonics3 } from './math/SphericalHarmonics3.js'; +export { SpotLightHelper } from './helpers/SpotLightHelper.js'; +export { SkeletonHelper } from './helpers/SkeletonHelper.js'; +export { PointLightHelper } from './helpers/PointLightHelper.js'; +export { HemisphereLightHelper } from './helpers/HemisphereLightHelper.js'; +export { GridHelper } from './helpers/GridHelper.js'; +export { PolarGridHelper } from './helpers/PolarGridHelper.js'; +export { DirectionalLightHelper } from './helpers/DirectionalLightHelper.js'; +export { CameraHelper } from './helpers/CameraHelper.js'; +export { BoxHelper } from './helpers/BoxHelper.js'; +export { Box3Helper } from './helpers/Box3Helper.js'; +export { PlaneHelper } from './helpers/PlaneHelper.js'; +export { ArrowHelper } from './helpers/ArrowHelper.js'; +export { AxesHelper } from './helpers/AxesHelper.js'; +export * from './extras/curves/Curves.js'; +export { Shape } from './extras/core/Shape.js'; +export { Path } from './extras/core/Path.js'; +export { ShapePath } from './extras/core/ShapePath.js'; +export { CurvePath } from './extras/core/CurvePath.js'; +export { Curve } from './extras/core/Curve.js'; +export { Controls } from './extras/Controls.js'; +export { DataUtils } from './extras/DataUtils.js'; +export { ImageUtils } from './extras/ImageUtils.js'; +export { ShapeUtils } from './extras/ShapeUtils.js'; +//export { PMREMGenerator } from './extras/PMREMGenerator.js'; +//export { WebGLUtils } from './renderers/webgl/WebGLUtils.js'; +export { createCanvasElement } from './utils.js'; +export * from './constants.js'; +export * from './Three.Legacy.js'; + +export * from './materials/nodes/NodeMaterials.js'; +export { default as WebGPURenderer } from './renderers/webgpu/WebGPURenderer.Nodes.js'; +export { default as QuadMesh } from './renderers/common/QuadMesh.js'; +export { default as PMREMGenerator } from './renderers/common/extras/PMREMGenerator.js'; +export { default as PostProcessing } from './renderers/common/PostProcessing.js'; +export { default as StorageTexture } from './renderers/common/StorageTexture.js'; +export { default as StorageBufferAttribute } from './renderers/common/StorageBufferAttribute.js'; +export { default as StorageInstancedBufferAttribute } from './renderers/common/StorageInstancedBufferAttribute.js'; +export { default as IESSpotLight } from './lights/webgpu/IESSpotLight.js'; +export { default as NodeLoader } from './loaders/nodes/NodeLoader.js'; +export { default as NodeObjectLoader } from './loaders/nodes/NodeObjectLoader.js'; +export { default as NodeMaterialLoader } from './loaders/nodes/NodeMaterialLoader.js'; +export * from './nodes/Nodes.js'; +export * from './nodes/TSL.js'; + +if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { + + __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: { + revision: REVISION, + } } ) ); + +} + +if ( typeof window !== 'undefined' ) { + + if ( window.__THREE__ ) { + + console.warn( 'WARNING: Multiple instances of Three.js being imported.' ); + + } else { + + window.__THREE__ = REVISION; + + } + +} diff --git a/src/Three.WebGPU.js b/src/Three.WebGPU.js index 1f918d2ada2050..d0e3aa1aa2e536 100644 --- a/src/Three.WebGPU.js +++ b/src/Three.WebGPU.js @@ -40,7 +40,6 @@ export { DepthTexture } from './textures/DepthTexture.js'; export { Texture } from './textures/Texture.js'; export * from './geometries/Geometries.js'; export * from './materials/Materials.js'; -export * from './materials/nodes/NodeMaterials.js'; export { Material } from './materials/Material.js'; export { AnimationLoader } from './loaders/AnimationLoader.js'; export { CompressedTextureLoader } from './loaders/CompressedTextureLoader.js'; @@ -163,6 +162,7 @@ export { createCanvasElement } from './utils.js'; export * from './constants.js'; export * from './Three.Legacy.js'; +export * from './materials/nodes/NodeMaterials.js'; export { default as WebGPURenderer } from './renderers/webgpu/WebGPURenderer.js'; export { default as QuadMesh } from './renderers/common/QuadMesh.js'; export { default as PMREMGenerator } from './renderers/common/extras/PMREMGenerator.js'; diff --git a/src/nodes/lighting/LightsNode.js b/src/nodes/lighting/LightsNode.js index 7070188c5a824a..31a828e27c24b7 100644 --- a/src/nodes/lighting/LightsNode.js +++ b/src/nodes/lighting/LightsNode.js @@ -106,7 +106,7 @@ class LightsNode extends Node { const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor ); - if ( lightNodeClass === undefined ) { + if ( lightNodeClass === null ) { console.warn( `LightsNode.setupNodeLights: Light node not found for ${ light.constructor.name }` ); continue; diff --git a/src/renderers/common/StandardRenderer.js b/src/renderers/common/StandardRenderer.js deleted file mode 100644 index 6635f63ce23876..00000000000000 --- a/src/renderers/common/StandardRenderer.js +++ /dev/null @@ -1,18 +0,0 @@ -import Renderer from './Renderer.js'; -import StandardNodeLibrary from './nodes/StandardNodeLibrary.js'; - -class StandardRenderer extends Renderer { - - constructor( backend, parameters = {} ) { - - super( backend, parameters ); - - this.isStandardRenderer = true; - - this.nodes.library = new StandardNodeLibrary(); - - } - -} - -export default StandardRenderer; diff --git a/src/renderers/webgpu/WebGPURenderer.Nodes.js b/src/renderers/webgpu/WebGPURenderer.Nodes.js new file mode 100644 index 00000000000000..44d009aba447c6 --- /dev/null +++ b/src/renderers/webgpu/WebGPURenderer.Nodes.js @@ -0,0 +1,42 @@ +import Renderer from '../common/Renderer.js'; +import WebGLBackend from '../webgl-fallback/WebGLBackend.js'; +import WebGPUBackend from './WebGPUBackend.js'; +import BasicNodeLibrary from './nodes/BasicNodeLibrary.js'; + +class WebGPURenderer extends Renderer { + + constructor( parameters = {} ) { + + let BackendClass; + + if ( parameters.forceWebGL ) { + + BackendClass = WebGLBackend; + + } else { + + BackendClass = WebGPUBackend; + + parameters.getFallback = () => { + + console.warn( 'THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' ); + + return new WebGLBackend( parameters ); + + }; + + } + + const backend = new BackendClass( parameters ); + + super( backend, parameters ); + + this.nodes.library = new BasicNodeLibrary(); + + this.isWebGPURenderer = true; + + } + +} + +export default WebGPURenderer; diff --git a/src/renderers/webgpu/WebGPURenderer.js b/src/renderers/webgpu/WebGPURenderer.js index 815dd9342700bc..4da8b4b79d18a0 100644 --- a/src/renderers/webgpu/WebGPURenderer.js +++ b/src/renderers/webgpu/WebGPURenderer.js @@ -1,6 +1,7 @@ -import StandardRenderer from '../common/StandardRenderer.js'; +import Renderer from '../common/Renderer.js'; import WebGLBackend from '../webgl-fallback/WebGLBackend.js'; import WebGPUBackend from './WebGPUBackend.js'; +import StandardNodeLibrary from './nodes/StandardNodeLibrary.js'; /* const debugHandler = { @@ -15,7 +16,7 @@ const debugHandler = { }; */ -class WebGPURenderer extends StandardRenderer { +class WebGPURenderer extends Renderer { constructor( parameters = {} ) { @@ -44,6 +45,8 @@ class WebGPURenderer extends StandardRenderer { //super( new Proxy( backend, debugHandler ) ); super( backend, parameters ); + this.nodes.library = new StandardNodeLibrary(); + this.isWebGPURenderer = true; } diff --git a/src/renderers/webgpu/nodes/BasicNodeLibrary.js b/src/renderers/webgpu/nodes/BasicNodeLibrary.js new file mode 100644 index 00000000000000..d585b4a1037fc6 --- /dev/null +++ b/src/renderers/webgpu/nodes/BasicNodeLibrary.js @@ -0,0 +1,59 @@ +import NodeLibrary from '../../common/nodes/NodeLibrary.js'; + +// Lights +import { PointLight } from '../../../lights/PointLight.js'; +import { PointLightNode } from '../../../nodes/Nodes.js'; +import { DirectionalLight } from '../../../lights/DirectionalLight.js'; +import { DirectionalLightNode } from '../../../nodes/Nodes.js'; +import { RectAreaLight } from '../../../lights/RectAreaLight.js'; +import { RectAreaLightNode } from '../../../nodes/Nodes.js'; +import { SpotLight } from '../../../lights/SpotLight.js'; +import { SpotLightNode } from '../../../nodes/Nodes.js'; +import { AmbientLight } from '../../../lights/AmbientLight.js'; +import { AmbientLightNode } from '../../../nodes/Nodes.js'; +import { HemisphereLight } from '../../../lights/HemisphereLight.js'; +import { HemisphereLightNode } from '../../../nodes/Nodes.js'; +import { LightProbe } from '../../../lights/LightProbe.js'; +import { LightProbeNode } from '../../../nodes/Nodes.js'; +import IESSpotLight from '../../../lights/webgpu/IESSpotLight.js'; +import { IESSpotLightNode } from '../../../nodes/Nodes.js'; + +// Tone Mapping +import { LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping, NeutralToneMapping } from '../../../constants.js'; +import * as TMF from '../../../nodes/display/ToneMappingFunctions.js'; + +// Color Space +import { LinearSRGBColorSpace, SRGBColorSpace } from '../../../constants.js'; +import { getColorSpaceMethod } from '../../../nodes/display/ColorSpaceNode.js'; +import * as CSF from '../../../nodes/display/ColorSpaceFunctions.js'; + +class BasicNodeLibrary extends NodeLibrary { + + constructor() { + + super(); + + this.addLight( PointLightNode, PointLight ); + this.addLight( DirectionalLightNode, DirectionalLight ); + this.addLight( RectAreaLightNode, RectAreaLight ); + this.addLight( SpotLightNode, SpotLight ); + this.addLight( AmbientLightNode, AmbientLight ); + this.addLight( HemisphereLightNode, HemisphereLight ); + this.addLight( LightProbeNode, LightProbe ); + this.addLight( IESSpotLightNode, IESSpotLight ); + + this.addToneMapping( TMF.LinearToneMapping, LinearToneMapping ); + this.addToneMapping( TMF.ReinhardToneMapping, ReinhardToneMapping ); + this.addToneMapping( TMF.CineonToneMapping, CineonToneMapping ); + this.addToneMapping( TMF.ACESFilmicToneMapping, ACESFilmicToneMapping ); + this.addToneMapping( TMF.AgXToneMapping, AgXToneMapping ); + this.addToneMapping( TMF.NeutralToneMapping, NeutralToneMapping ); + + this.addColorSpace( CSF.LinearTosRGB, getColorSpaceMethod( LinearSRGBColorSpace, SRGBColorSpace ) ); + this.addColorSpace( CSF.sRGBToLinear, getColorSpaceMethod( SRGBColorSpace, LinearSRGBColorSpace ) ); + + } + +} + +export default BasicNodeLibrary; diff --git a/src/renderers/common/nodes/StandardNodeLibrary.js b/src/renderers/webgpu/nodes/StandardNodeLibrary.js similarity index 98% rename from src/renderers/common/nodes/StandardNodeLibrary.js rename to src/renderers/webgpu/nodes/StandardNodeLibrary.js index 5bfbe4f12a310e..549a748459eaa9 100644 --- a/src/renderers/common/nodes/StandardNodeLibrary.js +++ b/src/renderers/webgpu/nodes/StandardNodeLibrary.js @@ -1,4 +1,4 @@ -import NodeLibrary from './NodeLibrary.js'; +import NodeLibrary from '../../common/nodes/NodeLibrary.js'; // Materials import { MeshPhongMaterial } from '../../../materials/MeshPhongMaterial.js'; diff --git a/utils/build/rollup.config.js b/utils/build/rollup.config.js index e47e6ba8a9e001..eb5a722af03e22 100644 --- a/utils/build/rollup.config.js +++ b/utils/build/rollup.config.js @@ -75,43 +75,40 @@ const builds = [ ] }, { - input: 'src/Three.js', + input: 'src/Three.WebGPU.js', plugins: [ - glsl(), - header(), - terser() + header() ], output: [ { format: 'esm', - file: 'build/three.module.min.js' + file: 'build/three.webgpu.js' } ] }, { - input: 'src/Three.js', + input: 'src/Three.WebGPU.Nodes.js', plugins: [ - glsl(), header() ], output: [ { - format: 'cjs', - name: 'THREE', - file: 'build/three.cjs', - indent: '\t' + format: 'esm', + file: 'build/three.webgpu.nodes.js' } ] }, { - input: 'src/Three.WebGPU.js', + input: 'src/Three.js', plugins: [ - header() + glsl(), + header(), + terser() ], output: [ { format: 'esm', - file: 'build/three.webgpu.js' + file: 'build/three.module.min.js' } ] }, @@ -127,7 +124,35 @@ const builds = [ file: 'build/three.webgpu.min.js' } ] + }, + { + input: 'src/Three.WebGPU.Nodes.js', + plugins: [ + header(), + terser() + ], + output: [ + { + format: 'esm', + file: 'build/three.webgpu.nodes.min.js' + } + ] + }, + { + input: 'src/Three.js', + plugins: [ + glsl(), + header() + ], + output: [ + { + format: 'cjs', + name: 'THREE', + file: 'build/three.cjs', + indent: '\t' + } + ] } ]; -export default ( args ) => args.configOnlyModule ? [ builds[ 0 ], builds[ 3 ] ] : builds; +export default ( args ) => args.configOnlyModule ? builds.slice( 0, 3 ) : builds;