@plastic-software/three 0.181.3 → 0.183.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/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +11330 -10017
- package/build/three.core.js +10011 -9493
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1414 -631
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +21 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +8007 -5427
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +8005 -5426
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +0 -3
- package/examples/jsm/animation/CCDIKSolver.js +2 -2
- package/examples/jsm/controls/ArcballControls.js +3 -3
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +109 -6
- package/examples/jsm/controls/TrackballControls.js +6 -6
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +131 -4
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +67 -8
- package/examples/jsm/inspector/Inspector.js +74 -14
- package/examples/jsm/inspector/RendererInspector.js +12 -2
- package/examples/jsm/inspector/tabs/Console.js +41 -7
- package/examples/jsm/inspector/tabs/Parameters.js +18 -2
- package/examples/jsm/inspector/tabs/Performance.js +2 -2
- package/examples/jsm/inspector/tabs/Viewer.js +4 -4
- package/examples/jsm/inspector/ui/Profiler.js +1836 -31
- package/examples/jsm/inspector/ui/Style.js +973 -14
- package/examples/jsm/inspector/ui/Tab.js +188 -1
- package/examples/jsm/inspector/ui/Values.js +17 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
- package/examples/jsm/lines/LineMaterial.js +6 -0
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +5 -5
- package/examples/jsm/loaders/EXRLoader.js +5 -5
- package/examples/jsm/loaders/FBXLoader.js +2 -4
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +122 -171
- package/examples/jsm/loaders/HDRLoader.js +0 -1
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +19 -3
- package/examples/jsm/loaders/LDrawLoader.js +2 -3
- package/examples/jsm/loaders/LWOLoader.js +7 -39
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/SVGLoader.js +1 -1
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +37 -24
- package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
- package/examples/jsm/loaders/usd/USDAParser.js +447 -366
- package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Sky.js +76 -4
- package/examples/jsm/objects/SkyMesh.js +127 -10
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +268 -30
- package/examples/jsm/renderers/SVGRenderer.js +193 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +5 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
- package/examples/jsm/tsl/display/GodraysNode.js +624 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +3 -3
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +8 -20
- package/examples/jsm/tsl/display/SSRNode.js +8 -8
- package/examples/jsm/tsl/display/SSSNode.js +6 -4
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TRAANode.js +273 -125
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/math/Bayer.js +40 -1
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/package.json +20 -26
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +19 -11
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +3 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/constants.js +90 -5
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +56 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +3 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/FileLoader.js +1 -1
- package/src/loaders/ImageBitmapLoader.js +8 -3
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +2 -1
- package/src/loaders/ObjectLoader.js +21 -2
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +7 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +72 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
- package/src/math/Line3.js +3 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix4.js +74 -65
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Vector3.js +3 -5
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +87 -68
- package/src/nodes/TSL.js +6 -6
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +98 -12
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +4 -4
- package/src/nodes/accessors/CubeTextureNode.js +20 -1
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +11 -11
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
- package/src/nodes/accessors/ReferenceNode.js +4 -4
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +53 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +4 -21
- package/src/nodes/accessors/StorageTextureNode.js +37 -1
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +58 -22
- package/src/nodes/accessors/UniformArrayNode.js +4 -2
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionNode.js +1 -2
- package/src/nodes/core/ArrayNode.js +20 -1
- package/src/nodes/core/AssignNode.js +2 -2
- package/src/nodes/core/AttributeNode.js +2 -2
- package/src/nodes/core/ContextNode.js +103 -4
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +29 -3
- package/src/nodes/core/NodeBuilder.js +170 -53
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +10 -8
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +3 -3
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +65 -16
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +16 -2
- package/src/nodes/core/StructTypeNode.js +11 -17
- package/src/nodes/core/SubBuildNode.js +1 -1
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +47 -22
- package/src/nodes/core/VaryingNode.js +1 -18
- package/src/nodes/display/BlendModes.js +0 -64
- package/src/nodes/display/ColorAdjustment.js +17 -0
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/NormalMapNode.js +39 -4
- package/src/nodes/display/PassNode.js +98 -9
- package/src/nodes/display/RenderOutputNode.js +3 -3
- package/src/nodes/display/ScreenNode.js +3 -1
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportTextureNode.js +21 -4
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +4 -2
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
- package/src/nodes/gpgpu/ComputeNode.js +5 -4
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +2 -2
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +97 -41
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +2 -2
- package/src/nodes/math/MathNode.js +3 -40
- package/src/nodes/math/OperatorNode.js +2 -1
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLCore.js +17 -14
- package/src/nodes/utils/ArrayElementNode.js +13 -0
- package/src/nodes/utils/DebugNode.js +11 -11
- package/src/nodes/utils/EventNode.js +1 -2
- package/src/nodes/utils/JoinNode.js +2 -2
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +1 -1
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +3 -4
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +27 -14
- package/src/objects/InstancedMesh.js +11 -0
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +9 -0
- package/src/renderers/WebGLRenderer.js +178 -92
- package/src/renderers/common/Backend.js +29 -0
- package/src/renderers/common/Background.js +24 -11
- package/src/renderers/common/BindGroup.js +1 -9
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +27 -12
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/CubeRenderTarget.js +50 -6
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +4 -4
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/RenderBundles.js +2 -1
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +15 -3
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +18 -2
- package/src/renderers/common/RenderPipeline.js +203 -17
- package/src/renderers/common/Renderer.js +257 -72
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +17 -1
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +61 -0
- package/src/renderers/common/XRManager.js +3 -2
- package/src/renderers/common/extras/PMREMGenerator.js +2 -8
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +3 -3
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -5
- package/src/renderers/shaders/UniformsLib.js +0 -3
- package/src/renderers/webgl/WebGLBackground.js +2 -2
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLCapabilities.js +3 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +12 -0
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +267 -0
- package/src/renderers/webgl/WebGLProgram.js +45 -109
- package/src/renderers/webgl/WebGLPrograms.js +45 -49
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +32 -37
- package/src/renderers/webgl/WebGLTextures.js +89 -28
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
- package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +119 -13
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/Source.js +1 -1
- package/src/textures/Texture.js +3 -3
- package/src/utils.js +258 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -0,0 +1,624 @@
|
|
|
1
|
+
import { Frustum, Matrix4, RenderTarget, Vector2, RendererUtils, QuadMesh, TempNode, NodeMaterial, NodeUpdateType, Vector3, Plane, WebGPUCoordinateSystem } from 'three/webgpu';
|
|
2
|
+
import { cubeTexture, clamp, viewZToPerspectiveDepth, logarithmicDepthToViewZ, float, Loop, max, Fn, passTexture, uv, dot, uniformArray, If, getViewPosition, uniform, vec4, add, interleavedGradientNoise, screenCoordinate, round, mul, uint, mix, exp, vec3, distance, pow, reference, lightPosition, vec2, bool, texture, perspectiveDepthToViewZ, lightShadowMatrix } from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
|
+
const _size = /*@__PURE__*/ new Vector2();
|
|
6
|
+
|
|
7
|
+
const _DIRECTIONS = [
|
|
8
|
+
new Vector3( 1, 0, 0 ),
|
|
9
|
+
new Vector3( - 1, 0, 0 ),
|
|
10
|
+
new Vector3( 0, 1, 0 ),
|
|
11
|
+
new Vector3( 0, - 1, 0 ),
|
|
12
|
+
new Vector3( 0, 0, 1 ),
|
|
13
|
+
new Vector3( 0, 0, - 1 ),
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
const _PLANES = _DIRECTIONS.map( () => new Plane() );
|
|
17
|
+
const _SCRATCH_VECTOR = new Vector3();
|
|
18
|
+
const _SCRATCH_MAT4 = new Matrix4();
|
|
19
|
+
const _SCRATCH_FRUSTUM = new Frustum();
|
|
20
|
+
|
|
21
|
+
let _rendererState;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Post-Processing node for apply Screen-space raymarched godrays to a scene.
|
|
25
|
+
*
|
|
26
|
+
* After the godrays have been computed, it's recommened to apply a Bilateral
|
|
27
|
+
* Blur to the result to mitigate raymarching and noise artifacts.
|
|
28
|
+
*
|
|
29
|
+
* The composite with the scene pass is ideally done with `depthAwareBlend()`,
|
|
30
|
+
* which mitigates aliasing and light leaking.
|
|
31
|
+
*
|
|
32
|
+
* ```js
|
|
33
|
+
* const godraysPass = godrays( scenePassDepth, camera, light );
|
|
34
|
+
*
|
|
35
|
+
* const blurPass = bilateralBlur( godraysPassColor ); // optional blur
|
|
36
|
+
*
|
|
37
|
+
* const outputBlurred = depthAwareBlend( scenePassColor, blurPassColor, scenePassDepth, camera, { blendColor, edgeRadius, edgeStrength } ); // composite
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* Limitations:
|
|
41
|
+
*
|
|
42
|
+
* - Only point and directional lights are currently supported.
|
|
43
|
+
* - The effect requires a full shadow setup. Meaning shadows must be enabled in the renderer,
|
|
44
|
+
* 3D objects must cast and receive shadows and the main light must cast shadows.
|
|
45
|
+
*
|
|
46
|
+
* Reference: This Node is a part of [three-good-godrays](https://github.com/Ameobea/three-good-godrays).
|
|
47
|
+
*
|
|
48
|
+
* @augments TempNode
|
|
49
|
+
* @three_import import { godrays } from 'three/addons/tsl/display/GodraysNode.js';
|
|
50
|
+
*/
|
|
51
|
+
class GodraysNode extends TempNode {
|
|
52
|
+
|
|
53
|
+
static get type() {
|
|
54
|
+
|
|
55
|
+
return 'GodraysNode';
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Constructs a new Godrays node.
|
|
61
|
+
*
|
|
62
|
+
* @param {TextureNode} depthNode - A texture node that represents the scene's depth.
|
|
63
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
64
|
+
* @param {(DirectionalLight|PointLight)} light - The light the godrays are rendered for.
|
|
65
|
+
*/
|
|
66
|
+
constructor( depthNode, camera, light ) {
|
|
67
|
+
|
|
68
|
+
super( 'vec4' );
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* A node that represents the beauty pass's depth.
|
|
72
|
+
*
|
|
73
|
+
* @type {TextureNode}
|
|
74
|
+
*/
|
|
75
|
+
this.depthNode = depthNode;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The number of raymarching steps
|
|
79
|
+
*
|
|
80
|
+
* @type {UniformNode<uint>}
|
|
81
|
+
* @default 60
|
|
82
|
+
*/
|
|
83
|
+
this.raymarchSteps = uniform( uint( 60 ) );
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The rate of accumulation for the godrays. Higher values roughly equate to more humid air/denser fog.
|
|
87
|
+
*
|
|
88
|
+
* @type {UniformNode<float>}
|
|
89
|
+
* @default 0.7
|
|
90
|
+
*/
|
|
91
|
+
this.density = uniform( float( 0.7 ) );
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The maximum density of the godrays. Limits the maximum brightness of the godrays.
|
|
95
|
+
*
|
|
96
|
+
* @type {UniformNode<float>}
|
|
97
|
+
* @default 0.5
|
|
98
|
+
*/
|
|
99
|
+
this.maxDensity = uniform( float( 0.5 ) );
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Higher values decrease the accumulation of godrays the further away they are from the light source.
|
|
103
|
+
*
|
|
104
|
+
* @type {UniformNode<float>}
|
|
105
|
+
* @default 2
|
|
106
|
+
*/
|
|
107
|
+
this.distanceAttenuation = uniform( float( 2 ) );
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The resolution scale.
|
|
111
|
+
*
|
|
112
|
+
* @type {number}
|
|
113
|
+
*/
|
|
114
|
+
this.resolutionScale = 0.5;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
118
|
+
* its effect once per frame in `updateBefore()`.
|
|
119
|
+
*
|
|
120
|
+
* @type {string}
|
|
121
|
+
* @default 'frame'
|
|
122
|
+
*/
|
|
123
|
+
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
124
|
+
|
|
125
|
+
// private uniforms
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Represents the world matrix of the scene's camera.
|
|
129
|
+
*
|
|
130
|
+
* @private
|
|
131
|
+
* @type {UniformNode<mat4>}
|
|
132
|
+
*/
|
|
133
|
+
this._cameraMatrixWorld = uniform( camera.matrixWorld );
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Represents the inverse projection matrix of the scene's camera.
|
|
137
|
+
*
|
|
138
|
+
* @private
|
|
139
|
+
* @type {UniformNode<mat4>}
|
|
140
|
+
*/
|
|
141
|
+
this._cameraProjectionMatrixInverse = uniform( camera.projectionMatrixInverse );
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Represents the inverse projection matrix of the scene's camera.
|
|
145
|
+
*
|
|
146
|
+
* @private
|
|
147
|
+
* @type {UniformNode<mat4>}
|
|
148
|
+
*/
|
|
149
|
+
this._premultipliedLightCameraMatrix = uniform( new Matrix4() );
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Represents the world position of the scene's camera.
|
|
153
|
+
*
|
|
154
|
+
* @private
|
|
155
|
+
* @type {UniformNode<mat4>}
|
|
156
|
+
*/
|
|
157
|
+
this._cameraPosition = uniform( new Vector3() );
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Represents the near value of the scene's camera.
|
|
161
|
+
*
|
|
162
|
+
* @private
|
|
163
|
+
* @type {ReferenceNode<float>}
|
|
164
|
+
*/
|
|
165
|
+
this._cameraNear = reference( 'near', 'float', camera );
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Represents the far value of the scene's camera.
|
|
169
|
+
*
|
|
170
|
+
* @private
|
|
171
|
+
* @type {ReferenceNode<float>}
|
|
172
|
+
*/
|
|
173
|
+
this._cameraFar = reference( 'far', 'float', camera );
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* The near value of the shadow camera.
|
|
177
|
+
*
|
|
178
|
+
* @private
|
|
179
|
+
* @type {ReferenceNode<float>}
|
|
180
|
+
*/
|
|
181
|
+
this._shadowCameraNear = reference( 'near', 'float', light.shadow.camera );
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The far value of the shadow camera.
|
|
185
|
+
*
|
|
186
|
+
* @private
|
|
187
|
+
* @type {ReferenceNode<float>}
|
|
188
|
+
*/
|
|
189
|
+
this._shadowCameraFar = reference( 'far', 'float', light.shadow.camera );
|
|
190
|
+
|
|
191
|
+
this._fNormals = uniformArray( _DIRECTIONS.map( () => new Vector3() ) );
|
|
192
|
+
this._fConstants = uniformArray( _DIRECTIONS.map( () => 0 ) );
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* The light the godrays are rendered for.
|
|
196
|
+
*
|
|
197
|
+
* @private
|
|
198
|
+
* @type {(DirectionalLight|PointLight)}
|
|
199
|
+
*/
|
|
200
|
+
this._light = light;
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* The camera the scene is rendered with.
|
|
204
|
+
*
|
|
205
|
+
* @private
|
|
206
|
+
* @type {Camera}
|
|
207
|
+
*/
|
|
208
|
+
this._camera = camera;
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* The render target the godrays are rendered into.
|
|
212
|
+
*
|
|
213
|
+
* @private
|
|
214
|
+
* @type {RenderTarget}
|
|
215
|
+
*/
|
|
216
|
+
this._godraysRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
217
|
+
this._godraysRenderTarget.texture.name = 'Godrays';
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* The material that is used to render the effect.
|
|
221
|
+
*
|
|
222
|
+
* @private
|
|
223
|
+
* @type {NodeMaterial}
|
|
224
|
+
*/
|
|
225
|
+
this._material = new NodeMaterial();
|
|
226
|
+
this._material.name = 'Godrays';
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* The result of the effect is represented as a separate texture node.
|
|
230
|
+
*
|
|
231
|
+
* @private
|
|
232
|
+
* @type {PassTextureNode}
|
|
233
|
+
*/
|
|
234
|
+
this._textureNode = passTexture( this, this._godraysRenderTarget.texture );
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Returns the result of the effect as a texture node.
|
|
241
|
+
*
|
|
242
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
243
|
+
*/
|
|
244
|
+
getTextureNode() {
|
|
245
|
+
|
|
246
|
+
return this._textureNode;
|
|
247
|
+
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Sets the size of the effect.
|
|
252
|
+
*
|
|
253
|
+
* @param {number} width - The width of the effect.
|
|
254
|
+
* @param {number} height - The height of the effect.
|
|
255
|
+
*/
|
|
256
|
+
setSize( width, height ) {
|
|
257
|
+
|
|
258
|
+
width = Math.round( this.resolutionScale * width );
|
|
259
|
+
height = Math.round( this.resolutionScale * height );
|
|
260
|
+
|
|
261
|
+
this._godraysRenderTarget.setSize( width, height );
|
|
262
|
+
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* This method is used to render the effect once per frame.
|
|
267
|
+
*
|
|
268
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
269
|
+
*/
|
|
270
|
+
updateBefore( frame ) {
|
|
271
|
+
|
|
272
|
+
const { renderer } = frame;
|
|
273
|
+
|
|
274
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
275
|
+
|
|
276
|
+
//
|
|
277
|
+
|
|
278
|
+
const size = renderer.getDrawingBufferSize( _size );
|
|
279
|
+
this.setSize( size.width, size.height );
|
|
280
|
+
|
|
281
|
+
//
|
|
282
|
+
|
|
283
|
+
_quadMesh.material = this._material;
|
|
284
|
+
_quadMesh.name = 'Godrays';
|
|
285
|
+
|
|
286
|
+
this._updateLightParams();
|
|
287
|
+
|
|
288
|
+
this._cameraPosition.value.setFromMatrixPosition( this._camera.matrixWorld );
|
|
289
|
+
|
|
290
|
+
// clear
|
|
291
|
+
|
|
292
|
+
renderer.setClearColor( 0xffffff, 1 );
|
|
293
|
+
|
|
294
|
+
// godrays
|
|
295
|
+
|
|
296
|
+
renderer.setRenderTarget( this._godraysRenderTarget );
|
|
297
|
+
_quadMesh.render( renderer );
|
|
298
|
+
|
|
299
|
+
// restore
|
|
300
|
+
|
|
301
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
302
|
+
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
_updateLightParams() {
|
|
306
|
+
|
|
307
|
+
const light = this._light;
|
|
308
|
+
const shadowCamera = light.shadow.camera;
|
|
309
|
+
|
|
310
|
+
this._premultipliedLightCameraMatrix.value.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
|
|
311
|
+
|
|
312
|
+
if ( light.isPointLight ) {
|
|
313
|
+
|
|
314
|
+
for ( let i = 0; i < _DIRECTIONS.length; i ++ ) {
|
|
315
|
+
|
|
316
|
+
const direction = _DIRECTIONS[ i ];
|
|
317
|
+
const plane = _PLANES[ i ];
|
|
318
|
+
|
|
319
|
+
_SCRATCH_VECTOR.copy( light.position );
|
|
320
|
+
_SCRATCH_VECTOR.addScaledVector( direction, shadowCamera.far );
|
|
321
|
+
plane.setFromNormalAndCoplanarPoint( direction, _SCRATCH_VECTOR );
|
|
322
|
+
|
|
323
|
+
this._fNormals.array[ i ].copy( plane.normal );
|
|
324
|
+
this._fConstants.array[ i ] = plane.constant;
|
|
325
|
+
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
} else if ( light.isDirectionalLight ) {
|
|
329
|
+
|
|
330
|
+
_SCRATCH_MAT4.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
|
|
331
|
+
_SCRATCH_FRUSTUM.setFromProjectionMatrix( _SCRATCH_MAT4 );
|
|
332
|
+
|
|
333
|
+
for ( let i = 0; i < 6; i ++ ) {
|
|
334
|
+
|
|
335
|
+
const plane = _SCRATCH_FRUSTUM.planes[ i ];
|
|
336
|
+
|
|
337
|
+
this._fNormals.array[ i ].copy( plane.normal ).multiplyScalar( - 1 );
|
|
338
|
+
this._fConstants.array[ i ] = plane.constant * - 1;
|
|
339
|
+
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* This method is used to setup the effect's TSL code.
|
|
348
|
+
*
|
|
349
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
350
|
+
* @return {PassTextureNode}
|
|
351
|
+
*/
|
|
352
|
+
setup( builder ) {
|
|
353
|
+
|
|
354
|
+
const { renderer } = builder;
|
|
355
|
+
|
|
356
|
+
const uvNode = uv();
|
|
357
|
+
const lightPos = lightPosition( this._light );
|
|
358
|
+
|
|
359
|
+
const sampleDepth = ( uv ) => {
|
|
360
|
+
|
|
361
|
+
const depth = this.depthNode.sample( uv ).r;
|
|
362
|
+
|
|
363
|
+
if ( builder.renderer.logarithmicDepthBuffer === true ) {
|
|
364
|
+
|
|
365
|
+
const viewZ = logarithmicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
|
|
366
|
+
|
|
367
|
+
return viewZToPerspectiveDepth( viewZ, this._cameraNear, this._cameraFar );
|
|
368
|
+
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return depth;
|
|
372
|
+
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
const sdPlane = ( p, n, h ) => {
|
|
376
|
+
|
|
377
|
+
return dot( p, n ).add( h );
|
|
378
|
+
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
const intersectRayPlane = ( rayOrigin, rayDirection, planeNormal, planeDistance ) => {
|
|
382
|
+
|
|
383
|
+
const denom = dot( planeNormal, rayDirection );
|
|
384
|
+
return sdPlane( rayOrigin, planeNormal, planeDistance ).div( denom ).negate();
|
|
385
|
+
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
const computeShadowCoord = ( worldPos ) => {
|
|
389
|
+
|
|
390
|
+
const shadowPosition = lightShadowMatrix( this._light ).mul( worldPos );
|
|
391
|
+
const shadowCoord = shadowPosition.xyz.div( shadowPosition.w );
|
|
392
|
+
let coordZ = shadowCoord.z;
|
|
393
|
+
|
|
394
|
+
if ( renderer.coordinateSystem === WebGPUCoordinateSystem ) {
|
|
395
|
+
|
|
396
|
+
coordZ = coordZ.mul( 2 ).sub( 1 ); // WebGPU: Conversion [ 0, 1 ] to [ - 1, 1 ]
|
|
397
|
+
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return vec3( shadowCoord.x, shadowCoord.y.oneMinus(), coordZ );
|
|
401
|
+
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
const inShadow = ( worldPos ) => {
|
|
405
|
+
|
|
406
|
+
if ( this._light.isPointLight ) {
|
|
407
|
+
|
|
408
|
+
const lightToPos = worldPos.sub( lightPos ).toConst();
|
|
409
|
+
|
|
410
|
+
const shadowPositionAbs = lightToPos.abs().toConst();
|
|
411
|
+
const viewZ = shadowPositionAbs.x.max( shadowPositionAbs.y ).max( shadowPositionAbs.z ).negate();
|
|
412
|
+
|
|
413
|
+
const depth = viewZToPerspectiveDepth( viewZ, this._shadowCameraNear, this._shadowCameraFar );
|
|
414
|
+
|
|
415
|
+
const result = cubeTexture( this._light.shadow.map.depthTexture, lightToPos ).compare( depth ).r;
|
|
416
|
+
|
|
417
|
+
return vec2( result.oneMinus().add( 0.005 ), viewZ.negate() );
|
|
418
|
+
|
|
419
|
+
} else if ( this._light.isDirectionalLight ) {
|
|
420
|
+
|
|
421
|
+
const shadowCoord = computeShadowCoord( worldPos ).toConst();
|
|
422
|
+
|
|
423
|
+
const frustumTest = shadowCoord.x.greaterThanEqual( 0 )
|
|
424
|
+
.and( shadowCoord.x.lessThanEqual( 1 ) )
|
|
425
|
+
.and( shadowCoord.y.greaterThanEqual( 0 ) )
|
|
426
|
+
.and( shadowCoord.y.lessThanEqual( 1 ) )
|
|
427
|
+
.and( shadowCoord.z.greaterThanEqual( 0 ) )
|
|
428
|
+
.and( shadowCoord.z.lessThanEqual( 1 ) );
|
|
429
|
+
|
|
430
|
+
const output = vec2( 1, 0 );
|
|
431
|
+
|
|
432
|
+
If( frustumTest.equal( true ), () => {
|
|
433
|
+
|
|
434
|
+
const result = texture( this._light.shadow.map.depthTexture, shadowCoord.xy ).compare( shadowCoord.z ).r;
|
|
435
|
+
|
|
436
|
+
const viewZ = perspectiveDepthToViewZ( shadowCoord.z, this._shadowCameraNear, this._shadowCameraFar );
|
|
437
|
+
|
|
438
|
+
output.assign( vec2( result.oneMinus(), viewZ.negate() ) );
|
|
439
|
+
|
|
440
|
+
} );
|
|
441
|
+
|
|
442
|
+
return output;
|
|
443
|
+
|
|
444
|
+
} else {
|
|
445
|
+
|
|
446
|
+
throw new Error( 'GodraysNode: Unsupported light type.' );
|
|
447
|
+
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
const godrays = Fn( () => {
|
|
453
|
+
|
|
454
|
+
const output = vec4( 0, 0, 0, 1 ).toVar();
|
|
455
|
+
const isEarlyOut = bool( false );
|
|
456
|
+
|
|
457
|
+
const depth = sampleDepth( uvNode ).toConst();
|
|
458
|
+
const viewPosition = getViewPosition( uvNode, depth, this._cameraProjectionMatrixInverse ).toConst();
|
|
459
|
+
const worldPosition = this._cameraMatrixWorld.mul( viewPosition );
|
|
460
|
+
|
|
461
|
+
const inBoxDist = float( - 10000.0 ).toVar();
|
|
462
|
+
|
|
463
|
+
Loop( 6, ( { i } ) => {
|
|
464
|
+
|
|
465
|
+
inBoxDist.assign( max( inBoxDist, sdPlane( this._cameraPosition, this._fNormals.element( i ), this._fConstants.element( i ) ) ) );
|
|
466
|
+
|
|
467
|
+
} );
|
|
468
|
+
|
|
469
|
+
const startPosition = this._cameraPosition.toVar();
|
|
470
|
+
|
|
471
|
+
If( inBoxDist.lessThan( 0 ), () => {
|
|
472
|
+
|
|
473
|
+
// If the ray target is outside the shadow box, move it to the nearest
|
|
474
|
+
// point on the box to avoid marching through unlit space
|
|
475
|
+
|
|
476
|
+
Loop( 6, ( { i } ) => {
|
|
477
|
+
|
|
478
|
+
If( sdPlane( worldPosition, this._fNormals.element( i ), this._fConstants.element( i ) ).greaterThan( 0 ), () => {
|
|
479
|
+
|
|
480
|
+
const direction = worldPosition.sub( this._cameraPosition ).toConst();
|
|
481
|
+
|
|
482
|
+
const t = intersectRayPlane( this._cameraPosition, direction, this._fNormals.element( i ), this._fConstants.element( i ) );
|
|
483
|
+
|
|
484
|
+
worldPosition.assign( this._cameraPosition.add( t.mul( direction ) ) );
|
|
485
|
+
|
|
486
|
+
} );
|
|
487
|
+
|
|
488
|
+
} );
|
|
489
|
+
|
|
490
|
+
} ).Else( () => {
|
|
491
|
+
|
|
492
|
+
// Find the first point where the ray intersects the shadow box (startPos)
|
|
493
|
+
|
|
494
|
+
const direction = worldPosition.sub( this._cameraPosition ).toConst();
|
|
495
|
+
|
|
496
|
+
const minT = float( 10000 ).toVar();
|
|
497
|
+
|
|
498
|
+
Loop( 6, ( { i } ) => {
|
|
499
|
+
|
|
500
|
+
const t = intersectRayPlane( this._cameraPosition, direction, this._fNormals.element( i ), this._fConstants.element( i ) );
|
|
501
|
+
|
|
502
|
+
If( t.lessThan( minT ).and( t.greaterThan( 0 ) ), () => {
|
|
503
|
+
|
|
504
|
+
minT.assign( t );
|
|
505
|
+
|
|
506
|
+
} );
|
|
507
|
+
|
|
508
|
+
} );
|
|
509
|
+
|
|
510
|
+
If( minT.equal( 10000 ), () => {
|
|
511
|
+
|
|
512
|
+
isEarlyOut.assign( true );
|
|
513
|
+
|
|
514
|
+
} ).Else( () => {
|
|
515
|
+
|
|
516
|
+
startPosition.assign( this._cameraPosition.add( minT.add( 0.001 ).mul( direction ) ) );
|
|
517
|
+
|
|
518
|
+
// If the ray target is outside the shadow box, move it to the nearest
|
|
519
|
+
// point on the box to avoid marching through unlit space
|
|
520
|
+
|
|
521
|
+
const endInBoxDist = float( - 10000 ).toVar();
|
|
522
|
+
|
|
523
|
+
Loop( 6, ( { i } ) => {
|
|
524
|
+
|
|
525
|
+
endInBoxDist.assign( max( endInBoxDist, sdPlane( worldPosition, this._fNormals.element( i ), this._fConstants.element( i ) ) ) );
|
|
526
|
+
|
|
527
|
+
} );
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
If( endInBoxDist.greaterThanEqual( 0 ), () => {
|
|
531
|
+
|
|
532
|
+
const minT = float( 10000 ).toVar();
|
|
533
|
+
|
|
534
|
+
Loop( 6, ( { i } ) => {
|
|
535
|
+
|
|
536
|
+
If( sdPlane( worldPosition, this._fNormals.element( i ), this._fConstants.element( i ) ).greaterThan( 0 ), () => {
|
|
537
|
+
|
|
538
|
+
const t = intersectRayPlane( startPosition, direction, this._fNormals.element( i ), this._fConstants.element( i ) );
|
|
539
|
+
|
|
540
|
+
If( t.lessThan( minT ).and( t.greaterThan( 0 ) ), () => {
|
|
541
|
+
|
|
542
|
+
minT.assign( t );
|
|
543
|
+
|
|
544
|
+
} );
|
|
545
|
+
|
|
546
|
+
} );
|
|
547
|
+
|
|
548
|
+
} );
|
|
549
|
+
|
|
550
|
+
If( minT.lessThan( worldPosition.distance( startPosition ) ), () => {
|
|
551
|
+
|
|
552
|
+
worldPosition.assign( startPosition.add( minT.mul( direction ) ) );
|
|
553
|
+
|
|
554
|
+
} );
|
|
555
|
+
|
|
556
|
+
} );
|
|
557
|
+
|
|
558
|
+
} );
|
|
559
|
+
|
|
560
|
+
} );
|
|
561
|
+
|
|
562
|
+
If( isEarlyOut.equal( false ), () => {
|
|
563
|
+
|
|
564
|
+
const illum = float( 0 ).toVar();
|
|
565
|
+
|
|
566
|
+
const noise = interleavedGradientNoise( screenCoordinate ).toConst();
|
|
567
|
+
const samplesFloat = round( add( this.raymarchSteps, mul( this.raymarchSteps.div( 8 ).add( 2 ), noise ) ) ).toConst();
|
|
568
|
+
const samples = uint( samplesFloat ).toConst();
|
|
569
|
+
|
|
570
|
+
Loop( samples, ( { i } ) => {
|
|
571
|
+
|
|
572
|
+
const samplePos = mix( startPosition, worldPosition, float( i ).div( samplesFloat ) ).toConst();
|
|
573
|
+
const shadowInfo = inShadow( samplePos );
|
|
574
|
+
const shadowAmount = shadowInfo.x.oneMinus().toConst();
|
|
575
|
+
|
|
576
|
+
illum.addAssign( shadowAmount.mul( distance( startPosition, worldPosition ).mul( this.density.div( 100 ) ) ).mul( pow( shadowInfo.y.div( this._shadowCameraFar ).oneMinus(), this.distanceAttenuation ) ) );
|
|
577
|
+
|
|
578
|
+
} );
|
|
579
|
+
|
|
580
|
+
illum.divAssign( samplesFloat );
|
|
581
|
+
|
|
582
|
+
output.assign( vec4( vec3( clamp( exp( illum.negate() ).oneMinus(), 0, this.maxDensity ) ), depth ) );
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
} );
|
|
586
|
+
|
|
587
|
+
return output;
|
|
588
|
+
|
|
589
|
+
} );
|
|
590
|
+
|
|
591
|
+
this._material.fragmentNode = godrays().context( builder.getSharedContext() );
|
|
592
|
+
this._material.needsUpdate = true;
|
|
593
|
+
|
|
594
|
+
return this._textureNode;
|
|
595
|
+
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Frees internal resources. This method should be called
|
|
600
|
+
* when the effect is no longer required.
|
|
601
|
+
*/
|
|
602
|
+
dispose() {
|
|
603
|
+
|
|
604
|
+
this._godraysRenderTarget.dispose();
|
|
605
|
+
|
|
606
|
+
this._material.dispose();
|
|
607
|
+
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
export default GodraysNode;
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* TSL function for creating a Godrays effect.
|
|
616
|
+
*
|
|
617
|
+
* @tsl
|
|
618
|
+
* @function
|
|
619
|
+
* @param {TextureNode} depthNode - A texture node that represents the scene's depth.
|
|
620
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
621
|
+
* @param {(DirectionalLight|PointLight)} light - The light the godrays are rendered for.
|
|
622
|
+
* @returns {GodraysNode}
|
|
623
|
+
*/
|
|
624
|
+
export const godrays = ( depthNode, camera, light ) => new GodraysNode( depthNode, camera, light );
|
|
@@ -276,4 +276,4 @@ export default LensflareNode;
|
|
|
276
276
|
* @param {number} [params.downSampleRatio=4] - Defines how downsampling since the effect is usually not rendered at full resolution.
|
|
277
277
|
* @returns {LensflareNode}
|
|
278
278
|
*/
|
|
279
|
-
export const lensflare = ( node, params ) =>
|
|
279
|
+
export const lensflare = ( node, params ) => new LensflareNode( convertToTexture( node ), params );
|
|
@@ -106,4 +106,4 @@ export default Lut3DNode;
|
|
|
106
106
|
* @param {Node<float> | number} intensity - Controls the intensity of the effect.
|
|
107
107
|
* @returns {Lut3DNode}
|
|
108
108
|
*/
|
|
109
|
-
export const lut3D = ( node, lut, size, intensity ) =>
|
|
109
|
+
export const lut3D = ( node, lut, size, intensity ) => new Lut3DNode( nodeObject( node ), nodeObject( lut ), size, nodeObject( intensity ) );
|
|
@@ -13,7 +13,7 @@ let _rendererState;
|
|
|
13
13
|
* gives you great flexibility in composing the final outline look depending on
|
|
14
14
|
* your requirements.
|
|
15
15
|
* ```js
|
|
16
|
-
* const
|
|
16
|
+
* const renderPipeline = new THREE.RenderPipeline( renderer );
|
|
17
17
|
*
|
|
18
18
|
* const scenePass = pass( scene, camera );
|
|
19
19
|
*
|
|
@@ -36,7 +36,7 @@ let _rendererState;
|
|
|
36
36
|
* const { visibleEdge, hiddenEdge } = outlinePass;
|
|
37
37
|
* const outlineColor = visibleEdge.mul( visibleEdgeColor ).add( hiddenEdge.mul( hiddenEdgeColor ) ).mul( edgeStrength );
|
|
38
38
|
*
|
|
39
|
-
*
|
|
39
|
+
* renderPipeline.outputNode = outlineColor.add( scenePass );
|
|
40
40
|
* ```
|
|
41
41
|
*
|
|
42
42
|
* @augments TempNode
|
|
@@ -759,4 +759,4 @@ export default OutlineNode;
|
|
|
759
759
|
* @param {number} [params.downSampleRatio=2] - The downsample ratio.
|
|
760
760
|
* @returns {OutlineNode}
|
|
761
761
|
*/
|
|
762
|
-
export const outline = ( scene, camera, params ) =>
|
|
762
|
+
export const outline = ( scene, camera, params ) => new OutlineNode( scene, camera, params );
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NodeMaterial } from 'three/webgpu';
|
|
2
|
-
import {
|
|
2
|
+
import { Fn, vec4, uv, If, mod, screenCoordinate } from 'three/tsl';
|
|
3
3
|
import StereoCompositePassNode from './StereoCompositePassNode.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -86,4 +86,4 @@ export default ParallaxBarrierPassNode;
|
|
|
86
86
|
* @param {Camera} camera - The camera to render the scene with.
|
|
87
87
|
* @returns {ParallaxBarrierPassNode}
|
|
88
88
|
*/
|
|
89
|
-
export const parallaxBarrierPass = ( scene, camera ) =>
|
|
89
|
+
export const parallaxBarrierPass = ( scene, camera ) => new ParallaxBarrierPassNode( scene, camera );
|