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,578 @@
|
|
|
1
|
+
import { HalfFloatType, Vector2, RenderTarget, RendererUtils, QuadMesh, NodeMaterial, TempNode, NodeUpdateType, Matrix4, DepthTexture } from 'three/webgpu';
|
|
2
|
+
import { add, float, If, Loop, int, Fn, min, max, clamp, nodeObject, texture, uniform, uv, vec2, vec4, luminance, convertToTexture, passTexture, velocity, getViewPosition, length } from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
|
+
const _size = /*@__PURE__*/ new Vector2();
|
|
6
|
+
|
|
7
|
+
let _rendererState;
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A special node that applies TRAA (Temporal Reprojection Anti-Aliasing).
|
|
12
|
+
*
|
|
13
|
+
* References:
|
|
14
|
+
* - {@link https://alextardif.com/TAA.html}
|
|
15
|
+
* - {@link https://www.elopezr.com/temporal-aa-and-the-quest-for-the-holy-trail/}
|
|
16
|
+
*
|
|
17
|
+
* @augments TempNode
|
|
18
|
+
* @three_import import { traa } from 'three/addons/tsl/display/TRAANode.js';
|
|
19
|
+
*/
|
|
20
|
+
class TRAANode extends TempNode {
|
|
21
|
+
|
|
22
|
+
static get type() {
|
|
23
|
+
|
|
24
|
+
return 'TRAANode';
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Constructs a new TRAA node.
|
|
30
|
+
*
|
|
31
|
+
* @param {TextureNode} beautyNode - The texture node that represents the input of the effect.
|
|
32
|
+
* @param {TextureNode} depthNode - A node that represents the scene's depth.
|
|
33
|
+
* @param {TextureNode} velocityNode - A node that represents the scene's velocity.
|
|
34
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
35
|
+
*/
|
|
36
|
+
constructor( beautyNode, depthNode, velocityNode, camera ) {
|
|
37
|
+
|
|
38
|
+
super( 'vec4' );
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* This flag can be used for type testing.
|
|
42
|
+
*
|
|
43
|
+
* @type {boolean}
|
|
44
|
+
* @readonly
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
47
|
+
this.isTRAANode = true;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
51
|
+
* its effect once per frame in `updateBefore()`.
|
|
52
|
+
*
|
|
53
|
+
* @type {string}
|
|
54
|
+
* @default 'frame'
|
|
55
|
+
*/
|
|
56
|
+
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The texture node that represents the input of the effect.
|
|
60
|
+
*
|
|
61
|
+
* @type {TextureNode}
|
|
62
|
+
*/
|
|
63
|
+
this.beautyNode = beautyNode;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* A node that represents the scene's velocity.
|
|
67
|
+
*
|
|
68
|
+
* @type {TextureNode}
|
|
69
|
+
*/
|
|
70
|
+
this.depthNode = depthNode;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A node that represents the scene's velocity.
|
|
74
|
+
*
|
|
75
|
+
* @type {TextureNode}
|
|
76
|
+
*/
|
|
77
|
+
this.velocityNode = velocityNode;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The camera the scene is rendered with.
|
|
81
|
+
*
|
|
82
|
+
* @type {Camera}
|
|
83
|
+
*/
|
|
84
|
+
this.camera = camera;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The jitter index selects the current camera offset value.
|
|
88
|
+
*
|
|
89
|
+
* @private
|
|
90
|
+
* @type {number}
|
|
91
|
+
* @default 0
|
|
92
|
+
*/
|
|
93
|
+
this._jitterIndex = 0;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* A uniform node holding the inverse resolution value.
|
|
97
|
+
*
|
|
98
|
+
* @private
|
|
99
|
+
* @type {UniformNode<vec2>}
|
|
100
|
+
*/
|
|
101
|
+
this._invSize = uniform( new Vector2() );
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* A uniform node holding the camera world matrix.
|
|
105
|
+
*
|
|
106
|
+
* @private
|
|
107
|
+
* @type {UniformNode<mat4>}
|
|
108
|
+
*/
|
|
109
|
+
this._cameraWorldMatrix = uniform( new Matrix4() );
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* A uniform node holding the camera projection matrix inverse.
|
|
113
|
+
*
|
|
114
|
+
* @private
|
|
115
|
+
* @type {UniformNode<mat4>}
|
|
116
|
+
*/
|
|
117
|
+
this._cameraProjectionMatrixInverse = uniform( new Matrix4() );
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* A uniform node holding the previous frame's view matrix.
|
|
121
|
+
*
|
|
122
|
+
* @private
|
|
123
|
+
* @type {UniformNode<mat4>}
|
|
124
|
+
*/
|
|
125
|
+
this._previousCameraWorldMatrix = uniform( new Matrix4() );
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* A uniform node holding the previous frame's projection matrix inverse.
|
|
129
|
+
*
|
|
130
|
+
* @private
|
|
131
|
+
* @type {UniformNode<mat4>}
|
|
132
|
+
*/
|
|
133
|
+
this._previousCameraProjectionMatrixInverse = uniform( new Matrix4() );
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The render target that represents the history of frame data.
|
|
137
|
+
*
|
|
138
|
+
* @private
|
|
139
|
+
* @type {?RenderTarget}
|
|
140
|
+
*/
|
|
141
|
+
this._historyRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType, depthTexture: new DepthTexture() } );
|
|
142
|
+
this._historyRenderTarget.texture.name = 'TRAANode.history';
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* The render target for the resolve.
|
|
146
|
+
*
|
|
147
|
+
* @private
|
|
148
|
+
* @type {?RenderTarget}
|
|
149
|
+
*/
|
|
150
|
+
this._resolveRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
|
|
151
|
+
this._resolveRenderTarget.texture.name = 'TRAANode.resolve';
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Material used for the resolve step.
|
|
155
|
+
*
|
|
156
|
+
* @private
|
|
157
|
+
* @type {NodeMaterial}
|
|
158
|
+
*/
|
|
159
|
+
this._resolveMaterial = new NodeMaterial();
|
|
160
|
+
this._resolveMaterial.name = 'TRAA.resolve';
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The result of the effect is represented as a separate texture node.
|
|
164
|
+
*
|
|
165
|
+
* @private
|
|
166
|
+
* @type {PassTextureNode}
|
|
167
|
+
*/
|
|
168
|
+
this._textureNode = passTexture( this, this._resolveRenderTarget.texture );
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Used to save the original/unjittered projection matrix.
|
|
172
|
+
*
|
|
173
|
+
* @private
|
|
174
|
+
* @type {Matrix4}
|
|
175
|
+
*/
|
|
176
|
+
this._originalProjectionMatrix = new Matrix4();
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* A texture node for the previous depth buffer.
|
|
180
|
+
*
|
|
181
|
+
* @private
|
|
182
|
+
* @type {TextureNode}
|
|
183
|
+
*/
|
|
184
|
+
this._previousDepthNode = texture( new DepthTexture( 1, 1 ) );
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Sync the post processing stack with the TRAA node.
|
|
188
|
+
* @private
|
|
189
|
+
* @type {boolean}
|
|
190
|
+
*/
|
|
191
|
+
this._needsPostProcessingSync = false;
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Returns the result of the effect as a texture node.
|
|
197
|
+
*
|
|
198
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
199
|
+
*/
|
|
200
|
+
getTextureNode() {
|
|
201
|
+
|
|
202
|
+
return this._textureNode;
|
|
203
|
+
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Sets the size of the effect.
|
|
208
|
+
*
|
|
209
|
+
* @param {number} width - The width of the effect.
|
|
210
|
+
* @param {number} height - The height of the effect.
|
|
211
|
+
*/
|
|
212
|
+
setSize( width, height ) {
|
|
213
|
+
|
|
214
|
+
this._historyRenderTarget.setSize( width, height );
|
|
215
|
+
this._resolveRenderTarget.setSize( width, height );
|
|
216
|
+
|
|
217
|
+
this._invSize.value.set( 1 / width, 1 / height );
|
|
218
|
+
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Defines the TRAA's current jitter as a view offset
|
|
223
|
+
* to the scene's camera.
|
|
224
|
+
*
|
|
225
|
+
* @param {number} width - The width of the effect.
|
|
226
|
+
* @param {number} height - The height of the effect.
|
|
227
|
+
*/
|
|
228
|
+
setViewOffset( width, height ) {
|
|
229
|
+
|
|
230
|
+
// save original/unjittered projection matrix for velocity pass
|
|
231
|
+
|
|
232
|
+
this.camera.updateProjectionMatrix();
|
|
233
|
+
this._originalProjectionMatrix.copy( this.camera.projectionMatrix );
|
|
234
|
+
|
|
235
|
+
velocity.setProjectionMatrix( this._originalProjectionMatrix );
|
|
236
|
+
|
|
237
|
+
//
|
|
238
|
+
|
|
239
|
+
const viewOffset = {
|
|
240
|
+
|
|
241
|
+
fullWidth: width,
|
|
242
|
+
fullHeight: height,
|
|
243
|
+
offsetX: 0,
|
|
244
|
+
offsetY: 0,
|
|
245
|
+
width: width,
|
|
246
|
+
height: height
|
|
247
|
+
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
const jitterOffset = _JitterVectors[ this._jitterIndex ];
|
|
251
|
+
|
|
252
|
+
this.camera.setViewOffset(
|
|
253
|
+
|
|
254
|
+
viewOffset.fullWidth, viewOffset.fullHeight,
|
|
255
|
+
|
|
256
|
+
viewOffset.offsetX + jitterOffset[ 0 ] * 0.0625, viewOffset.offsetY + jitterOffset[ 1 ] * 0.0625, // 0.0625 = 1 / 16
|
|
257
|
+
|
|
258
|
+
viewOffset.width, viewOffset.height
|
|
259
|
+
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Clears the view offset from the scene's camera.
|
|
266
|
+
*/
|
|
267
|
+
clearViewOffset() {
|
|
268
|
+
|
|
269
|
+
this.camera.clearViewOffset();
|
|
270
|
+
|
|
271
|
+
velocity.setProjectionMatrix( null );
|
|
272
|
+
|
|
273
|
+
// update jitter index
|
|
274
|
+
|
|
275
|
+
this._jitterIndex ++;
|
|
276
|
+
this._jitterIndex = this._jitterIndex % ( _JitterVectors.length - 1 );
|
|
277
|
+
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* This method is used to render the effect once per frame.
|
|
282
|
+
*
|
|
283
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
284
|
+
*/
|
|
285
|
+
updateBefore( frame ) {
|
|
286
|
+
|
|
287
|
+
const { renderer } = frame;
|
|
288
|
+
|
|
289
|
+
// store previous frame matrices before updating current ones
|
|
290
|
+
|
|
291
|
+
this._previousCameraWorldMatrix.value.copy( this._cameraWorldMatrix.value );
|
|
292
|
+
this._previousCameraProjectionMatrixInverse.value.copy( this._cameraProjectionMatrixInverse.value );
|
|
293
|
+
|
|
294
|
+
// update camera matrices uniforms
|
|
295
|
+
|
|
296
|
+
this._cameraWorldMatrix.value.copy( this.camera.matrixWorld );
|
|
297
|
+
this._cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );
|
|
298
|
+
|
|
299
|
+
// keep the TRAA in sync with the dimensions of the beauty node
|
|
300
|
+
|
|
301
|
+
const beautyRenderTarget = ( this.beautyNode.isRTTNode ) ? this.beautyNode.renderTarget : this.beautyNode.passNode.renderTarget;
|
|
302
|
+
|
|
303
|
+
const width = beautyRenderTarget.texture.width;
|
|
304
|
+
const height = beautyRenderTarget.texture.height;
|
|
305
|
+
|
|
306
|
+
//
|
|
307
|
+
|
|
308
|
+
if ( this._needsPostProcessingSync === true ) {
|
|
309
|
+
|
|
310
|
+
this.setViewOffset( width, height );
|
|
311
|
+
|
|
312
|
+
this._needsPostProcessingSync = false;
|
|
313
|
+
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
317
|
+
|
|
318
|
+
//
|
|
319
|
+
|
|
320
|
+
const needsRestart = this._historyRenderTarget.width !== width || this._historyRenderTarget.height !== height;
|
|
321
|
+
this.setSize( width, height );
|
|
322
|
+
|
|
323
|
+
// every time when the dimensions change we need fresh history data
|
|
324
|
+
|
|
325
|
+
if ( needsRestart === true ) {
|
|
326
|
+
|
|
327
|
+
// bind and clear render target to make sure they are initialized after the resize which triggers a dispose()
|
|
328
|
+
|
|
329
|
+
renderer.setRenderTarget( this._historyRenderTarget );
|
|
330
|
+
renderer.clear();
|
|
331
|
+
|
|
332
|
+
renderer.setRenderTarget( this._resolveRenderTarget );
|
|
333
|
+
renderer.clear();
|
|
334
|
+
|
|
335
|
+
// make sure to reset the history with the contents of the beauty buffer otherwise subsequent frames after the
|
|
336
|
+
// resize will fade from a darker color to the correct one because the history was cleared with black.
|
|
337
|
+
|
|
338
|
+
renderer.copyTextureToTexture( beautyRenderTarget.texture, this._historyRenderTarget.texture );
|
|
339
|
+
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// resolve
|
|
343
|
+
|
|
344
|
+
renderer.setRenderTarget( this._resolveRenderTarget );
|
|
345
|
+
_quadMesh.material = this._resolveMaterial;
|
|
346
|
+
_quadMesh.name = 'TRAA';
|
|
347
|
+
_quadMesh.render( renderer );
|
|
348
|
+
renderer.setRenderTarget( null );
|
|
349
|
+
|
|
350
|
+
// update history
|
|
351
|
+
|
|
352
|
+
renderer.copyTextureToTexture( this._resolveRenderTarget.texture, this._historyRenderTarget.texture );
|
|
353
|
+
|
|
354
|
+
// Copy current depth to previous depth buffer
|
|
355
|
+
|
|
356
|
+
const size = renderer.getDrawingBufferSize( _size );
|
|
357
|
+
|
|
358
|
+
// only allow the depth copy if the dimensions of the history render target match with the drawing
|
|
359
|
+
// render buffer and thus the depth texture of the scene. For some reasons, there are timing issues
|
|
360
|
+
// with WebGPU resulting in different size of the drawing buffer and the beauty render target when
|
|
361
|
+
// resizing the browser window. This does not happen with the WebGL backend
|
|
362
|
+
|
|
363
|
+
if ( this._historyRenderTarget.height === size.height && this._historyRenderTarget.width === size.width ) {
|
|
364
|
+
|
|
365
|
+
const currentDepth = this.depthNode.value;
|
|
366
|
+
renderer.copyTextureToTexture( currentDepth, this._historyRenderTarget.depthTexture );
|
|
367
|
+
this._previousDepthNode.value = this._historyRenderTarget.depthTexture;
|
|
368
|
+
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// restore
|
|
372
|
+
|
|
373
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
374
|
+
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* This method is used to setup the effect's render targets and TSL code.
|
|
379
|
+
*
|
|
380
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
381
|
+
* @return {PassTextureNode}
|
|
382
|
+
*/
|
|
383
|
+
setup( builder ) {
|
|
384
|
+
|
|
385
|
+
const postProcessing = builder.context.postProcessing;
|
|
386
|
+
|
|
387
|
+
if ( postProcessing ) {
|
|
388
|
+
|
|
389
|
+
this._needsPostProcessingSync = true;
|
|
390
|
+
|
|
391
|
+
postProcessing.context.onBeforePostProcessing = () => {
|
|
392
|
+
|
|
393
|
+
const size = builder.renderer.getDrawingBufferSize( _size );
|
|
394
|
+
this.setViewOffset( size.width, size.height );
|
|
395
|
+
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
postProcessing.context.onAfterPostProcessing = () => {
|
|
399
|
+
|
|
400
|
+
this.clearViewOffset();
|
|
401
|
+
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const historyTexture = texture( this._historyRenderTarget.texture );
|
|
407
|
+
const sampleTexture = this.beautyNode;
|
|
408
|
+
const depthTexture = this.depthNode;
|
|
409
|
+
const velocityTexture = this.velocityNode;
|
|
410
|
+
|
|
411
|
+
const resolve = Fn( () => {
|
|
412
|
+
|
|
413
|
+
const uvNode = uv();
|
|
414
|
+
|
|
415
|
+
const minColor = vec4( 10000 ).toVar();
|
|
416
|
+
const maxColor = vec4( - 10000 ).toVar();
|
|
417
|
+
const closestDepth = float( 1 ).toVar();
|
|
418
|
+
const farthestDepth = float( 0 ).toVar();
|
|
419
|
+
const closestDepthPixelPosition = vec2( 0 ).toVar();
|
|
420
|
+
|
|
421
|
+
// sample a 3x3 neighborhood to create a box in color space
|
|
422
|
+
// clamping the history color with the resulting min/max colors mitigates ghosting
|
|
423
|
+
|
|
424
|
+
Loop( { start: int( - 1 ), end: int( 1 ), type: 'int', condition: '<=', name: 'x' }, ( { x } ) => {
|
|
425
|
+
|
|
426
|
+
Loop( { start: int( - 1 ), end: int( 1 ), type: 'int', condition: '<=', name: 'y' }, ( { y } ) => {
|
|
427
|
+
|
|
428
|
+
const uvNeighbor = uvNode.add( vec2( float( x ), float( y ) ).mul( this._invSize ) ).toVar();
|
|
429
|
+
const colorNeighbor = max( vec4( 0 ), sampleTexture.sample( uvNeighbor ) ).toVar(); // use max() to avoid propagate garbage values
|
|
430
|
+
|
|
431
|
+
minColor.assign( min( minColor, colorNeighbor ) );
|
|
432
|
+
maxColor.assign( max( maxColor, colorNeighbor ) );
|
|
433
|
+
|
|
434
|
+
const currentDepth = depthTexture.sample( uvNeighbor ).r.toVar();
|
|
435
|
+
|
|
436
|
+
// find the sample position of the closest depth in the neighborhood (used for velocity)
|
|
437
|
+
|
|
438
|
+
If( currentDepth.lessThan( closestDepth ), () => {
|
|
439
|
+
|
|
440
|
+
closestDepth.assign( currentDepth );
|
|
441
|
+
closestDepthPixelPosition.assign( uvNeighbor );
|
|
442
|
+
|
|
443
|
+
} );
|
|
444
|
+
|
|
445
|
+
// find the farthest depth in the neighborhood (used to preserve edge anti-aliasing)
|
|
446
|
+
|
|
447
|
+
If( currentDepth.greaterThan( farthestDepth ), () => {
|
|
448
|
+
|
|
449
|
+
farthestDepth.assign( currentDepth );
|
|
450
|
+
|
|
451
|
+
} );
|
|
452
|
+
|
|
453
|
+
} );
|
|
454
|
+
|
|
455
|
+
} );
|
|
456
|
+
|
|
457
|
+
// sampling/reprojection
|
|
458
|
+
|
|
459
|
+
const offset = velocityTexture.sample( closestDepthPixelPosition ).xy.mul( vec2( 0.5, - 0.5 ) ); // NDC to uv offset
|
|
460
|
+
|
|
461
|
+
const currentColor = sampleTexture.sample( uvNode );
|
|
462
|
+
const historyColor = historyTexture.sample( uvNode.sub( offset ) );
|
|
463
|
+
|
|
464
|
+
// clamping
|
|
465
|
+
|
|
466
|
+
const clampedHistoryColor = clamp( historyColor, minColor, maxColor );
|
|
467
|
+
|
|
468
|
+
// calculate current frame world position
|
|
469
|
+
|
|
470
|
+
const currentDepth = depthTexture.sample( uvNode ).r;
|
|
471
|
+
const currentViewPosition = getViewPosition( uvNode, currentDepth, this._cameraProjectionMatrixInverse );
|
|
472
|
+
const currentWorldPosition = this._cameraWorldMatrix.mul( vec4( currentViewPosition, 1.0 ) ).xyz;
|
|
473
|
+
|
|
474
|
+
// calculate previous frame world position from history UV and previous depth
|
|
475
|
+
|
|
476
|
+
const historyUV = uvNode.sub( offset );
|
|
477
|
+
const previousDepth = this._previousDepthNode.sample( historyUV ).r;
|
|
478
|
+
const previousViewPosition = getViewPosition( historyUV, previousDepth, this._previousCameraProjectionMatrixInverse );
|
|
479
|
+
const previousWorldPosition = this._previousCameraWorldMatrix.mul( vec4( previousViewPosition, 1.0 ) ).xyz;
|
|
480
|
+
|
|
481
|
+
// calculate difference in world positions
|
|
482
|
+
|
|
483
|
+
const worldPositionDifference = length( currentWorldPosition.sub( previousWorldPosition ) ).toVar();
|
|
484
|
+
worldPositionDifference.assign( min( max( worldPositionDifference.sub( 1.0 ), 0.0 ), 1.0 ) );
|
|
485
|
+
|
|
486
|
+
// Adaptive blend weights based on velocity magnitude suggested by CLAUDE in #32133
|
|
487
|
+
// Higher velocity or position difference = more weight on current frame to reduce ghosting
|
|
488
|
+
|
|
489
|
+
const velocityMagnitude = length( offset ).toConst();
|
|
490
|
+
const motionFactor = max( worldPositionDifference.mul( 0.5 ), velocityMagnitude.mul( 10.0 ) ).toVar();
|
|
491
|
+
motionFactor.assign( min( motionFactor, 1.0 ) );
|
|
492
|
+
|
|
493
|
+
const currentWeight = float( 0.05 ).add( motionFactor.mul( 0.25 ) ).toVar();
|
|
494
|
+
const historyWeight = currentWeight.oneMinus().toVar();
|
|
495
|
+
|
|
496
|
+
// zero out history weight if world positions are different (indicating motion) except on edges.
|
|
497
|
+
// note that the constants 0.00001 and 0.5 were suggested by CLAUDE in #32133
|
|
498
|
+
|
|
499
|
+
const isEdge = farthestDepth.sub( closestDepth ).greaterThan( 0.00001 );
|
|
500
|
+
const strongDisocclusion = worldPositionDifference.greaterThan( 0.5 ).and( isEdge.not() );
|
|
501
|
+
|
|
502
|
+
If( strongDisocclusion, () => {
|
|
503
|
+
|
|
504
|
+
currentWeight.assign( 1.0 );
|
|
505
|
+
historyWeight.assign( 0.0 );
|
|
506
|
+
|
|
507
|
+
} );
|
|
508
|
+
|
|
509
|
+
// flicker reduction based on luminance weighing
|
|
510
|
+
|
|
511
|
+
const compressedCurrent = currentColor.mul( float( 1 ).div( ( max( currentColor.r, currentColor.g, currentColor.b ).add( 1.0 ) ) ) );
|
|
512
|
+
const compressedHistory = clampedHistoryColor.mul( float( 1 ).div( ( max( clampedHistoryColor.r, clampedHistoryColor.g, clampedHistoryColor.b ).add( 1.0 ) ) ) );
|
|
513
|
+
|
|
514
|
+
const luminanceCurrent = luminance( compressedCurrent.rgb );
|
|
515
|
+
const luminanceHistory = luminance( compressedHistory.rgb );
|
|
516
|
+
|
|
517
|
+
currentWeight.mulAssign( float( 1.0 ).div( luminanceCurrent.add( 1 ) ) );
|
|
518
|
+
historyWeight.mulAssign( float( 1.0 ).div( luminanceHistory.add( 1 ) ) );
|
|
519
|
+
|
|
520
|
+
const smoothedOutput = add( currentColor.mul( currentWeight ), clampedHistoryColor.mul( historyWeight ) ).div( max( currentWeight.add( historyWeight ), 0.00001 ) ).toVar();
|
|
521
|
+
|
|
522
|
+
return smoothedOutput;
|
|
523
|
+
|
|
524
|
+
} );
|
|
525
|
+
|
|
526
|
+
// materials
|
|
527
|
+
|
|
528
|
+
this._resolveMaterial.colorNode = resolve();
|
|
529
|
+
|
|
530
|
+
return this._textureNode;
|
|
531
|
+
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* Frees internal resources. This method should be called
|
|
536
|
+
* when the effect is no longer required.
|
|
537
|
+
*/
|
|
538
|
+
dispose() {
|
|
539
|
+
|
|
540
|
+
this._historyRenderTarget.dispose();
|
|
541
|
+
this._resolveRenderTarget.dispose();
|
|
542
|
+
|
|
543
|
+
this._resolveMaterial.dispose();
|
|
544
|
+
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
export default TRAANode;
|
|
550
|
+
|
|
551
|
+
// These jitter vectors are specified in integers because it is easier.
|
|
552
|
+
// I am assuming a [-8,8) integer grid, but it needs to be mapped onto [-0.5,0.5)
|
|
553
|
+
// before being used, thus these integers need to be scaled by 1/16.
|
|
554
|
+
//
|
|
555
|
+
// Sample patterns reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476218%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
|
|
556
|
+
const _JitterVectors = [
|
|
557
|
+
[ - 4, - 7 ], [ - 7, - 5 ], [ - 3, - 5 ], [ - 5, - 4 ],
|
|
558
|
+
[ - 1, - 4 ], [ - 2, - 2 ], [ - 6, - 1 ], [ - 4, 0 ],
|
|
559
|
+
[ - 7, 1 ], [ - 1, 2 ], [ - 6, 3 ], [ - 3, 3 ],
|
|
560
|
+
[ - 7, 6 ], [ - 3, 6 ], [ - 5, 7 ], [ - 1, 7 ],
|
|
561
|
+
[ 5, - 7 ], [ 1, - 6 ], [ 6, - 5 ], [ 4, - 4 ],
|
|
562
|
+
[ 2, - 3 ], [ 7, - 2 ], [ 1, - 1 ], [ 4, - 1 ],
|
|
563
|
+
[ 2, 1 ], [ 6, 2 ], [ 0, 4 ], [ 4, 4 ],
|
|
564
|
+
[ 2, 5 ], [ 7, 5 ], [ 5, 6 ], [ 3, 7 ]
|
|
565
|
+
];
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* TSL function for creating a TRAA node for Temporal Reprojection Anti-Aliasing.
|
|
569
|
+
*
|
|
570
|
+
* @tsl
|
|
571
|
+
* @function
|
|
572
|
+
* @param {TextureNode} beautyNode - The texture node that represents the input of the effect.
|
|
573
|
+
* @param {TextureNode} depthNode - A node that represents the scene's depth.
|
|
574
|
+
* @param {TextureNode} velocityNode - A node that represents the scene's velocity.
|
|
575
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
576
|
+
* @returns {TRAANode}
|
|
577
|
+
*/
|
|
578
|
+
export const traa = ( beautyNode, depthNode, velocityNode, camera ) => nodeObject( new TRAANode( convertToTexture( beautyNode ), depthNode, velocityNode, camera ) );
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Fn, vec2, uv, Loop, vec4, premultiplyAlpha, unpremultiplyAlpha, max, int, textureSize, nodeObject, convertToTexture } from 'three/tsl';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Applies a box blur effect to the given texture node.
|
|
5
|
+
*
|
|
6
|
+
* Compared to Gaussian blur, box blur produces a more blocky result but with better performance when correctly
|
|
7
|
+
* configured. It is intended for mobile devices or performance restricted use cases where Gaussian is too heavy.
|
|
8
|
+
*
|
|
9
|
+
* The (kernel) `size` parameter should be small (1, 2 or 3) since it determines the number of samples based on (size * 2 + 1)^2.
|
|
10
|
+
* This implementation uses a single pass approach so the kernel is not applied as a separable filter. That means larger
|
|
11
|
+
* kernels won't perform well. Use Gaussian instead if you need a more high-quality blur.
|
|
12
|
+
*
|
|
13
|
+
* To produce wider blurs, increase the `separation` parameter instead which has no influence on the performance.
|
|
14
|
+
*
|
|
15
|
+
* Reference: {@link https://github.com/lettier/3d-game-shaders-for-beginners/blob/master/demonstration/shaders/fragment/box-blur.frag}.
|
|
16
|
+
*
|
|
17
|
+
* @tsl
|
|
18
|
+
* @function
|
|
19
|
+
* @param {Node<vec4>} textureNode - The texture node that should be blurred.
|
|
20
|
+
* @param {Object} [options={}] - Additional options for the hash blur effect.
|
|
21
|
+
* @param {Node<int>} [options.size=int(1)] - Controls the blur's kernel. For performant results, the range should within [1, 3].
|
|
22
|
+
* @param {Node<int>} [options.separation=int(1)] - Spreads out the blur without having to sample additional fragments. Ranges from [1, Infinity].
|
|
23
|
+
* @param {boolean} [options.premultipliedAlpha=false] - Whether to use premultiplied alpha for the blur effect.
|
|
24
|
+
* @return {Node<vec4>} The blurred texture node.
|
|
25
|
+
*/
|
|
26
|
+
export const boxBlur = /*#__PURE__*/ Fn( ( [ textureNode, options = {} ] ) => {
|
|
27
|
+
|
|
28
|
+
textureNode = convertToTexture( textureNode );
|
|
29
|
+
|
|
30
|
+
const size = nodeObject( options.size ) || int( 1 );
|
|
31
|
+
const separation = nodeObject( options.separation ) || int( 1 );
|
|
32
|
+
const premultipliedAlpha = options.premultipliedAlpha || false;
|
|
33
|
+
|
|
34
|
+
const tap = ( uv ) => {
|
|
35
|
+
|
|
36
|
+
const sample = textureNode.sample( uv );
|
|
37
|
+
|
|
38
|
+
return premultipliedAlpha ? premultiplyAlpha( sample ) : sample;
|
|
39
|
+
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const targetUV = textureNode.uvNode || uv();
|
|
43
|
+
|
|
44
|
+
const result = vec4( 0 );
|
|
45
|
+
const sep = max( separation, 1 );
|
|
46
|
+
const count = int( 0 );
|
|
47
|
+
const pixelStep = vec2( 1 ).div( textureSize( textureNode ) );
|
|
48
|
+
|
|
49
|
+
Loop( { start: size.negate(), end: size, name: 'i', condition: '<=' }, ( { i } ) => {
|
|
50
|
+
|
|
51
|
+
Loop( { start: size.negate(), end: size, name: 'j', condition: '<=' }, ( { j } ) => {
|
|
52
|
+
|
|
53
|
+
const uvs = targetUV.add( vec2( i, j ).mul( pixelStep ).mul( sep ) );
|
|
54
|
+
result.addAssign( tap( uvs ) );
|
|
55
|
+
count.addAssign( 1 );
|
|
56
|
+
|
|
57
|
+
} );
|
|
58
|
+
|
|
59
|
+
} );
|
|
60
|
+
|
|
61
|
+
result.divAssign( count );
|
|
62
|
+
|
|
63
|
+
return premultipliedAlpha ? unpremultiplyAlpha( result ) : result;
|
|
64
|
+
|
|
65
|
+
} );
|