super-three 0.177.0 → 0.181.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/README.md +1 -1
- package/build/three.cjs +1994 -749
- package/build/three.core.js +1358 -506
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +631 -247
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +113 -33
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +9571 -3424
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +9397 -3426
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +2 -3
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/capabilities/WebGL.js +0 -27
- package/examples/jsm/capabilities/WebGPU.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +9 -9
- package/examples/jsm/controls/DragControls.js +7 -57
- package/examples/jsm/controls/FirstPersonControls.js +3 -3
- package/examples/jsm/controls/FlyControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +1 -1
- package/examples/jsm/controls/TransformControls.js +62 -15
- package/examples/jsm/csm/CSMShadowNode.js +4 -4
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/environments/RoomEnvironment.js +8 -3
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +33 -25
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +683 -299
- package/examples/jsm/geometries/DecalGeometry.js +2 -2
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +3 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/ViewHelper.js +43 -5
- package/examples/jsm/inspector/Inspector.js +427 -0
- package/examples/jsm/inspector/RendererInspector.js +415 -0
- package/examples/jsm/inspector/tabs/Console.js +204 -0
- package/examples/jsm/inspector/tabs/Parameters.js +332 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Viewer.js +166 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +170 -0
- package/examples/jsm/inspector/ui/Style.js +654 -0
- package/examples/jsm/inspector/ui/Tab.js +46 -0
- package/examples/jsm/inspector/ui/Values.js +423 -0
- package/examples/jsm/inspector/ui/utils.js +56 -0
- package/examples/jsm/interactive/HTMLMesh.js +11 -13
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
- package/examples/jsm/lights/LightProbeGenerator.js +14 -3
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +4 -4
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +210 -22
- package/examples/jsm/loaders/FBXLoader.js +4 -4
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GLTFLoader.js +14 -8
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +486 -0
- package/examples/jsm/loaders/KTX2Loader.js +136 -49
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +2 -2
- package/examples/jsm/loaders/MaterialXLoader.js +233 -34
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TTFLoader.js +13 -1
- package/examples/jsm/loaders/USDLoader.js +219 -0
- package/examples/jsm/loaders/USDZLoader.js +4 -892
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/loaders/usd/USDAParser.js +741 -0
- package/examples/jsm/loaders/usd/USDCParser.js +17 -0
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +3 -3
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +3 -3
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/SkyMesh.js +3 -3
- package/examples/jsm/objects/Water.js +3 -3
- package/examples/jsm/objects/WaterMesh.js +6 -6
- package/examples/jsm/physics/RapierPhysics.js +95 -16
- package/examples/jsm/postprocessing/GTAOPass.js +10 -9
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +17 -17
- package/examples/jsm/postprocessing/SSAOPass.js +10 -9
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
- package/examples/jsm/renderers/SVGRenderer.js +1 -1
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +2 -2
- package/examples/jsm/shaders/GodRaysShader.js +1 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
- package/examples/jsm/shaders/SSRShader.js +1 -1
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +381 -30
- package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
- package/examples/jsm/transpiler/Linker.js +327 -0
- package/examples/jsm/transpiler/TSLEncoder.js +196 -92
- package/examples/jsm/transpiler/Transpiler.js +17 -1
- package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
- package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
- package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
- package/examples/jsm/tsl/display/BloomNode.js +11 -6
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- package/examples/jsm/tsl/display/GTAONode.js +53 -5
- package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
- package/examples/jsm/tsl/display/OutlineNode.js +13 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +654 -0
- package/examples/jsm/tsl/display/SSRNode.js +182 -65
- package/examples/jsm/tsl/display/SSSNode.js +488 -0
- package/examples/jsm/tsl/display/TRAANode.js +578 -0
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/hashBlur.js +18 -20
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
- package/package.json +5 -10
- package/src/Three.Core.js +5 -2
- package/src/Three.TSL.js +112 -32
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +4 -0
- package/src/animation/AnimationClip.js +20 -4
- package/src/animation/AnimationMixer.js +3 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/KeyframeTrack.js +8 -7
- package/src/animation/PropertyBinding.js +12 -11
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +10 -9
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/Camera.js +14 -0
- package/src/cameras/OrthographicCamera.js +2 -2
- package/src/cameras/PerspectiveCamera.js +2 -2
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +13 -5
- package/src/core/BufferAttribute.js +3 -3
- package/src/core/BufferGeometry.js +10 -10
- package/src/core/Clock.js +2 -8
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/GLBufferAttribute.js +13 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +4 -3
- package/src/core/Raycaster.js +2 -1
- package/src/core/RenderTarget.js +10 -1
- package/{examples/jsm/misc → src/core}/Timer.js +4 -42
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +279 -55
- package/src/extras/TextureUtils.js +2 -1
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/Path.js +22 -22
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/lib/earcut.js +8 -8
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +8 -6
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +1 -0
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +42 -12
- package/src/helpers/SkeletonHelper.js +35 -6
- package/src/lights/LightShadow.js +21 -8
- package/src/lights/PointLightShadow.js +1 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +2 -1
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +2 -2
- package/src/loaders/DataTextureLoader.js +1 -1
- package/src/loaders/FileLoader.js +29 -5
- package/src/loaders/ImageBitmapLoader.js +32 -8
- package/src/loaders/ImageLoader.js +56 -9
- package/src/loaders/Loader.js +17 -3
- package/src/loaders/LoadingManager.js +45 -0
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +13 -13
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +3 -2
- package/src/materials/Material.js +16 -3
- package/src/materials/MeshBasicMaterial.js +2 -1
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +2 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +2 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +1 -0
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +2 -2
- package/src/materials/nodes/Line2NodeMaterial.js +2 -10
- package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
- package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
- package/src/materials/nodes/NodeMaterial.js +90 -27
- package/src/materials/nodes/PointsNodeMaterial.js +86 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +9 -3
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/Frustum.js +25 -9
- package/src/math/FrustumArray.js +10 -5
- package/src/math/Line3.js +129 -2
- package/src/math/MathUtils.js +13 -11
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +2 -2
- package/src/math/Matrix4.js +55 -34
- package/src/math/Plane.js +1 -1
- package/src/math/Quaternion.js +69 -67
- package/src/math/Spherical.js +3 -3
- package/src/nodes/Nodes.js +6 -4
- package/src/nodes/TSL.js +9 -4
- package/src/nodes/accessors/AccessorsUtils.js +7 -8
- package/src/nodes/accessors/Bitangent.js +31 -25
- package/src/nodes/accessors/BufferNode.js +1 -1
- package/src/nodes/accessors/Camera.js +142 -16
- package/src/nodes/accessors/ClippingNode.js +6 -5
- package/src/nodes/accessors/CubeTextureNode.js +5 -4
- package/src/nodes/accessors/InstanceNode.js +25 -5
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/Normal.js +97 -30
- package/src/nodes/accessors/Object3DNode.js +2 -2
- package/src/nodes/accessors/Position.js +25 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +20 -4
- package/src/nodes/accessors/ReflectVector.js +3 -3
- package/src/nodes/accessors/SceneNode.js +3 -2
- package/src/nodes/accessors/StorageBufferNode.js +2 -1
- package/src/nodes/accessors/StorageTextureNode.js +23 -1
- package/src/nodes/accessors/Tangent.js +25 -17
- package/src/nodes/accessors/TangentUtils.js +46 -0
- package/src/nodes/accessors/Texture3DNode.js +14 -1
- package/src/nodes/accessors/TextureBicubic.js +21 -3
- package/src/nodes/accessors/TextureNode.js +142 -44
- package/src/nodes/accessors/UniformArrayNode.js +0 -16
- package/src/nodes/code/FunctionCallNode.js +24 -4
- package/src/nodes/code/FunctionNode.js +23 -0
- package/src/nodes/core/ArrayNode.js +13 -0
- package/src/nodes/core/AssignNode.js +6 -2
- package/src/nodes/core/AttributeNode.js +2 -1
- package/src/nodes/core/ContextNode.js +48 -10
- package/src/nodes/core/IndexNode.js +2 -2
- package/src/nodes/core/InputNode.js +2 -1
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
- package/src/nodes/core/Node.js +167 -34
- package/src/nodes/core/NodeBuilder.js +404 -120
- package/src/nodes/core/NodeFrame.js +21 -21
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +17 -88
- package/src/nodes/core/ParameterNode.js +31 -0
- package/src/nodes/core/PropertyNode.js +7 -0
- package/src/nodes/core/StackNode.js +77 -30
- package/src/nodes/core/StructNode.js +5 -5
- package/src/nodes/core/StructTypeNode.js +1 -0
- package/src/nodes/core/SubBuildNode.js +89 -0
- package/src/nodes/core/UniformNode.js +80 -14
- package/src/nodes/core/VarNode.js +142 -16
- package/src/nodes/core/VaryingNode.js +9 -6
- package/src/nodes/display/BlendModes.js +7 -6
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/FrontFacingNode.js +35 -7
- package/src/nodes/display/NormalMapNode.js +20 -50
- package/src/nodes/display/PassNode.js +206 -17
- package/src/nodes/display/RenderOutputNode.js +28 -2
- package/src/nodes/display/ScreenNode.js +44 -40
- package/src/nodes/display/ToneMappingNode.js +31 -4
- package/src/nodes/display/ToonOutlinePassNode.js +8 -0
- package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +94 -4
- package/src/nodes/fog/Fog.js +3 -2
- package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
- package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhongLightingModel.js +3 -3
- package/src/nodes/functions/PhysicalLightingModel.js +19 -18
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/src/nodes/geometry/RangeNode.js +40 -4
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
- package/src/nodes/gpgpu/ComputeNode.js +81 -25
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
- package/src/nodes/lighting/EnvironmentNode.js +11 -11
- package/src/nodes/lighting/LightsNode.js +7 -8
- package/src/nodes/lighting/PointShadowNode.js +6 -0
- package/src/nodes/lighting/ProjectorLightNode.js +19 -6
- package/src/nodes/lighting/ShadowFilterNode.js +3 -1
- package/src/nodes/lighting/ShadowNode.js +77 -10
- package/src/nodes/materialx/MaterialXNodes.js +131 -2
- package/src/nodes/materialx/lib/mx_noise.js +165 -1
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/ConditionalNode.js +25 -27
- package/src/nodes/math/MathNode.js +106 -65
- package/src/nodes/math/OperatorNode.js +28 -43
- package/src/nodes/pmrem/PMREMUtils.js +117 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +6 -2
- package/src/nodes/tsl/TSLCore.js +546 -186
- package/src/nodes/utils/DebugNode.js +3 -2
- package/src/nodes/utils/EquirectUV.js +27 -0
- package/src/nodes/utils/EventNode.js +119 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +6 -3
- package/src/nodes/utils/LoopNode.js +20 -41
- package/src/nodes/utils/MatcapUV.js +22 -0
- package/src/nodes/utils/MemberNode.js +59 -7
- package/src/nodes/utils/PostProcessingUtils.js +28 -1
- package/src/nodes/utils/RTTNode.js +33 -6
- package/src/nodes/utils/ReflectorNode.js +68 -10
- package/src/nodes/utils/SampleNode.js +91 -0
- package/src/nodes/utils/SplitNode.js +11 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/nodes/utils/TriplanarTextures.js +65 -0
- package/src/objects/BatchedMesh.js +6 -4
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +2 -1
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Skeleton.js +3 -2
- package/src/objects/SkinnedMesh.js +3 -1
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +77 -66
- package/src/renderers/common/Animation.js +13 -1
- package/src/renderers/common/Attributes.js +1 -1
- package/src/renderers/common/Backend.js +108 -27
- package/src/renderers/common/Background.js +4 -3
- package/src/renderers/common/Bindings.js +76 -19
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +1 -1
- package/src/renderers/common/Color4.js +2 -2
- package/src/renderers/common/CubeRenderTarget.js +1 -1
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +26 -0
- package/src/renderers/common/Info.js +4 -2
- package/src/renderers/common/InspectorBase.js +146 -0
- package/src/renderers/common/Pipelines.js +1 -1
- package/src/renderers/common/PostProcessing.js +61 -25
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/RenderContext.js +2 -2
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderObject.js +84 -5
- package/src/renderers/common/RenderObjects.js +1 -1
- package/src/renderers/common/Renderer.js +486 -255
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +8 -68
- package/src/renderers/common/Sampler.js +117 -0
- package/src/renderers/common/Storage3DTexture.js +100 -0
- package/src/renderers/common/StorageArrayTexture.js +84 -0
- package/src/renderers/common/StorageTexture.js +27 -0
- package/src/renderers/common/Textures.js +138 -46
- package/src/renderers/common/TimestampQueryPool.js +65 -3
- package/src/renderers/common/UniformsGroup.js +2 -1
- package/src/renderers/common/XRManager.js +63 -24
- package/src/renderers/common/XRRenderTarget.js +21 -4
- package/src/renderers/common/extras/PMREMGenerator.js +161 -66
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/Nodes.js +38 -16
- package/src/renderers/shaders/DFGLUTData.js +64 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +25 -4
- package/src/renderers/webgl/WebGLAttributes.js +4 -0
- package/src/renderers/webgl/WebGLCapabilities.js +4 -3
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLProgram.js +25 -18
- package/src/renderers/webgl/WebGLPrograms.js +9 -6
- package/src/renderers/webgl/WebGLShadowMap.js +13 -2
- package/src/renderers/webgl/WebGLState.js +17 -16
- package/src/renderers/webgl/WebGLTextures.js +38 -21
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl/WebGLUtils.js +3 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
- package/src/renderers/webgpu/WebGPUBackend.js +205 -128
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +3 -2
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
- package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
- package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
- package/src/renderers/webxr/WebXRManager.js +89 -13
- package/src/textures/ExternalTexture.js +56 -0
- package/src/textures/FramebufferTexture.js +2 -2
- package/src/textures/Source.js +14 -3
- package/src/textures/Texture.js +3 -2
- package/src/textures/VideoTexture.js +29 -2
- package/src/utils.js +67 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
- package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
- package/src/nodes/utils/EquirectUVNode.js +0 -65
- package/src/nodes/utils/MatcapUVNode.js +0 -49
- package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { RedFormat, RenderTarget, Vector2, RendererUtils, QuadMesh, TempNode, NodeMaterial, NodeUpdateType, UnsignedByteType } from 'three/webgpu';
|
|
2
|
+
import { reference, viewZToPerspectiveDepth, logarithmicDepthToViewZ, getScreenPosition, getViewPosition, float, Break, Loop, int, max, abs, If, interleavedGradientNoise, screenCoordinate, nodeObject, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, lightPosition, lightTargetPosition, fract, rand, mix } from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
|
+
const _size = /*@__PURE__*/ new Vector2();
|
|
6
|
+
|
|
7
|
+
const _spatialOffsets = [ 0, 0.5, 0.25, 0.75 ];
|
|
8
|
+
|
|
9
|
+
let _rendererState;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Post processing node for applying Screen-Space Shadows (SSS) to a scene.
|
|
13
|
+
*
|
|
14
|
+
* Screen-Space Shadows (also known as Contact Shadows) should ideally be used to complement
|
|
15
|
+
* traditional shadow maps. They are best suited for rendering detailed shadows of smaller
|
|
16
|
+
* objects at a closer scale like intricate shadowing on highly detailed models. In other words:
|
|
17
|
+
* Use Shadow Maps for the foundation and Screen-Space Shadows for the details.
|
|
18
|
+
*
|
|
19
|
+
* The shadows produced by this implementation might have too hard edges for certain use cases.
|
|
20
|
+
* Use a box, gaussian or hash blur to soften the edges before doing the composite with the
|
|
21
|
+
* beauty pass. Code example:
|
|
22
|
+
*
|
|
23
|
+
* ```js
|
|
24
|
+
* const sssPass = sss( scenePassDepth, camera, mainLight );
|
|
25
|
+
*
|
|
26
|
+
* const sssBlur = boxBlur( sssPass.r, { size: 2, separation: 1 } ); // optional blur
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* Limitations:
|
|
30
|
+
*
|
|
31
|
+
* - Ideally the maximum shadow length should not exceed `1` meter. Otherwise the effect gets
|
|
32
|
+
* computationally very expensive since more samples during the ray marching process are evaluated.
|
|
33
|
+
* You can mitigate this issue by reducing the `quality` paramter.
|
|
34
|
+
* - The effect can only be used with a single directional light, the main light of your scene.
|
|
35
|
+
* This main light usually represents the sun or daylight.
|
|
36
|
+
* - Like other Screen-Space techniques SSS can only honor objects in the shadowing computation that
|
|
37
|
+
* are currently visible within the camera's view.
|
|
38
|
+
*
|
|
39
|
+
* References:
|
|
40
|
+
* - {@link https://panoskarabelas.com/posts/screen_space_shadows/}.
|
|
41
|
+
* - {@link https://www.bendstudio.com/blog/inside-bend-screen-space-shadows/}.
|
|
42
|
+
*
|
|
43
|
+
* @augments TempNode
|
|
44
|
+
* @three_import import { sss } from 'three/addons/tsl/display/SSSNode.js';
|
|
45
|
+
*/
|
|
46
|
+
class SSSNode extends TempNode {
|
|
47
|
+
|
|
48
|
+
static get type() {
|
|
49
|
+
|
|
50
|
+
return 'SSSNode';
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Constructs a new SSS node.
|
|
56
|
+
*
|
|
57
|
+
* @param {TextureNode} depthNode - A texture node that represents the scene's depth.
|
|
58
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
59
|
+
* @param {DirectionalLight} mainLight - The main directional light of the scene.
|
|
60
|
+
*/
|
|
61
|
+
constructor( depthNode, camera, mainLight ) {
|
|
62
|
+
|
|
63
|
+
super( 'float' );
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* A node that represents the beauty pass's depth.
|
|
67
|
+
*
|
|
68
|
+
* @type {TextureNode}
|
|
69
|
+
*/
|
|
70
|
+
this.depthNode = depthNode;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Maximum shadow length in world units. Longer shadows result in more computational
|
|
74
|
+
* overhead.
|
|
75
|
+
*
|
|
76
|
+
* @type {UniformNode<float>}
|
|
77
|
+
* @default 0.1
|
|
78
|
+
*/
|
|
79
|
+
this.maxDistance = uniform( 0.1, 'float' );
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Depth testing thickness.
|
|
83
|
+
*
|
|
84
|
+
* @type {UniformNode<float>}
|
|
85
|
+
* @default 0.01
|
|
86
|
+
*/
|
|
87
|
+
this.thickness = uniform( 0.01, 'float' );
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Shadow intensity. Must be in the range `[0, 1]`.
|
|
91
|
+
*
|
|
92
|
+
* @type {UniformNode<float>}
|
|
93
|
+
* @default 0.5
|
|
94
|
+
*/
|
|
95
|
+
this.shadowIntensity = uniform( 0.5, 'float' );
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* This parameter controls how detailed the raymarching process works.
|
|
99
|
+
* The value ranges is `[0,1]` where `1` means best quality (the maximum number
|
|
100
|
+
* of raymarching iterations/samples) and `0` means no samples at all.
|
|
101
|
+
*
|
|
102
|
+
* A quality of `0.5` is usually sufficient for most use cases. Try to keep
|
|
103
|
+
* this parameter as low as possible. Larger values result in noticeable more
|
|
104
|
+
* overhead.
|
|
105
|
+
*
|
|
106
|
+
* @type {UniformNode<float>}
|
|
107
|
+
* @default 0.5
|
|
108
|
+
*/
|
|
109
|
+
this.quality = uniform( 0.5 );
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The resolution scale. Valid values are in the range
|
|
113
|
+
* `[0,1]`. `1` means best quality but also results in
|
|
114
|
+
* more computational overhead. Setting to `0.5` means
|
|
115
|
+
* the effect is computed in half-resolution.
|
|
116
|
+
*
|
|
117
|
+
* @type {number}
|
|
118
|
+
* @default 1
|
|
119
|
+
*/
|
|
120
|
+
this.resolutionScale = 1;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Whether to use temporal filtering or not. Setting this property to
|
|
124
|
+
* `true` requires the usage of `TRAANode`. This will help to reduce noice
|
|
125
|
+
* although it introduces typical TAA artifacts like ghosting and temporal
|
|
126
|
+
* instabilities.
|
|
127
|
+
*
|
|
128
|
+
* @type {boolean}
|
|
129
|
+
* @default false
|
|
130
|
+
*/
|
|
131
|
+
this.useTemporalFiltering = false;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
135
|
+
* its effect once per frame in `updateBefore()`.
|
|
136
|
+
*
|
|
137
|
+
* @type {string}
|
|
138
|
+
* @default 'frame'
|
|
139
|
+
*/
|
|
140
|
+
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
141
|
+
|
|
142
|
+
// private uniforms
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Represents the view matrix of the scene's camera.
|
|
146
|
+
*
|
|
147
|
+
* @private
|
|
148
|
+
* @type {UniformNode<mat4>}
|
|
149
|
+
*/
|
|
150
|
+
this._cameraViewMatrix = uniform( camera.matrixWorldInverse );
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Represents the projection matrix of the scene's camera.
|
|
154
|
+
*
|
|
155
|
+
* @private
|
|
156
|
+
* @type {UniformNode<mat4>}
|
|
157
|
+
*/
|
|
158
|
+
this._cameraProjectionMatrix = uniform( camera.projectionMatrix );
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Represents the inverse projection matrix of the scene's camera.
|
|
162
|
+
*
|
|
163
|
+
* @private
|
|
164
|
+
* @type {UniformNode<mat4>}
|
|
165
|
+
*/
|
|
166
|
+
this._cameraProjectionMatrixInverse = uniform( camera.projectionMatrixInverse );
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Represents the near value of the scene's camera.
|
|
170
|
+
*
|
|
171
|
+
* @private
|
|
172
|
+
* @type {ReferenceNode<float>}
|
|
173
|
+
*/
|
|
174
|
+
this._cameraNear = reference( 'near', 'float', camera );
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Represents the far value of the scene's camera.
|
|
178
|
+
*
|
|
179
|
+
* @private
|
|
180
|
+
* @type {ReferenceNode<float>}
|
|
181
|
+
*/
|
|
182
|
+
this._cameraFar = reference( 'far', 'float', camera );
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* The resolution of the pass.
|
|
186
|
+
*
|
|
187
|
+
* @private
|
|
188
|
+
* @type {UniformNode<vec2>}
|
|
189
|
+
*/
|
|
190
|
+
this._resolution = uniform( new Vector2() );
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Temporal offset added to the initial ray step.
|
|
194
|
+
*
|
|
195
|
+
* @type {UniformNode<float>}
|
|
196
|
+
*/
|
|
197
|
+
this._temporalOffset = uniform( 0 );
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* The frame ID use when temporal filtering is enabled.
|
|
201
|
+
*
|
|
202
|
+
* @type {UniformNode<uint>}
|
|
203
|
+
*/
|
|
204
|
+
this._frameId = uniform( 0 );
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* A reference to the scene's main light.
|
|
208
|
+
*
|
|
209
|
+
* @private
|
|
210
|
+
* @type {DirectionalLight}
|
|
211
|
+
*/
|
|
212
|
+
this._mainLight = mainLight;
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* The camera the scene is rendered with.
|
|
216
|
+
*
|
|
217
|
+
* @private
|
|
218
|
+
* @type {Camera}
|
|
219
|
+
*/
|
|
220
|
+
this._camera = camera;
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* The render target the SSS is rendered into.
|
|
224
|
+
*
|
|
225
|
+
* @private
|
|
226
|
+
* @type {RenderTarget}
|
|
227
|
+
*/
|
|
228
|
+
this._sssRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, format: RedFormat, type: UnsignedByteType } );
|
|
229
|
+
this._sssRenderTarget.texture.name = 'SSS';
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* The material that is used to render the effect.
|
|
233
|
+
*
|
|
234
|
+
* @private
|
|
235
|
+
* @type {NodeMaterial}
|
|
236
|
+
*/
|
|
237
|
+
this._material = new NodeMaterial();
|
|
238
|
+
this._material.name = 'SSS';
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* The result of the effect is represented as a separate texture node.
|
|
242
|
+
*
|
|
243
|
+
* @private
|
|
244
|
+
* @type {PassTextureNode}
|
|
245
|
+
*/
|
|
246
|
+
this._textureNode = passTexture( this, this._sssRenderTarget.texture );
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Returns the result of the effect as a texture node.
|
|
253
|
+
*
|
|
254
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
255
|
+
*/
|
|
256
|
+
getTextureNode() {
|
|
257
|
+
|
|
258
|
+
return this._textureNode;
|
|
259
|
+
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Sets the size of the effect.
|
|
264
|
+
*
|
|
265
|
+
* @param {number} width - The width of the effect.
|
|
266
|
+
* @param {number} height - The height of the effect.
|
|
267
|
+
*/
|
|
268
|
+
setSize( width, height ) {
|
|
269
|
+
|
|
270
|
+
width = Math.round( this.resolutionScale * width );
|
|
271
|
+
height = Math.round( this.resolutionScale * height );
|
|
272
|
+
|
|
273
|
+
this._resolution.value.set( width, height );
|
|
274
|
+
this._sssRenderTarget.setSize( width, height );
|
|
275
|
+
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* This method is used to render the effect once per frame.
|
|
280
|
+
*
|
|
281
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
282
|
+
*/
|
|
283
|
+
updateBefore( frame ) {
|
|
284
|
+
|
|
285
|
+
const { renderer } = frame;
|
|
286
|
+
|
|
287
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
288
|
+
|
|
289
|
+
//
|
|
290
|
+
|
|
291
|
+
const size = renderer.getDrawingBufferSize( _size );
|
|
292
|
+
this.setSize( size.width, size.height );
|
|
293
|
+
|
|
294
|
+
// update temporal uniforms
|
|
295
|
+
|
|
296
|
+
if ( this.useTemporalFiltering === true ) {
|
|
297
|
+
|
|
298
|
+
const frameId = frame.frameId;
|
|
299
|
+
|
|
300
|
+
this._temporalOffset.value = _spatialOffsets[ frameId % 4 ];
|
|
301
|
+
this._frameId = frame.frameId;
|
|
302
|
+
|
|
303
|
+
} else {
|
|
304
|
+
|
|
305
|
+
this._temporalOffset.value = 0;
|
|
306
|
+
this._frameId = 0;
|
|
307
|
+
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
//
|
|
311
|
+
|
|
312
|
+
_quadMesh.material = this._material;
|
|
313
|
+
_quadMesh.name = 'SSS';
|
|
314
|
+
|
|
315
|
+
// clear
|
|
316
|
+
|
|
317
|
+
renderer.setClearColor( 0xffffff, 1 );
|
|
318
|
+
|
|
319
|
+
// sss
|
|
320
|
+
|
|
321
|
+
renderer.setRenderTarget( this._sssRenderTarget );
|
|
322
|
+
_quadMesh.render( renderer );
|
|
323
|
+
|
|
324
|
+
// restore
|
|
325
|
+
|
|
326
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
327
|
+
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* This method is used to setup the effect's TSL code.
|
|
332
|
+
*
|
|
333
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
334
|
+
* @return {PassTextureNode}
|
|
335
|
+
*/
|
|
336
|
+
setup( builder ) {
|
|
337
|
+
|
|
338
|
+
const uvNode = uv();
|
|
339
|
+
|
|
340
|
+
const getViewZ = Fn( ( [ depth ] ) => {
|
|
341
|
+
|
|
342
|
+
let viewZNode;
|
|
343
|
+
|
|
344
|
+
if ( this._camera.isPerspectiveCamera ) {
|
|
345
|
+
|
|
346
|
+
viewZNode = perspectiveDepthToViewZ( depth, this._cameraNear, this._cameraFar );
|
|
347
|
+
|
|
348
|
+
} else {
|
|
349
|
+
|
|
350
|
+
viewZNode = orthographicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
|
|
351
|
+
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return viewZNode;
|
|
355
|
+
|
|
356
|
+
} );
|
|
357
|
+
|
|
358
|
+
const sampleDepth = ( uv ) => {
|
|
359
|
+
|
|
360
|
+
const depth = this.depthNode.sample( uv ).r;
|
|
361
|
+
|
|
362
|
+
if ( builder.renderer.logarithmicDepthBuffer === true ) {
|
|
363
|
+
|
|
364
|
+
const viewZ = logarithmicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
|
|
365
|
+
|
|
366
|
+
return viewZToPerspectiveDepth( viewZ, this._cameraNear, this._cameraFar );
|
|
367
|
+
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return depth;
|
|
371
|
+
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
const sss = Fn( () => {
|
|
375
|
+
|
|
376
|
+
const depth = sampleDepth( uvNode ).toVar();
|
|
377
|
+
depth.greaterThanEqual( 1.0 ).discard();
|
|
378
|
+
|
|
379
|
+
// compute ray position and direction (in view-space)
|
|
380
|
+
|
|
381
|
+
const rayStartPosition = getViewPosition( uvNode, depth, this._cameraProjectionMatrixInverse ).toVar( 'rayStartPosition' );
|
|
382
|
+
const rayDirection = this._cameraViewMatrix.transformDirection( lightPosition( this._mainLight ).sub( lightTargetPosition( this._mainLight ) ) ).toConst( 'rayDirection' );
|
|
383
|
+
const rayEndPosition = rayStartPosition.add( rayDirection.mul( this.maxDistance ) ).toConst( 'rayEndPosition' );
|
|
384
|
+
|
|
385
|
+
// d0 and d1 are the start and maximum points of the ray in screen space
|
|
386
|
+
const d0 = screenCoordinate.xy.toVar();
|
|
387
|
+
const d1 = getScreenPosition( rayEndPosition, this._cameraProjectionMatrix ).mul( this._resolution ).toVar();
|
|
388
|
+
|
|
389
|
+
// below variables are used to control the raymarching process
|
|
390
|
+
|
|
391
|
+
// total length of the ray
|
|
392
|
+
const totalLen = d1.sub( d0 ).length().toVar();
|
|
393
|
+
|
|
394
|
+
// offset in x and y direction
|
|
395
|
+
const xLen = d1.x.sub( d0.x ).toVar();
|
|
396
|
+
const yLen = d1.y.sub( d0.y ).toVar();
|
|
397
|
+
|
|
398
|
+
// determine the larger delta
|
|
399
|
+
// The larger difference will help to determine how much to travel in the X and Y direction each iteration and
|
|
400
|
+
// how many iterations are needed to travel the entire ray
|
|
401
|
+
const totalStep = int( max( abs( xLen ), abs( yLen ) ).mul( this.quality.clamp() ) ).toConst();
|
|
402
|
+
|
|
403
|
+
// step sizes in the x and y directions
|
|
404
|
+
const xSpan = xLen.div( totalStep ).toVar();
|
|
405
|
+
const ySpan = yLen.div( totalStep ).toVar();
|
|
406
|
+
|
|
407
|
+
// compute noise based ray offset
|
|
408
|
+
const noise = interleavedGradientNoise( screenCoordinate );
|
|
409
|
+
const offset = fract( noise.add( this._temporalOffset ) ).add( rand( uvNode.add( this._frameId ) ) ).toConst( 'offset' );
|
|
410
|
+
|
|
411
|
+
const occlusion = float( 0 ).toVar();
|
|
412
|
+
|
|
413
|
+
Loop( totalStep, ( { i } ) => {
|
|
414
|
+
|
|
415
|
+
// advance on the ray by computing a new position in screen coordinates
|
|
416
|
+
const xy = vec2( d0.x.add( xSpan.mul( float( i ).add( offset ) ) ), d0.y.add( ySpan.mul( float( i ).add( offset ) ) ) ).toVar();
|
|
417
|
+
|
|
418
|
+
// stop processing if the new position lies outside of the screen
|
|
419
|
+
If( xy.x.lessThan( 0 ).or( xy.x.greaterThan( this._resolution.x ) ).or( xy.y.lessThan( 0 ) ).or( xy.y.greaterThan( this._resolution.y ) ), () => {
|
|
420
|
+
|
|
421
|
+
Break();
|
|
422
|
+
|
|
423
|
+
} );
|
|
424
|
+
|
|
425
|
+
// compute new uv, depth and viewZ for the next fragment
|
|
426
|
+
|
|
427
|
+
const uvNode = xy.div( this._resolution );
|
|
428
|
+
const fragmentDepth = sampleDepth( uvNode ).toConst();
|
|
429
|
+
const fragmentViewZ = getViewZ( fragmentDepth ).toConst( 'fragmentViewZ' );
|
|
430
|
+
|
|
431
|
+
const s = xy.sub( d0 ).length().div( totalLen ).toVar();
|
|
432
|
+
const rayPosition = mix( rayStartPosition, rayEndPosition, s );
|
|
433
|
+
|
|
434
|
+
const depthDelta = rayPosition.z.sub( fragmentViewZ ).negate(); // Port note: viewZ values are negative in three
|
|
435
|
+
|
|
436
|
+
// check if the camera can't "see" the ray (ray depth must be larger than the camera depth, so positive depth_delta)
|
|
437
|
+
|
|
438
|
+
If( depthDelta.greaterThan( 0 ).and( depthDelta.lessThan( this.thickness ) ), () => {
|
|
439
|
+
|
|
440
|
+
// mark as occluded
|
|
441
|
+
|
|
442
|
+
occlusion.assign( this.shadowIntensity );
|
|
443
|
+
|
|
444
|
+
Break();
|
|
445
|
+
|
|
446
|
+
} );
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
} );
|
|
450
|
+
|
|
451
|
+
return occlusion.oneMinus();
|
|
452
|
+
|
|
453
|
+
} );
|
|
454
|
+
|
|
455
|
+
this._material.fragmentNode = sss().context( builder.getSharedContext() );
|
|
456
|
+
this._material.needsUpdate = true;
|
|
457
|
+
|
|
458
|
+
return this._textureNode;
|
|
459
|
+
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* Frees internal resources. This method should be called
|
|
464
|
+
* when the effect is no longer required.
|
|
465
|
+
*/
|
|
466
|
+
dispose() {
|
|
467
|
+
|
|
468
|
+
this._sssRenderTarget.dispose();
|
|
469
|
+
|
|
470
|
+
this._material.dispose();
|
|
471
|
+
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
export default SSSNode;
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* TSL function for creating a SSS effect.
|
|
480
|
+
*
|
|
481
|
+
* @tsl
|
|
482
|
+
* @function
|
|
483
|
+
* @param {TextureNode} depthNode - A texture node that represents the scene's depth.
|
|
484
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
485
|
+
* @param {DirectionalLight} mainLight - The main directional light of the scene.
|
|
486
|
+
* @returns {SSSNode}
|
|
487
|
+
*/
|
|
488
|
+
export const sss = ( depthNode, camera, mainLight ) => nodeObject( new SSSNode( depthNode, camera, mainLight ) );
|