@unikia/upe-renderer 0.186.110 → 0.187.11
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 +5 -7
- package/UPSTREAM.md +4 -4
- package/build/three.core.js +853 -277
- package/build/three.module.js +1098 -1280
- package/build/three.tsl.js +41938 -686
- package/build/three.webgpu.js +10604 -49055
- package/build/three.webgpu.nodes.js +9249 -5788
- package/examples/jsm/Addons.js +2 -0
- package/examples/jsm/animation/CCDIKSolver.js +17 -5
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +27 -14
- package/examples/jsm/csm/CSMShader.js +74 -3
- package/examples/jsm/curves/CurveExtras.js +4 -4
- package/examples/jsm/curves/NURBSCurve.js +14 -0
- package/examples/jsm/exporters/EXRExporter.js +673 -16
- package/examples/jsm/exporters/GLTFExporter.js +4 -4
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/OBJExporter.js +48 -5
- package/examples/jsm/exporters/PLYExporter.js +22 -11
- package/examples/jsm/generators/CityGenerator.js +3 -2
- package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
- package/examples/jsm/gpgpu/BitonicSort.js +30 -23
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
- package/examples/jsm/inspector/Extension.js +1 -1
- package/examples/jsm/inspector/Inspector.js +6 -46
- package/examples/jsm/inspector/RendererInspector.js +43 -8
- package/examples/jsm/inspector/Storage.js +49 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
- package/examples/jsm/inspector/tabs/Parameters.js +5 -1
- package/examples/jsm/inspector/tabs/Performance.js +22 -7
- package/examples/jsm/inspector/tabs/Settings.js +1 -1
- package/examples/jsm/inspector/tabs/Timeline.js +83 -7
- package/examples/jsm/inspector/tabs/Viewer.js +25 -10
- package/examples/jsm/inspector/ui/Profiler.js +1 -1
- package/examples/jsm/inspector/ui/Style.js +21 -53
- package/examples/jsm/inspector/ui/Values.js +28 -3
- package/examples/jsm/libs/fflate.module.js +83 -56
- package/examples/jsm/libs/mikktspace.README.md +27 -0
- package/examples/jsm/libs/mikktspace.module.js +721 -109
- package/examples/jsm/lighting/ClusteredLighting.js +100 -2
- package/examples/jsm/lighting/LightMapper.js +295 -0
- package/examples/jsm/lighting/LightProbeGrid.js +242 -139
- package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
- package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
- package/examples/jsm/lights/SunLight.js +9 -4
- package/examples/jsm/lights/SunLightNode.js +3 -3
- package/examples/jsm/lines/LineMaterial.js +26 -10
- package/examples/jsm/loaders/3DMLoader.js +10 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +2 -0
- package/examples/jsm/loaders/BVHLoader.js +2 -0
- package/examples/jsm/loaders/ColladaLoader.js +8 -0
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +5 -1
- package/examples/jsm/loaders/EXRLoader.js +120 -104
- package/examples/jsm/loaders/FBXLoader.js +4 -0
- package/examples/jsm/loaders/FontLoader.js +2 -0
- package/examples/jsm/loaders/GCodeLoader.js +5 -9
- package/examples/jsm/loaders/GLTFLoader.js +112 -31
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
- package/examples/jsm/loaders/IESLoader.js +46 -12
- package/examples/jsm/loaders/JXLLoader.js +159 -0
- package/examples/jsm/loaders/KMZLoader.js +6 -0
- package/examples/jsm/loaders/KSPLATLoader.js +2 -0
- package/examples/jsm/loaders/KTX2Loader.js +49 -4
- package/examples/jsm/loaders/KTXLoader.js +5 -3
- package/examples/jsm/loaders/LDrawLoader.js +15 -22
- package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
- package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
- package/examples/jsm/loaders/LUTImageLoader.js +2 -0
- package/examples/jsm/loaders/LWOLoader.js +6 -0
- package/examples/jsm/loaders/MD2Loader.js +2 -0
- package/examples/jsm/loaders/MDDLoader.js +4 -0
- package/examples/jsm/loaders/MTLLoader.js +8 -0
- package/examples/jsm/loaders/MaterialXLoader.js +57 -5
- package/examples/jsm/loaders/NRRDLoader.js +4 -2
- package/examples/jsm/loaders/OBJLoader.js +10 -4
- package/examples/jsm/loaders/PCDLoader.js +6 -2
- package/examples/jsm/loaders/PDBLoader.js +5 -3
- package/examples/jsm/loaders/PLYLoader.js +39 -15
- package/examples/jsm/loaders/PVRLoader.js +2 -2
- package/examples/jsm/loaders/SPLATLoader.js +2 -0
- package/examples/jsm/loaders/SPZLoader.js +2 -0
- package/examples/jsm/loaders/STLLoader.js +3 -1
- package/examples/jsm/loaders/SVGLoader.js +27 -49
- package/examples/jsm/loaders/TDSLoader.js +4 -0
- package/examples/jsm/loaders/TGALoader.js +6 -5
- package/examples/jsm/loaders/TTFLoader.js +2 -0
- package/examples/jsm/loaders/USDLoader.js +14 -0
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
- package/examples/jsm/loaders/VOXLoader.js +3 -0
- package/examples/jsm/loaders/VRMLLoader.js +4 -0
- package/examples/jsm/loaders/VTKLoader.js +2 -0
- package/examples/jsm/loaders/XYZLoader.js +2 -0
- package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
- package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
- package/examples/jsm/loaders/usd/USDAParser.js +56 -47
- package/examples/jsm/loaders/usd/USDComposer.js +25 -30
- package/examples/jsm/math/ColorConverter.js +7 -3
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/OBB.js +3 -3
- package/examples/jsm/math/Octree.js +20 -17
- package/examples/jsm/objects/GaussianSplat.js +5 -4
- package/examples/jsm/objects/Reflector.js +5 -0
- package/examples/jsm/objects/SkyMesh.js +14 -7
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/physics/RapierPhysics.js +2 -2
- package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
- package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
- package/examples/jsm/postprocessing/BokehPass.js +1 -1
- package/examples/jsm/postprocessing/GTAOPass.js +26 -18
- package/examples/jsm/renderers/SVGRenderer.js +3 -2
- package/examples/jsm/shaders/GTAOShader.js +7 -4
- package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
- package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
- package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
- package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
- package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
- package/examples/jsm/tsl/display/FSR1Node.js +3 -3
- package/examples/jsm/tsl/display/FXAANode.js +3 -10
- package/examples/jsm/tsl/display/FilmNode.js +3 -3
- package/examples/jsm/tsl/display/GTAONode.js +33 -25
- package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
- package/examples/jsm/tsl/display/GodraysNode.js +5 -19
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
- package/examples/jsm/tsl/display/LensflareNode.js +3 -3
- package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
- package/examples/jsm/tsl/display/OITPassNode.js +0 -11
- package/examples/jsm/tsl/display/OutlineNode.js +107 -5
- package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
- package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
- package/examples/jsm/tsl/display/SMAANode.js +3 -3
- package/examples/jsm/tsl/display/SSAONode.js +6 -20
- package/examples/jsm/tsl/display/SSGINode.js +36 -29
- package/examples/jsm/tsl/display/SSRNode.js +135 -63
- package/examples/jsm/tsl/display/SSSNode.js +6 -20
- package/examples/jsm/tsl/display/SharpenNode.js +3 -3
- package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
- package/examples/jsm/tsl/display/TAAUNode.js +10 -42
- package/examples/jsm/tsl/display/TRAANode.js +11 -43
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
- package/examples/jsm/tsl/display/TransitionNode.js +3 -3
- package/examples/jsm/tsl/display/lensDirt.js +30 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
- package/examples/jsm/tsl/utils/Raymarching.js +1 -1
- package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
- package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
- package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
- package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
- package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -1
- package/examples/jsm/utils/SceneUtils.js +1 -1
- package/examples/jsm/utils/unwrapUVs.js +865 -0
- package/examples/jsm/webxr/XREstimatedLight.js +11 -4
- package/package.json +3 -3
- package/src/Three.TSL.js +2 -683
- package/src/Three.WebGPU.Nodes.js +2 -1
- package/src/Three.WebGPU.js +2 -1
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationUtils.js +1 -3
- package/src/animation/KeyframeTrack.js +19 -0
- package/src/cameras/ArrayCamera.js +12 -0
- package/src/cameras/CubeCamera.js +3 -3
- package/src/constants.js +1 -9
- package/src/core/BufferAttribute.js +57 -21
- package/src/core/BufferGeometry.js +5 -13
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +28 -18
- package/src/core/InterleavedBufferAttribute.js +54 -20
- package/src/core/Object3D.js +19 -9
- package/src/core/Raycaster.js +2 -0
- package/src/core/RenderTarget.js +11 -5
- package/src/core/UniformsGroup.js +7 -3
- package/src/extras/PMREMGenerator.js +392 -685
- package/src/extras/core/Curve.js +4 -0
- package/src/extras/core/CurvePath.js +13 -0
- package/src/extras/core/ShapePath.js +1 -1
- package/src/geometries/EdgesGeometry.js +12 -10
- package/src/geometries/LatheGeometry.js +2 -0
- package/src/helpers/PolarGridHelper.js +1 -1
- package/src/lights/Light.js +11 -0
- package/src/lights/LightProbe.js +2 -0
- package/src/lights/LightShadow.js +2 -0
- package/src/loaders/AnimationLoader.js +2 -0
- package/src/loaders/AudioLoader.js +2 -0
- package/src/loaders/BufferGeometryLoader.js +2 -0
- package/src/loaders/CompressedTextureLoader.js +2 -0
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/DataTextureLoader.js +2 -0
- package/src/loaders/FileLoader.js +2 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ImageLoader.js +1 -0
- package/src/loaders/Loader.js +47 -0
- package/src/loaders/MaterialLoader.js +2 -0
- package/src/loaders/ObjectLoader.js +27 -8
- package/src/loaders/TextureLoader.js +5 -3
- package/src/loaders/nodes/NodeLoader.js +2 -0
- package/src/materials/Material.js +21 -2
- package/src/materials/MeshDepthMaterial.js +1 -1
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +1 -1
- package/src/materials/MeshMatcapMaterial.js +1 -1
- package/src/materials/MeshNormalMaterial.js +1 -1
- package/src/materials/MeshPhongMaterial.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +90 -11
- package/src/materials/MeshStandardMaterial.js +1 -1
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +32 -10
- package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
- package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
- package/src/materials/nodes/NodeMaterial.js +36 -16
- package/src/materials/nodes/NodeMaterialInstance.js +193 -0
- package/src/materials/nodes/NodeMaterials.js +1 -0
- package/src/materials/nodes/PointsNodeMaterial.js +1 -1
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
- package/src/math/Box3.js +2 -2
- package/src/math/Color.js +8 -8
- package/src/math/ColorManagement.js +2 -21
- package/src/math/FrustumArray.js +12 -0
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +2 -4
- package/src/math/MathUtils.js +33 -46
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +1 -1
- package/src/math/Matrix4.js +1 -1
- package/src/math/Triangle.js +2 -1
- package/src/math/Vector2.js +1 -1
- package/src/math/Vector3.js +1 -1
- package/src/math/Vector4.js +1 -1
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +2 -0
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/Batch.js +29 -23
- package/src/nodes/accessors/BufferAttributeNode.js +21 -1
- package/src/nodes/accessors/BuiltinNode.js +6 -0
- package/src/nodes/accessors/Camera.js +100 -93
- package/src/nodes/accessors/ClippingNode.js +17 -6
- package/src/nodes/accessors/CubeTextureNode.js +12 -24
- package/src/nodes/accessors/Instance.js +198 -160
- package/src/nodes/accessors/Lights.js +19 -6
- package/src/nodes/accessors/MaterialNode.js +33 -4
- package/src/nodes/accessors/Morph.js +81 -22
- package/src/nodes/accessors/Normal.js +0 -42
- package/src/nodes/accessors/Object3DNode.js +6 -0
- package/src/nodes/accessors/PointUVNode.js +6 -0
- package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
- package/src/nodes/accessors/ReferenceNode.js +6 -0
- package/src/nodes/accessors/Skinning.js +57 -52
- package/src/nodes/accessors/StorageBufferNode.js +3 -12
- package/src/nodes/accessors/TextureBicubic.js +30 -27
- package/src/nodes/accessors/TextureNode.js +164 -78
- package/src/nodes/accessors/TextureSizeNode.js +6 -0
- package/src/nodes/accessors/UniformArrayNode.js +8 -15
- package/src/nodes/accessors/VelocityNode.js +13 -8
- package/src/nodes/code/CodeNode.js +6 -0
- package/src/nodes/code/ExpressionNode.js +6 -0
- package/src/nodes/code/FunctionCallNode.js +3 -3
- package/src/nodes/code/FunctionNode.js +15 -13
- package/src/nodes/core/ArrayNode.js +3 -3
- package/src/nodes/core/AssignNode.js +10 -9
- package/src/nodes/core/AttributeNode.js +39 -0
- package/src/nodes/core/BypassNode.js +6 -0
- package/src/nodes/core/ConstNode.js +31 -1
- package/src/nodes/core/ContextNode.js +11 -6
- package/src/nodes/core/IndexNode.js +6 -0
- package/src/nodes/core/InputNode.js +6 -0
- package/src/nodes/core/InspectorNode.js +17 -31
- package/src/nodes/core/IsolateNode.js +8 -0
- package/src/nodes/core/Node.js +367 -67
- package/src/nodes/core/NodeBuilder.js +664 -222
- package/src/nodes/core/NodeUtils.js +25 -0
- package/src/nodes/core/NodeVar.js +10 -1
- package/src/nodes/core/OutputStructNode.js +6 -0
- package/src/nodes/core/OverrideContextNode.js +38 -37
- package/src/nodes/core/PropertyNode.js +14 -0
- package/src/nodes/core/StackNode.js +33 -21
- package/src/nodes/core/StructNode.js +6 -0
- package/src/nodes/core/StructTypeNode.js +6 -0
- package/src/nodes/core/SubBuildNode.js +8 -0
- package/src/nodes/core/TempNode.js +10 -35
- package/src/nodes/core/UniformGroupNode.js +6 -0
- package/src/nodes/core/VarNode.js +43 -135
- package/src/nodes/core/VaryingNode.js +33 -2
- package/src/nodes/display/BlendModes.js +5 -40
- package/src/nodes/display/BumpMapNode.js +17 -7
- package/src/nodes/display/ColorAdjustment.js +22 -10
- package/src/nodes/display/ColorSpaceFunctions.js +2 -14
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +6 -0
- package/src/nodes/display/NormalMapNode.js +3 -3
- package/src/nodes/display/PassNode.js +75 -16
- package/src/nodes/display/RenderOutputNode.js +22 -5
- package/src/nodes/display/ScreenNode.js +6 -0
- package/src/nodes/display/ToneMappingFunctions.js +9 -51
- package/src/nodes/display/ToneMappingNode.js +3 -3
- package/src/nodes/display/ToonOutlinePassNode.js +66 -2
- package/src/nodes/display/ViewportDepthNode.js +34 -4
- package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
- package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
- package/src/nodes/functions/BSDF/D_GGX.js +1 -8
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
- package/src/nodes/functions/BSDF/LTC.js +20 -47
- package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
- package/src/nodes/functions/PhysicalLightingModel.js +84 -51
- package/src/nodes/functions/VolumetricLightingModel.js +1 -1
- package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
- package/src/nodes/functions/material/getRoughness.js +3 -1
- package/src/nodes/geometry/RangeNode.js +52 -69
- package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
- package/src/nodes/gpgpu/BarrierNode.js +6 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
- package/src/nodes/gpgpu/ComputeNode.js +6 -0
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
- package/src/nodes/lighting/AnalyticLightNode.js +7 -14
- package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
- package/src/nodes/lighting/EnvironmentNode.js +58 -8
- package/src/nodes/lighting/IESSpotLightNode.js +19 -4
- package/src/nodes/lighting/LightProbeNode.js +2 -1
- package/src/nodes/lighting/LightUtils.js +2 -2
- package/src/nodes/lighting/LightingNode.js +6 -0
- package/src/nodes/lighting/LightsNode.js +26 -32
- package/src/nodes/lighting/PointShadowNode.js +92 -48
- package/src/nodes/lighting/ProjectorLightNode.js +1 -1
- package/src/nodes/lighting/RectAreaLightNode.js +13 -14
- package/src/nodes/lighting/ShadowBaseNode.js +9 -17
- package/src/nodes/lighting/ShadowFilterNode.js +26 -3
- package/src/nodes/lighting/ShadowNode.js +13 -11
- package/src/nodes/materialx/MaterialXColor.js +2 -14
- package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
- package/src/nodes/materialx/MaterialXNodes.js +8 -11
- package/src/nodes/materialx/MaterialXNoise.js +195 -454
- package/src/nodes/math/BitcastNode.js +5 -5
- package/src/nodes/math/BitcountNode.js +18 -46
- package/src/nodes/math/ConditionalNode.js +92 -22
- package/src/nodes/math/Hash.js +1 -1
- package/src/nodes/math/MathNode.js +86 -64
- package/src/nodes/math/MathUtils.js +2 -2
- package/src/nodes/math/OperatorNode.js +42 -59
- package/src/nodes/math/PackFloatNode.js +9 -9
- package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
- package/src/nodes/math/TriNoise3D.js +3 -23
- package/src/nodes/math/UnpackFloatNode.js +9 -9
- package/src/nodes/pmrem/PMREMNode.js +38 -75
- package/src/nodes/pmrem/PMREMUtils.js +108 -272
- package/src/nodes/procedural/Checker.js +1 -1
- package/src/nodes/tsl/TSLCore.js +199 -74
- package/src/nodes/utils/ArrayElementNode.js +19 -1
- package/src/nodes/utils/CubeMapNode.js +3 -3
- package/src/nodes/utils/DebugNode.js +2 -2
- package/src/nodes/utils/EventNode.js +6 -0
- package/src/nodes/utils/FlipNode.js +3 -3
- package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +14 -9
- package/src/nodes/utils/MemberNode.js +18 -0
- package/src/nodes/utils/PostProcessingUtils.js +20 -25
- package/src/nodes/utils/RTTNode.js +2 -0
- package/src/nodes/utils/ReflectorNode.js +24 -0
- package/src/nodes/utils/RotateNode.js +3 -3
- package/src/nodes/utils/SampleNode.js +6 -0
- package/src/nodes/utils/SetNode.js +3 -3
- package/src/nodes/utils/SplitNode.js +6 -0
- package/src/nodes/utils/UVUtils.js +2 -2
- package/src/objects/BatchedMesh.js +146 -15
- package/src/objects/InstancedMesh.js +12 -4
- package/src/objects/Line.js +20 -0
- package/src/objects/Mesh.js +8 -0
- package/src/objects/Points.js +20 -0
- package/src/objects/Skeleton.js +26 -0
- package/src/objects/SkinnedMesh.js +3 -3
- package/src/objects/Sprite.js +10 -0
- package/src/renderers/WebGLRenderer.js +104 -70
- package/src/renderers/common/Animation.js +5 -1
- package/src/renderers/common/Attributes.js +67 -57
- package/src/renderers/common/Backend.js +78 -3
- package/src/renderers/common/BindGroup.js +11 -0
- package/src/renderers/common/Binding.js +0 -11
- package/src/renderers/common/Bindings.js +116 -10
- package/src/renderers/common/Buffer.js +1 -1
- package/src/renderers/common/ClippingContext.js +12 -1
- package/src/renderers/common/ComputePipeline.js +17 -1
- package/src/renderers/common/DirectRenderPipeline.js +7 -3
- package/src/renderers/common/Geometries.js +170 -132
- package/src/renderers/common/Info.js +1 -1
- package/src/renderers/common/InspectorBase.js +5 -5
- package/src/renderers/common/Lighting.js +59 -0
- package/src/renderers/common/Pipelines.js +26 -12
- package/src/renderers/common/ProgrammableStage.js +1 -17
- package/src/renderers/common/RenderContext.js +21 -0
- package/src/renderers/common/RenderContexts.js +13 -4
- package/src/renderers/common/RenderObject.js +111 -35
- package/src/renderers/common/RenderObjects.js +37 -19
- package/src/renderers/common/Renderer.js +537 -295
- package/src/renderers/common/RendererUtils.js +15 -0
- package/src/renderers/common/StandardDrawingPipeline.js +343 -0
- package/src/renderers/common/Storage3DTexture.js +11 -0
- package/src/renderers/common/StorageArrayTexture.js +10 -0
- package/src/renderers/common/StorageTexture.js +0 -9
- package/src/renderers/common/Textures.js +144 -37
- package/src/renderers/common/UniformsGroup.js +19 -0
- package/src/renderers/common/XRManager.js +10 -91
- package/src/renderers/common/extras/PMREMGenerator.js +298 -576
- package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
- package/src/renderers/common/nodes/NodeLibrary.js +11 -35
- package/src/renderers/common/nodes/NodeManager.js +80 -31
- package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
- package/src/renderers/common/nodes/NodeSampler.js +14 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
- package/src/renderers/shaders/ShaderLib.js +3 -0
- package/src/renderers/shaders/UniformsLib.js +4 -5
- package/src/renderers/webgl/WebGLBackground.js +3 -3
- package/src/renderers/webgl/WebGLBindingStates.js +4 -2
- package/src/renderers/webgl/WebGLCapabilities.js +7 -1
- package/src/renderers/webgl/WebGLEnvironments.js +2 -2
- package/src/renderers/webgl/WebGLGeometries.js +42 -14
- package/src/renderers/webgl/WebGLMaterials.js +15 -2
- package/src/renderers/webgl/WebGLOutput.js +37 -1
- package/src/renderers/webgl/WebGLProgram.js +13 -54
- package/src/renderers/webgl/WebGLPrograms.js +22 -8
- package/src/renderers/webgl/WebGLRenderStates.js +11 -8
- package/src/renderers/webgl/WebGLShadowMap.js +6 -4
- package/src/renderers/webgl/WebGLState.js +10 -6
- package/src/renderers/webgl/WebGLTextures.js +129 -77
- package/src/renderers/webgl/WebGLUniforms.js +44 -6
- package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
- package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
- package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
- package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
- package/src/renderers/webgpu/WebGPUBackend.js +140 -82
- package/src/renderers/webgpu/WebGPURenderer.js +1 -1
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
- package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
- package/src/renderers/webxr/WebXRController.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +5 -90
- package/src/scenes/Scene.js +4 -4
- package/src/textures/CompressedTexture.js +2 -2
- package/src/textures/DepthTexture.js +2 -2
- package/src/textures/FramebufferTexture.js +11 -0
- package/src/textures/Texture.js +29 -1
- package/src/textures/TextureSource.js +1 -1
- package/src/upe.js +1 -1
- package/src/utils.js +4 -4
- package/examples/jsm/libs/surfaceNet.js +0 -201
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
|
@@ -250,7 +250,7 @@ class GTAOPass extends Pass {
|
|
|
250
250
|
this.height = height;
|
|
251
251
|
|
|
252
252
|
this.gtaoRenderTarget.setSize( width, height );
|
|
253
|
-
this.normalRenderTarget.setSize( width, height );
|
|
253
|
+
if ( this.normalRenderTarget ) this.normalRenderTarget.setSize( width, height );
|
|
254
254
|
this.pdRenderTarget.setSize( width, height );
|
|
255
255
|
|
|
256
256
|
this.gtaoMaterial.uniforms.resolution.value.set( width, height );
|
|
@@ -270,7 +270,7 @@ class GTAOPass extends Pass {
|
|
|
270
270
|
|
|
271
271
|
this.gtaoNoiseTexture.dispose();
|
|
272
272
|
this.pdNoiseTexture.dispose();
|
|
273
|
-
this.normalRenderTarget.dispose();
|
|
273
|
+
if ( this.normalRenderTarget ) this.normalRenderTarget.dispose();
|
|
274
274
|
this.gtaoRenderTarget.dispose();
|
|
275
275
|
this.pdRenderTarget.dispose();
|
|
276
276
|
this.normalMaterial.dispose();
|
|
@@ -296,10 +296,13 @@ class GTAOPass extends Pass {
|
|
|
296
296
|
/**
|
|
297
297
|
* Configures the GBuffer of this pass. If no arguments are passed,
|
|
298
298
|
* the pass creates an internal render target for holding depth
|
|
299
|
-
* and normal data.
|
|
299
|
+
* and normal data. External depth and normal data must use separate
|
|
300
|
+
* textures and remain owned by the caller.
|
|
301
|
+
* If no normal texture is supplied, normals are reconstructed from depth
|
|
302
|
+
* for AO and denoising, and the normal output displays black.
|
|
300
303
|
*
|
|
301
304
|
* @param {DepthTexture} [depthTexture] - The depth texture.
|
|
302
|
-
* @param {
|
|
305
|
+
* @param {Texture} [normalTexture] - The normal texture.
|
|
303
306
|
*/
|
|
304
307
|
setGBuffer( depthTexture, normalTexture ) {
|
|
305
308
|
|
|
@@ -311,34 +314,39 @@ class GTAOPass extends Pass {
|
|
|
311
314
|
|
|
312
315
|
} else {
|
|
313
316
|
|
|
314
|
-
this.
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
317
|
+
if ( this.normalRenderTarget === undefined ) {
|
|
318
|
+
|
|
319
|
+
const depthTexture = new DepthTexture();
|
|
320
|
+
depthTexture.format = DepthStencilFormat;
|
|
321
|
+
depthTexture.type = UnsignedInt248Type;
|
|
322
|
+
this.normalRenderTarget = new WebGLRenderTarget( this.width, this.height, {
|
|
323
|
+
minFilter: NearestFilter,
|
|
324
|
+
magFilter: NearestFilter,
|
|
325
|
+
type: HalfFloatType,
|
|
326
|
+
depthTexture: depthTexture
|
|
327
|
+
} );
|
|
328
|
+
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
this.depthTexture = this.normalRenderTarget.depthTexture;
|
|
323
332
|
this.normalTexture = this.normalRenderTarget.texture;
|
|
324
333
|
this._renderGBuffer = true;
|
|
325
334
|
|
|
326
335
|
}
|
|
327
336
|
|
|
328
337
|
const normalVectorType = ( this.normalTexture ) ? 1 : 0;
|
|
329
|
-
const depthValueSource = ( this.depthTexture === this.normalTexture ) ? 'w' : 'x';
|
|
330
338
|
|
|
331
339
|
this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE = normalVectorType;
|
|
332
|
-
this.gtaoMaterial.
|
|
340
|
+
this.gtaoMaterial.needsUpdate = true;
|
|
333
341
|
this.gtaoMaterial.uniforms.tNormal.value = this.normalTexture;
|
|
334
342
|
this.gtaoMaterial.uniforms.tDepth.value = this.depthTexture;
|
|
335
343
|
|
|
336
344
|
this.pdMaterial.defines.NORMAL_VECTOR_TYPE = normalVectorType;
|
|
337
|
-
this.pdMaterial.
|
|
345
|
+
this.pdMaterial.needsUpdate = true;
|
|
338
346
|
this.pdMaterial.uniforms.tNormal.value = this.normalTexture;
|
|
339
347
|
this.pdMaterial.uniforms.tDepth.value = this.depthTexture;
|
|
340
348
|
|
|
341
|
-
this.depthRenderMaterial.uniforms.tDepth.value = this.
|
|
349
|
+
this.depthRenderMaterial.uniforms.tDepth.value = this.depthTexture;
|
|
342
350
|
|
|
343
351
|
}
|
|
344
352
|
|
|
@@ -562,7 +570,7 @@ class GTAOPass extends Pass {
|
|
|
562
570
|
|
|
563
571
|
case GTAOPass.OUTPUT.Normal:
|
|
564
572
|
|
|
565
|
-
this.copyMaterial.uniforms.tDiffuse.value = this.
|
|
573
|
+
this.copyMaterial.uniforms.tDiffuse.value = this.normalTexture || null;
|
|
566
574
|
this.copyMaterial.blending = NoBlending;
|
|
567
575
|
this._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );
|
|
568
576
|
|
|
@@ -108,6 +108,7 @@ class SVGRenderer {
|
|
|
108
108
|
_clearColor = new Color(),
|
|
109
109
|
|
|
110
110
|
_vector3 = new Vector3(), // Needed for PointLight
|
|
111
|
+
_vector3b = new Vector3(), // Needed for DirectionalLight
|
|
111
112
|
_centroid = new Vector3(),
|
|
112
113
|
_normal = new Vector3(),
|
|
113
114
|
_normalViewMatrix = new Matrix3(),
|
|
@@ -532,9 +533,9 @@ class SVGRenderer {
|
|
|
532
533
|
|
|
533
534
|
if ( light.isDirectionalLight ) {
|
|
534
535
|
|
|
535
|
-
const
|
|
536
|
+
const lightDirection = _vector3.setFromMatrixPosition( light.matrixWorld ).sub( _vector3b.setFromMatrixPosition( light.target.matrixWorld ) ).normalize();
|
|
536
537
|
|
|
537
|
-
let amount = normal.dot(
|
|
538
|
+
let amount = normal.dot( lightDirection );
|
|
538
539
|
|
|
539
540
|
if ( amount <= 0 ) continue;
|
|
540
541
|
|
|
@@ -29,7 +29,6 @@ const GTAOShader = {
|
|
|
29
29
|
PERSPECTIVE_CAMERA: 1,
|
|
30
30
|
SAMPLES: 16,
|
|
31
31
|
NORMAL_VECTOR_TYPE: 1,
|
|
32
|
-
DEPTH_SWIZZLING: 'x',
|
|
33
32
|
SCREEN_SPACE_RADIUS: 0,
|
|
34
33
|
SCREEN_SPACE_RADIUS_SCALE: 100.0,
|
|
35
34
|
SCENE_CLIP_BOX: 0,
|
|
@@ -102,11 +101,11 @@ const GTAOShader = {
|
|
|
102
101
|
}
|
|
103
102
|
|
|
104
103
|
float getDepth(const vec2 uv) {
|
|
105
|
-
return textureLod(tDepth, uv.xy, 0.0).
|
|
104
|
+
return textureLod(tDepth, uv.xy, 0.0).r;
|
|
106
105
|
}
|
|
107
106
|
|
|
108
107
|
float fetchDepth(const ivec2 uv) {
|
|
109
|
-
return texelFetch(tDepth, uv.xy, 0).
|
|
108
|
+
return texelFetch(tDepth, uv.xy, 0).r;
|
|
110
109
|
}
|
|
111
110
|
|
|
112
111
|
float getViewZ(const in float depth) {
|
|
@@ -208,7 +207,11 @@ const GTAOShader = {
|
|
|
208
207
|
vec4 sampleDir = vec4(cos(angle), sin(angle), 0., 0.5 + 0.5 * noiseTexel.w);
|
|
209
208
|
sampleDir.xyz = normalize(kernelMatrix * sampleDir.xyz);
|
|
210
209
|
|
|
211
|
-
|
|
210
|
+
#if PERSPECTIVE_CAMERA == 1
|
|
211
|
+
vec3 viewDir = normalize(-viewPos.xyz);
|
|
212
|
+
#else
|
|
213
|
+
vec3 viewDir = vec3(0., 0., 1.);
|
|
214
|
+
#endif
|
|
212
215
|
vec3 sliceBitangent = normalize(cross(sampleDir.xyz, viewDir));
|
|
213
216
|
vec3 sliceTangent = cross(sliceBitangent, viewDir);
|
|
214
217
|
vec3 normalInSlice = normalize(viewNormal - sliceBitangent * dot(viewNormal, sliceBitangent));
|
|
@@ -27,7 +27,6 @@ const PoissonDenoiseShader = {
|
|
|
27
27
|
'SAMPLES': 16,
|
|
28
28
|
'SAMPLE_VECTORS': generatePdSamplePointInitializer( 16, 2, 1 ),
|
|
29
29
|
'NORMAL_VECTOR_TYPE': 1,
|
|
30
|
-
'DEPTH_VALUE_SOURCE': 0,
|
|
31
30
|
},
|
|
32
31
|
|
|
33
32
|
uniforms: {
|
|
@@ -97,19 +96,11 @@ const PoissonDenoiseShader = {
|
|
|
97
96
|
}
|
|
98
97
|
|
|
99
98
|
float getDepth(const vec2 uv) {
|
|
100
|
-
#if DEPTH_VALUE_SOURCE == 1
|
|
101
|
-
return textureLod(tDepth, uv.xy, 0.0).a;
|
|
102
|
-
#else
|
|
103
99
|
return textureLod(tDepth, uv.xy, 0.0).r;
|
|
104
|
-
#endif
|
|
105
100
|
}
|
|
106
101
|
|
|
107
102
|
float fetchDepth(const ivec2 uv) {
|
|
108
|
-
|
|
109
|
-
return texelFetch(tDepth, uv.xy, 0).a;
|
|
110
|
-
#else
|
|
111
|
-
return texelFetch(tDepth, uv.xy, 0).r;
|
|
112
|
-
#endif
|
|
103
|
+
return texelFetch(tDepth, uv.xy, 0).r;
|
|
113
104
|
}
|
|
114
105
|
|
|
115
106
|
vec3 computeNormalFromDepth(const vec2 uv) {
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
Color,
|
|
6
6
|
UniformsLib,
|
|
7
7
|
UniformsUtils,
|
|
8
|
+
PMREMGenerator,
|
|
8
9
|
} from 'three';
|
|
9
10
|
import {
|
|
10
11
|
context,
|
|
@@ -24,6 +25,7 @@ import {
|
|
|
24
25
|
GLSLNodeBuilder,
|
|
25
26
|
BasicNodeLibrary,
|
|
26
27
|
WebGLCapabilities,
|
|
28
|
+
PMREMNode,
|
|
27
29
|
} from 'three/webgpu';
|
|
28
30
|
|
|
29
31
|
// Limitations
|
|
@@ -60,7 +62,7 @@ function generateUniformsList( program, uniforms ) {
|
|
|
60
62
|
|
|
61
63
|
}
|
|
62
64
|
|
|
63
|
-
//
|
|
65
|
+
// Adapts nodes to use WebGLRenderer resources.
|
|
64
66
|
class WebGLNodeBuilder extends GLSLNodeBuilder {
|
|
65
67
|
|
|
66
68
|
addNode( node ) {
|
|
@@ -79,6 +81,10 @@ class WebGLNodeBuilder extends GLSLNodeBuilder {
|
|
|
79
81
|
|
|
80
82
|
};
|
|
81
83
|
|
|
84
|
+
} else if ( node instanceof PMREMNode && node._generator === null ) {
|
|
85
|
+
|
|
86
|
+
node._generator = new PMREMGenerator( this.renderer._renderer );
|
|
87
|
+
|
|
82
88
|
}
|
|
83
89
|
|
|
84
90
|
super.addNode( node );
|
|
@@ -184,6 +190,8 @@ class RendererProxy {
|
|
|
184
190
|
|
|
185
191
|
constructor( renderer ) {
|
|
186
192
|
|
|
193
|
+
this._renderer = renderer;
|
|
194
|
+
|
|
187
195
|
const backend = {
|
|
188
196
|
isWebGPUBackend: false,
|
|
189
197
|
extensions: renderer.extensions,
|
|
@@ -531,6 +539,7 @@ export class WebGLNodesHandler {
|
|
|
531
539
|
fogColor: { value: new Color() },
|
|
532
540
|
fogNear: { value: 0 },
|
|
533
541
|
fogFar: { value: 0 },
|
|
542
|
+
fogDensity: { value: 0 },
|
|
534
543
|
envMapIntensity: { value: 0 },
|
|
535
544
|
...UniformsUtils.clone( UniformsLib.lights )
|
|
536
545
|
};
|
|
@@ -560,16 +569,19 @@ export class WebGLNodesHandler {
|
|
|
560
569
|
}
|
|
561
570
|
|
|
562
571
|
// init uniforms
|
|
563
|
-
const
|
|
564
|
-
|
|
572
|
+
for ( const shaderStage of [ 'vertex', 'fragment' ] ) {
|
|
573
|
+
|
|
574
|
+
for ( const uniform of builder.uniforms[ shaderStage ] ) {
|
|
565
575
|
|
|
566
|
-
|
|
576
|
+
if ( uniform.type === 'buffer' ) {
|
|
567
577
|
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
578
|
+
// buffer uniforms are all nested in groups
|
|
579
|
+
const group = new UniformsGroup();
|
|
580
|
+
group.name = builder.getUniformBufferName( uniform, shaderStage );
|
|
581
|
+
group.uniforms = [ uniform ];
|
|
582
|
+
uniformsGroups.push( group );
|
|
583
|
+
|
|
584
|
+
}
|
|
573
585
|
|
|
574
586
|
}
|
|
575
587
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RenderTarget, Vector2, QuadMesh, NodeMaterial, RendererUtils,
|
|
1
|
+
import { RenderTarget, Vector2, QuadMesh, NodeMaterial, RendererUtils, Node, NodeUpdateType } from 'three/webgpu';
|
|
2
2
|
import { nodeObject, Fn, float, uv, texture, passTexture, sign, max, convertToTexture } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
const _size = /*@__PURE__*/ new Vector2();
|
|
@@ -9,10 +9,10 @@ let _rendererState;
|
|
|
9
9
|
/**
|
|
10
10
|
* Post processing node for creating an after image effect.
|
|
11
11
|
*
|
|
12
|
-
* @augments
|
|
12
|
+
* @augments Node
|
|
13
13
|
* @three_import import { afterImage } from 'three/addons/tsl/display/AfterImageNode.js';
|
|
14
14
|
*/
|
|
15
|
-
class AfterImageNode extends
|
|
15
|
+
class AfterImageNode extends Node {
|
|
16
16
|
|
|
17
17
|
static get type() {
|
|
18
18
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh,
|
|
1
|
+
import { RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, Node, NodeUpdateType } from 'three/webgpu';
|
|
2
2
|
import { Fn, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, luminance, abs, exp, max, context } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
@@ -16,10 +16,10 @@ let _rendererState;
|
|
|
16
16
|
*
|
|
17
17
|
* Reference: {@link https://en.wikipedia.org/wiki/Bilateral_filter}
|
|
18
18
|
*
|
|
19
|
-
* @augments
|
|
19
|
+
* @augments Node
|
|
20
20
|
* @three_import import { bilateralBlur } from 'three/addons/tsl/display/BilateralBlurNode.js';
|
|
21
21
|
*/
|
|
22
|
-
class BilateralBlurNode extends
|
|
22
|
+
class BilateralBlurNode extends Node {
|
|
23
23
|
|
|
24
24
|
static get type() {
|
|
25
25
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HalfFloatType, RenderTarget, Vector2, Vector3,
|
|
1
|
+
import { HalfFloatType, RenderTarget, Vector2, Vector3, Node, QuadMesh, NodeMaterial, RendererUtils, NodeUpdateType } from 'three/webgpu';
|
|
2
2
|
import { nodeObject, Fn, float, uv, passTexture, uniform, Loop, texture, luminance, smoothstep, mix, vec4, uniformArray, add, int, array, context } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
@@ -48,10 +48,10 @@ const luminosityHighPass = Fn( ( { input, threshold, smoothWidth } ) => {
|
|
|
48
48
|
* const bloomPass = bloom( emissivePass );
|
|
49
49
|
* renderPipeline.outputNode = scenePassColor.add( bloomPass );
|
|
50
50
|
* ```
|
|
51
|
-
* @augments
|
|
51
|
+
* @augments Node
|
|
52
52
|
* @three_import import { bloom } from 'three/addons/tsl/display/BloomNode.js';
|
|
53
53
|
*/
|
|
54
|
-
class BloomNode extends
|
|
54
|
+
class BloomNode extends Node {
|
|
55
55
|
|
|
56
56
|
static get type() {
|
|
57
57
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Node } from 'three/webgpu';
|
|
2
2
|
import {
|
|
3
3
|
nodeObject,
|
|
4
4
|
Fn,
|
|
@@ -13,10 +13,10 @@ import {
|
|
|
13
13
|
* This effect simulates the color fringing that occurs in real camera lenses
|
|
14
14
|
* by separating and offsetting the red, green, and blue channels.
|
|
15
15
|
*
|
|
16
|
-
* @augments
|
|
16
|
+
* @augments Node
|
|
17
17
|
* @three_import import { chromaticAberration } from 'three/addons/tsl/display/ChromaticAberrationNode.js';
|
|
18
18
|
*/
|
|
19
|
-
class ChromaticAberrationNode extends
|
|
19
|
+
class ChromaticAberrationNode extends Node {
|
|
20
20
|
|
|
21
21
|
static get type() {
|
|
22
22
|
|
|
@@ -117,15 +117,6 @@ class ChromaticAberrationNode extends TempNode {
|
|
|
117
117
|
|
|
118
118
|
return vec4( r, g, b, a );
|
|
119
119
|
|
|
120
|
-
} ).setLayout( {
|
|
121
|
-
name: 'ChromaticAberrationShader',
|
|
122
|
-
type: 'vec4',
|
|
123
|
-
inputs: [
|
|
124
|
-
{ name: 'uv', type: 'vec2' },
|
|
125
|
-
{ name: 'strength', type: 'float' },
|
|
126
|
-
{ name: 'center', type: 'vec2' },
|
|
127
|
-
{ name: 'scale', type: 'float' }
|
|
128
|
-
]
|
|
129
120
|
} );
|
|
130
121
|
|
|
131
122
|
const chromaticAberrationFn = Fn( () => {
|
|
@@ -162,13 +153,11 @@ export default ChromaticAberrationNode;
|
|
|
162
153
|
*/
|
|
163
154
|
export const chromaticAberration = ( node, strength = 1.0, center = null, scale = 1.1 ) => {
|
|
164
155
|
|
|
165
|
-
return
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
nodeObject( scale )
|
|
171
|
-
)
|
|
156
|
+
return new ChromaticAberrationNode(
|
|
157
|
+
convertToTexture( node ),
|
|
158
|
+
nodeObject( strength ),
|
|
159
|
+
nodeObject( center ),
|
|
160
|
+
nodeObject( scale )
|
|
172
161
|
);
|
|
173
162
|
|
|
174
163
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DataTexture, RepeatWrapping, Vector2, Vector3,
|
|
2
|
-
import { texture, getNormalFromDepth, getViewPosition, convertToTexture, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, luminance, vec2, vec3, vec4, uniformArray, int, dot, max, pow, abs, If, textureSize, sin, cos, mat2, PI, property } from 'three/tsl';
|
|
1
|
+
import { DataTexture, RepeatWrapping, Vector2, Vector3, Node } from 'three/webgpu';
|
|
2
|
+
import { texture, getNormalFromDepth, getViewPosition, convertToTexture, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, luminance, vec2, vec3, vec4, uniformArray, int, dot, max, pow, abs, If, textureSize, sin, cos, mat2, PI, property, isBackgroundDepth } from 'three/tsl';
|
|
3
3
|
import { SimplexNoise } from '../../math/SimplexNoise.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -10,10 +10,10 @@ import { SimplexNoise } from '../../math/SimplexNoise.js';
|
|
|
10
10
|
*
|
|
11
11
|
* Reference: {@link https://openaccess.thecvf.com/content/WACV2021/papers/Khademi_Self-Supervised_Poisson-Gaussian_Denoising_WACV_2021_paper.pdf}.
|
|
12
12
|
*
|
|
13
|
-
* @augments
|
|
13
|
+
* @augments Node
|
|
14
14
|
* @three_import import { denoise } from 'three/addons/tsl/display/DenoiseNode.js';
|
|
15
15
|
*/
|
|
16
|
-
class DenoiseNode extends
|
|
16
|
+
class DenoiseNode extends Node {
|
|
17
17
|
|
|
18
18
|
static get type() {
|
|
19
19
|
|
|
@@ -197,7 +197,7 @@ class DenoiseNode extends TempNode {
|
|
|
197
197
|
const texel = sampleTexture( uvNode ).toVar();
|
|
198
198
|
const result = property( 'vec4' );
|
|
199
199
|
|
|
200
|
-
If(
|
|
200
|
+
If( isBackgroundDepth( depth ).or( dot( viewNormal, viewNormal ).equal( 0.0 ) ), () => {
|
|
201
201
|
|
|
202
202
|
result.assign( texel );
|
|
203
203
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Node, NodeMaterial, NodeUpdateType, RenderTarget, Vector2, HalfFloatType, RedFormat, QuadMesh, RendererUtils } from 'three/webgpu';
|
|
2
2
|
import { convertToTexture, nodeObject, Fn, uniform, smoothstep, step, texture, max, uniformArray, outputStruct, property, vec4, vec3, uv, Loop, min, mix, float, context } from 'three/tsl';
|
|
3
3
|
import { gaussianBlur } from './GaussianBlurNode.js';
|
|
4
4
|
|
|
@@ -12,10 +12,10 @@ let _rendererState;
|
|
|
12
12
|
* - {@link https://pixelmischiefblog.wordpress.com/2016/11/25/bokeh-depth-of-field/}
|
|
13
13
|
* - {@link https://www.adriancourreges.com/blog/2016/09/09/doom-2016-graphics-study/}
|
|
14
14
|
*
|
|
15
|
-
* @augments
|
|
15
|
+
* @augments Node
|
|
16
16
|
* @three_import import { dof } from 'three/addons/tsl/display/DepthOfFieldNode.js';
|
|
17
17
|
*/
|
|
18
|
-
class DepthOfFieldNode extends
|
|
18
|
+
class DepthOfFieldNode extends Node {
|
|
19
19
|
|
|
20
20
|
static get type() {
|
|
21
21
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Node } from 'three/webgpu';
|
|
2
2
|
import { nodeObject, Fn, uv, vec2, vec3, sin, cos, add, vec4, screenSize } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Post processing node for creating dot-screen effect.
|
|
6
6
|
*
|
|
7
|
-
* @augments
|
|
7
|
+
* @augments Node
|
|
8
8
|
* @three_import import { dotScreen } from 'three/addons/tsl/display/DotScreenNode.js';
|
|
9
9
|
*/
|
|
10
|
-
class DotScreenNode extends
|
|
10
|
+
class DotScreenNode extends Node {
|
|
11
11
|
|
|
12
12
|
static get type() {
|
|
13
13
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HalfFloatType, RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh,
|
|
1
|
+
import { HalfFloatType, RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, Node, NodeUpdateType } from 'three/webgpu';
|
|
2
2
|
import { Fn, float, vec2, vec3, vec4, ivec2, int, uv, floor, fract, abs, max, min, clamp, saturate, sqrt, select, exp2, nodeObject, passTexture, textureSize, textureLoad, convertToTexture, context } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
@@ -23,10 +23,10 @@ let _rendererState;
|
|
|
23
23
|
*
|
|
24
24
|
* Reference: {@link https://gpuopen.com/fidelityfx-superresolution/}.
|
|
25
25
|
*
|
|
26
|
-
* @augments
|
|
26
|
+
* @augments Node
|
|
27
27
|
* @three_import import { fsr1 } from 'three/addons/tsl/display/fsr1/FSR1Node.js';
|
|
28
28
|
*/
|
|
29
|
-
class FSR1Node extends
|
|
29
|
+
class FSR1Node extends Node {
|
|
30
30
|
|
|
31
31
|
static get type() {
|
|
32
32
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { Vector2,
|
|
1
|
+
import { Vector2, Node } from 'three/webgpu';
|
|
2
2
|
import { Fn, uniformArray, select, float, NodeUpdateType, uv, dot, clamp, uniform, convertToTexture, smoothstep, bool, vec2, vec3, If, Loop, max, min, Break, abs } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Post processing node for applying FXAA. This node requires sRGB input
|
|
6
6
|
* so tone mapping and color space conversion must happen before the anti-aliasing.
|
|
7
7
|
*
|
|
8
|
-
* @augments
|
|
8
|
+
* @augments Node
|
|
9
9
|
* @three_import import { fxaa } from 'three/addons/tsl/display/FXAANode.js';
|
|
10
10
|
*/
|
|
11
|
-
class FXAANode extends
|
|
11
|
+
class FXAANode extends Node {
|
|
12
12
|
|
|
13
13
|
static get type() {
|
|
14
14
|
|
|
@@ -328,13 +328,6 @@ class FXAANode extends TempNode {
|
|
|
328
328
|
|
|
329
329
|
return Sample( finalUv );
|
|
330
330
|
|
|
331
|
-
} ).setLayout( {
|
|
332
|
-
name: 'FxaaPixelShader',
|
|
333
|
-
type: 'vec4',
|
|
334
|
-
inputs: [
|
|
335
|
-
{ name: 'uv', type: 'vec2' },
|
|
336
|
-
{ name: 'texSize', type: 'vec2' },
|
|
337
|
-
]
|
|
338
331
|
} );
|
|
339
332
|
|
|
340
333
|
const fxaa = Fn( () => {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Node } from 'three/webgpu';
|
|
2
2
|
import { rand, Fn, fract, time, uv, clamp, mix, vec4, nodeProxy } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Post processing node for creating a film grain effect.
|
|
6
6
|
*
|
|
7
|
-
* @augments
|
|
7
|
+
* @augments Node
|
|
8
8
|
* @three_import import { film } from 'three/addons/tsl/display/FilmNode.js';
|
|
9
9
|
*/
|
|
10
|
-
class FilmNode extends
|
|
10
|
+
class FilmNode extends Node {
|
|
11
11
|
|
|
12
12
|
static get type() {
|
|
13
13
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DataTexture, RenderTarget, RepeatWrapping, Vector2, Vector3,
|
|
2
|
-
import { reference,
|
|
1
|
+
import { DataTexture, RenderTarget, RepeatWrapping, Vector2, Vector3, Node, QuadMesh, NodeMaterial, RendererUtils, RedFormat } from 'three/webgpu';
|
|
2
|
+
import { reference, getNormalFromDepth, getViewPosition, getScreenPositionFromClip, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, vec2, vec3, vec4, int, dot, max, min, pow, abs, If, textureSize, sin, cos, PI, texture, passTexture, mat3, normalize, cross, mix, acos, clamp, interleavedGradientNoise, screenCoordinate, rand, context, isBackgroundDepth, projectionDepth } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
5
|
const _size = /*@__PURE__*/ new Vector2();
|
|
@@ -43,10 +43,10 @@ let _rendererState;
|
|
|
43
43
|
*
|
|
44
44
|
* Reference: [Practical Real-Time Strategies for Accurate Indirect Occlusion](https://www.activision.com/cdn/research/Practical_Real_Time_Strategies_for_Accurate_Indirect_Occlusion_NEW%20VERSION_COLOR.pdf).
|
|
45
45
|
*
|
|
46
|
-
* @augments
|
|
46
|
+
* @augments Node
|
|
47
47
|
* @three_import import { ao } from 'three/addons/tsl/display/GTAONode.js';
|
|
48
48
|
*/
|
|
49
|
-
class GTAONode extends
|
|
49
|
+
class GTAONode extends Node {
|
|
50
50
|
|
|
51
51
|
static get type() {
|
|
52
52
|
|
|
@@ -228,6 +228,14 @@ class GTAONode extends TempNode {
|
|
|
228
228
|
*/
|
|
229
229
|
this._cameraFar = reference( 'far', 'float', camera );
|
|
230
230
|
|
|
231
|
+
/**
|
|
232
|
+
* A reference to the scene's camera.
|
|
233
|
+
*
|
|
234
|
+
* @private
|
|
235
|
+
* @type {Camera}
|
|
236
|
+
*/
|
|
237
|
+
this._camera = camera;
|
|
238
|
+
|
|
231
239
|
/**
|
|
232
240
|
* Temporal direction that influences the rotation angle for each slice.
|
|
233
241
|
*
|
|
@@ -397,48 +405,48 @@ class GTAONode extends TempNode {
|
|
|
397
405
|
|
|
398
406
|
const uvNode = uv();
|
|
399
407
|
|
|
400
|
-
const
|
|
401
|
-
|
|
402
|
-
if ( builder.renderer.logarithmicDepthBuffer === true ) {
|
|
403
|
-
|
|
404
|
-
const viewZ = logarithmicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
|
|
405
|
-
|
|
406
|
-
return viewZToPerspectiveDepth( viewZ, this._cameraNear, this._cameraFar );
|
|
407
|
-
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
return depth;
|
|
411
|
-
|
|
412
|
-
};
|
|
413
|
-
|
|
414
|
-
const sampleDepth = ( uv ) => linearizeDepth( this.depthNode.sample( uv ).r );
|
|
408
|
+
const sampleDepth = ( uv ) => projectionDepth( this.depthNode.sample( uv ).r, this._cameraNear, this._cameraFar );
|
|
415
409
|
|
|
416
410
|
const sampleCenterDepth = ( uv ) => {
|
|
417
411
|
|
|
418
412
|
// Sidestep the nearest-rounding during depth access for the unjittered center pixel to avoid banding
|
|
419
413
|
|
|
420
414
|
const g = this.depthNode.gather().sample( uv );
|
|
421
|
-
const depth = min( min( g.x, g.y ), min( g.z, g.w ) );
|
|
415
|
+
const depth = builder.renderer.reversedDepthBuffer === true ? max( max( g.x, g.y ), max( g.z, g.w ) ) : min( min( g.x, g.y ), min( g.z, g.w ) );
|
|
422
416
|
|
|
423
|
-
return
|
|
417
|
+
return projectionDepth( depth, this._cameraNear, this._cameraFar );
|
|
424
418
|
|
|
425
419
|
};
|
|
426
420
|
|
|
427
421
|
const sampleNoise = ( uv ) => this._noiseNode.sample( uv );
|
|
428
422
|
const sampleNormal = ( uv ) => ( this.normalNode !== null ) ? this.normalNode.sample( uv ).rgb.normalize() : getNormalFromDepth( uv, this.depthNode.value, this._cameraProjectionMatrixInverse );
|
|
429
423
|
|
|
424
|
+
const isValidSample = Fn( ( [ uv, centerTexel, size ] ) => {
|
|
425
|
+
|
|
426
|
+
const texel = uv.mul( size ).floor().toConst();
|
|
427
|
+
|
|
428
|
+
// rejects off-screen samples and samples that fall into the center texel
|
|
429
|
+
|
|
430
|
+
return uv.x.greaterThan( 0 ).and( uv.x.lessThan( 1 ) ).and( uv.y.greaterThan( 0 ) ).and( uv.y.lessThan( 1 ) )
|
|
431
|
+
.and( texel.x.notEqual( centerTexel.x ).or( texel.y.notEqual( centerTexel.y ) ) );
|
|
432
|
+
|
|
433
|
+
}, { uv: 'vec2', centerTexel: 'vec2', size: 'vec2', return: 'bool' } );
|
|
434
|
+
|
|
430
435
|
this._ao = Fn( () => {
|
|
431
436
|
|
|
432
437
|
const depth = this._resolutionScale.lessThan( 1 ).select( sampleCenterDepth( uvNode ), sampleDepth( uvNode ) ).toConst();
|
|
433
438
|
|
|
434
|
-
|
|
439
|
+
isBackgroundDepth( depth ).discard();
|
|
440
|
+
|
|
441
|
+
const depthSize = vec2( textureSize( this.depthNode, 0 ) ).toConst();
|
|
442
|
+
const centerTexel = uvNode.mul( depthSize ).floor().toConst();
|
|
435
443
|
|
|
436
444
|
const viewPosition = getViewPosition( uvNode, depth, this._cameraProjectionMatrixInverse ).toConst();
|
|
437
445
|
const viewNormal = sampleNormal( uvNode ).toConst();
|
|
438
446
|
|
|
439
447
|
const radius = this.radius;
|
|
440
448
|
const invRadius = radius.reciprocal().toConst();
|
|
441
|
-
const viewDir = normalize( viewPosition.xyz.negate() ).toConst();
|
|
449
|
+
const viewDir = ( this._camera.isPerspectiveCamera === true ) ? normalize( viewPosition.xyz.negate() ).toConst() : vec3( 0, 0, 1 ).toConst();
|
|
442
450
|
const clipPosition = this._cameraProjectionMatrix.mul( vec4( viewPosition, 1.0 ) ).toConst();
|
|
443
451
|
|
|
444
452
|
const noiseResolution = textureSize( this._noiseNode, 0 );
|
|
@@ -522,7 +530,7 @@ class GTAONode extends TempNode {
|
|
|
522
530
|
const distFacX = min( lenX.mul( invRadius ), 1 );
|
|
523
531
|
const distFacSqX = distFacX.mul( distFacX );
|
|
524
532
|
|
|
525
|
-
If( abs( viewDeltaX.z ).lessThan( this.thickness ), () => {
|
|
533
|
+
If( isValidSample( sampleScreenPositionX, centerTexel, depthSize ).and( abs( viewDeltaX.z ).lessThan( this.thickness ) ), () => {
|
|
526
534
|
|
|
527
535
|
cosHorizons.x.assign( mix( max( cosHorizons.x, sHX ), cosHorizons.x, distFacSqX ) );
|
|
528
536
|
|
|
@@ -541,7 +549,7 @@ class GTAONode extends TempNode {
|
|
|
541
549
|
const distFacY = min( lenY.mul( invRadius ), 1 );
|
|
542
550
|
const distFacSqY = distFacY.mul( distFacY );
|
|
543
551
|
|
|
544
|
-
If( abs( viewDeltaY.z ).lessThan( this.thickness ), () => {
|
|
552
|
+
If( isValidSample( sampleScreenPositionY, centerTexel, depthSize ).and( abs( viewDeltaY.z ).lessThan( this.thickness ) ), () => {
|
|
545
553
|
|
|
546
554
|
cosHorizons.y.assign( mix( max( cosHorizons.y, sHY ), cosHorizons.y, distFacSqY ) );
|
|
547
555
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh,
|
|
1
|
+
import { RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, Node, NodeUpdateType, warnOnce } from 'three/webgpu';
|
|
2
2
|
import { Fn, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, premultiplyAlpha, unpremultiplyAlpha, context, texture } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
@@ -8,10 +8,10 @@ let _rendererState;
|
|
|
8
8
|
/**
|
|
9
9
|
* Post processing node for creating a gaussian blur effect.
|
|
10
10
|
*
|
|
11
|
-
* @augments
|
|
11
|
+
* @augments Node
|
|
12
12
|
* @three_import import { gaussianBlur, premultipliedGaussianBlur } from 'three/addons/tsl/display/GaussianBlurNode.js';
|
|
13
13
|
*/
|
|
14
|
-
class GaussianBlurNode extends
|
|
14
|
+
class GaussianBlurNode extends Node {
|
|
15
15
|
|
|
16
16
|
static get type() {
|
|
17
17
|
|