super-three 0.171.0 → 0.172.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 +157 -49
- package/build/three.core.js +104 -42
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +53 -8
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +10 -5
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +21191 -1008
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +21189 -1008
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +0 -5
- package/examples/jsm/animation/CCDIKSolver.js +3 -2
- package/examples/jsm/controls/ArcballControls.js +28 -19
- package/examples/jsm/controls/OrbitControls.js +5 -4
- package/examples/jsm/csm/CSMShadowNode.js +16 -11
- package/examples/jsm/curves/NURBSCurve.js +1 -1
- package/examples/jsm/curves/NURBSUtils.js +3 -0
- package/examples/jsm/effects/OutlineEffect.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +11 -7
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/PLYExporter.js +2 -2
- package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
- package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
- package/examples/jsm/lights/LightProbeGenerator.js +3 -3
- package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
- package/examples/jsm/loaders/3MFLoader.js +6 -3
- package/examples/jsm/loaders/BVHLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +5 -5
- package/examples/jsm/loaders/DDSLoader.js +42 -0
- package/examples/jsm/loaders/GCodeLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +22 -2
- package/examples/jsm/loaders/KTX2Loader.js +6 -1
- package/examples/jsm/loaders/KTXLoader.js +4 -4
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LottieLoader.js +1 -1
- package/examples/jsm/loaders/MTLLoader.js +1 -0
- package/examples/jsm/loaders/NRRDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +7 -7
- package/examples/jsm/loaders/PVRLoader.js +1 -1
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TDSLoader.js +1 -1
- package/examples/jsm/loaders/VRMLLoader.js +7 -7
- package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
- package/examples/jsm/math/ConvexHull.js +1 -1
- package/examples/jsm/math/OBB.js +17 -0
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +10 -10
- package/examples/jsm/misc/Volume.js +20 -12
- package/examples/jsm/misc/VolumeSlice.js +2 -2
- package/examples/jsm/modifiers/CurveModifier.js +10 -8
- package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
- package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
- package/examples/jsm/objects/GroundedSkybox.js +4 -4
- package/examples/jsm/objects/Sky.js +2 -2
- package/examples/jsm/objects/SkyMesh.js +3 -3
- package/examples/jsm/objects/Water2.js +1 -1
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/objects/WaterMesh.js +4 -4
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/EffectComposer.js +1 -2
- package/examples/jsm/postprocessing/OutlinePass.js +4 -4
- package/examples/jsm/postprocessing/SAOPass.js +1 -2
- package/examples/jsm/postprocessing/SMAAPass.js +1 -3
- package/examples/jsm/postprocessing/SSAOPass.js +2 -4
- package/examples/jsm/postprocessing/SSRPass.js +2 -4
- package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
- package/examples/jsm/renderers/SVGRenderer.js +6 -4
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/GodRaysShader.js +3 -3
- package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
- package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
- package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
- package/examples/jsm/tsl/display/BleachBypass.js +10 -0
- package/examples/jsm/tsl/display/BloomNode.js +233 -26
- package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
- package/examples/jsm/tsl/display/FXAANode.js +52 -3
- package/examples/jsm/tsl/display/FilmNode.js +47 -1
- package/examples/jsm/tsl/display/GTAONode.js +210 -14
- package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
- package/examples/jsm/tsl/display/LensflareNode.js +131 -13
- package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
- package/examples/jsm/tsl/display/MotionBlur.js +12 -2
- package/examples/jsm/tsl/display/OutlineNode.js +343 -26
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
- package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
- package/examples/jsm/tsl/display/SMAANode.js +187 -46
- package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
- package/examples/jsm/tsl/display/SSRNode.js +194 -21
- package/examples/jsm/tsl/display/Sepia.js +9 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
- package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
- package/examples/jsm/tsl/display/TransitionNode.js +71 -6
- package/examples/jsm/tsl/display/hashBlur.js +14 -3
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/CameraUtils.js +4 -1
- package/examples/jsm/utils/GeometryUtils.js +22 -19
- package/examples/jsm/utils/SceneUtils.js +2 -2
- package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
- package/examples/jsm/webxr/XREstimatedLight.js +1 -1
- package/package.json +8 -3
- package/src/Three.Core.js +2 -0
- package/src/Three.Legacy.js +0 -21
- package/src/Three.TSL.js +9 -4
- package/src/Three.WebGPU.Nodes.js +2 -2
- package/src/Three.WebGPU.js +2 -2
- package/src/animation/PropertyBinding.js +2 -2
- package/src/cameras/PerspectiveCamera.js +18 -2
- package/src/constants.js +1 -1
- package/src/core/RenderTarget.js +18 -0
- package/src/core/RenderTarget3D.js +22 -0
- package/src/core/RenderTargetArray.js +22 -0
- package/src/extras/Earcut.js +1 -1
- package/src/extras/PMREMGenerator.js +20 -0
- package/src/extras/TextureUtils.js +6 -0
- package/src/helpers/CameraHelper.js +16 -13
- package/src/loaders/nodes/NodeLoader.js +59 -0
- package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
- package/src/loaders/nodes/NodeObjectLoader.js +61 -0
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +72 -19
- package/src/materials/nodes/Line2NodeMaterial.js +128 -34
- package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
- package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
- package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
- package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
- package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
- package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
- package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
- package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
- package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
- package/src/materials/nodes/NodeMaterial.js +474 -21
- package/src/materials/nodes/PointsNodeMaterial.js +22 -13
- package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
- package/src/materials/nodes/SpriteNodeMaterial.js +77 -19
- package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
- package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -0
- package/src/nodes/Nodes.js +1 -6
- package/src/nodes/TSL.js +2 -3
- package/src/nodes/accessors/AccessorsUtils.js +27 -0
- package/src/nodes/accessors/Arrays.js +24 -5
- package/src/nodes/accessors/BatchNode.js +39 -3
- package/src/nodes/accessors/Bitangent.js +37 -0
- package/src/nodes/accessors/BufferAttributeNode.js +178 -5
- package/src/nodes/accessors/BufferNode.js +63 -0
- package/src/nodes/accessors/BuiltinNode.js +38 -0
- package/src/nodes/accessors/Camera.js +49 -0
- package/src/nodes/accessors/ClippingNode.js +71 -2
- package/src/nodes/accessors/CubeTextureNode.js +64 -0
- package/src/nodes/accessors/InstanceNode.js +85 -2
- package/src/nodes/accessors/InstancedMeshNode.js +28 -3
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +13 -0
- package/src/nodes/accessors/Lights.js +50 -1
- package/src/nodes/accessors/MaterialNode.js +302 -8
- package/src/nodes/accessors/MaterialProperties.js +7 -0
- package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
- package/src/nodes/accessors/ModelNode.js +100 -5
- package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
- package/src/nodes/accessors/MorphNode.js +48 -4
- package/src/nodes/accessors/Normal.js +59 -3
- package/src/nodes/accessors/Object3DNode.js +102 -1
- package/src/nodes/accessors/PointUVNode.js +26 -0
- package/src/nodes/accessors/Position.js +53 -4
- package/src/nodes/accessors/ReferenceBaseNode.js +188 -0
- package/src/nodes/accessors/ReferenceNode.js +202 -2
- package/src/nodes/accessors/ReflectVector.js +24 -0
- package/src/nodes/accessors/RendererReferenceNode.js +46 -1
- package/src/nodes/accessors/SceneNode.js +54 -0
- package/src/nodes/accessors/SkinningNode.js +127 -1
- package/src/nodes/accessors/StorageBufferNode.js +168 -4
- package/src/nodes/accessors/StorageTextureNode.js +118 -0
- package/src/nodes/accessors/Tangent.js +36 -0
- package/src/nodes/accessors/Texture3DNode.js +89 -5
- package/src/nodes/accessors/TextureBicubic.js +12 -2
- package/src/nodes/accessors/TextureNode.js +309 -10
- package/src/nodes/accessors/TextureSizeNode.js +42 -0
- package/src/nodes/accessors/UV.js +10 -1
- package/src/nodes/accessors/UniformArrayNode.js +223 -23
- package/src/nodes/accessors/UserDataNode.js +46 -0
- package/src/nodes/accessors/VelocityNode.js +82 -0
- package/src/nodes/accessors/VertexColorNode.js +39 -2
- package/src/nodes/code/CodeNode.js +95 -1
- package/src/nodes/code/ExpressionNode.js +28 -0
- package/src/nodes/code/FunctionCallNode.js +37 -0
- package/src/nodes/code/FunctionNode.js +45 -0
- package/src/nodes/code/ScriptableNode.js +223 -1
- package/src/nodes/code/ScriptableValueNode.js +85 -1
- package/src/nodes/core/AssignNode.js +48 -2
- package/src/nodes/core/AttributeNode.js +43 -0
- package/src/nodes/core/BypassNode.js +47 -2
- package/src/nodes/core/CacheNode.js +53 -2
- package/src/nodes/core/ConstNode.js +24 -0
- package/src/nodes/core/ContextNode.js +65 -0
- package/src/nodes/core/IndexNode.js +68 -7
- package/src/nodes/core/InputNode.js +48 -0
- package/src/nodes/core/LightingModel.js +60 -0
- package/src/nodes/core/MRTNode.js +66 -0
- package/src/nodes/core/Node.js +337 -12
- package/src/nodes/core/NodeAttribute.js +38 -0
- package/src/nodes/core/NodeBuilder.js +945 -15
- package/src/nodes/core/NodeCache.js +41 -2
- package/src/nodes/core/NodeCode.js +31 -0
- package/src/nodes/core/NodeFrame.js +123 -2
- package/src/nodes/core/NodeFunction.js +46 -0
- package/src/nodes/core/NodeFunctionInput.js +44 -0
- package/src/nodes/core/NodeParser.js +11 -0
- package/src/nodes/core/NodeUniform.js +52 -0
- package/src/nodes/core/NodeUtils.js +141 -0
- package/src/nodes/core/NodeVar.js +30 -0
- package/src/nodes/core/NodeVarying.js +28 -0
- package/src/nodes/core/OutputStructNode.js +33 -2
- package/src/nodes/core/ParameterNode.js +28 -0
- package/src/nodes/core/PropertyNode.js +232 -0
- package/src/nodes/core/StackNode.js +78 -0
- package/src/nodes/core/StructTypeNode.js +39 -1
- package/src/nodes/core/TempNode.js +30 -4
- package/src/nodes/core/UniformGroupNode.js +82 -7
- package/src/nodes/core/UniformNode.js +66 -0
- package/src/nodes/core/VarNode.js +52 -0
- package/src/nodes/core/VaryingNode.js +83 -2
- package/src/nodes/core/constants.js +36 -0
- package/src/nodes/display/BumpMapNode.js +37 -0
- package/src/nodes/display/ColorAdjustment.js +53 -11
- package/src/nodes/display/ColorSpaceFunctions.js +16 -0
- package/src/nodes/display/ColorSpaceNode.js +82 -0
- package/src/nodes/display/FrontFacingNode.js +29 -0
- package/src/nodes/display/NormalMapNode.js +43 -0
- package/src/nodes/display/PassNode.js +298 -7
- package/src/nodes/display/PosterizeNode.js +33 -0
- package/src/nodes/display/RenderOutputNode.js +66 -1
- package/src/nodes/display/ScreenNode.js +87 -0
- package/src/nodes/display/ToneMappingFunctions.js +58 -10
- package/src/nodes/display/ToneMappingNode.js +55 -2
- package/src/nodes/display/ToonOutlinePassNode.js +73 -0
- package/src/nodes/display/ViewportDepthNode.js +122 -8
- package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
- package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
- package/src/nodes/display/ViewportTextureNode.js +57 -0
- package/src/nodes/fog/Fog.js +93 -0
- package/src/nodes/functions/BasicLightingModel.js +24 -0
- package/src/nodes/functions/PhongLightingModel.js +34 -2
- package/src/nodes/functions/PhysicalLightingModel.js +167 -8
- package/src/nodes/functions/ShadowMaskModel.js +23 -0
- package/src/nodes/functions/ToonLightingModel.js +20 -0
- package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
- package/src/nodes/geometry/RangeNode.js +54 -2
- package/src/nodes/gpgpu/AtomicFunctionNode.js +157 -1
- package/src/nodes/gpgpu/BarrierNode.js +47 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +126 -0
- package/src/nodes/gpgpu/ComputeNode.js +106 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
- package/src/nodes/lighting/AONode.js +18 -0
- package/src/nodes/lighting/AmbientLightNode.js +10 -0
- package/src/nodes/lighting/AnalyticLightNode.js +97 -2
- package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
- package/src/nodes/lighting/BasicLightMapNode.js +17 -0
- package/src/nodes/lighting/DirectionalLightNode.js +10 -0
- package/src/nodes/lighting/EnvironmentNode.js +18 -0
- package/src/nodes/lighting/HemisphereLightNode.js +31 -0
- package/src/nodes/lighting/IESSpotLightNode.js +11 -0
- package/src/nodes/lighting/IrradianceNode.js +17 -0
- package/src/nodes/lighting/LightProbeNode.js +20 -0
- package/src/nodes/lighting/LightUtils.js +12 -0
- package/src/nodes/lighting/LightingContextNode.js +48 -0
- package/src/nodes/lighting/LightingNode.js +15 -6
- package/src/nodes/lighting/LightsNode.js +132 -1
- package/src/nodes/lighting/PointLightNode.js +32 -1
- package/src/nodes/lighting/PointShadowNode.js +54 -1
- package/src/nodes/lighting/RectAreaLightNode.js +44 -6
- package/src/nodes/lighting/ShadowBaseNode.js +93 -0
- package/src/nodes/lighting/ShadowNode.js +240 -34
- package/src/nodes/lighting/SpotLightNode.js +43 -0
- package/src/nodes/math/ConditionalNode.js +70 -3
- package/src/nodes/math/Hash.js +9 -0
- package/src/nodes/math/MathNode.js +614 -11
- package/src/nodes/math/MathUtils.js +45 -1
- package/src/nodes/math/OperatorNode.js +233 -0
- package/src/nodes/math/TriNoise3D.js +18 -7
- package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
- package/src/nodes/parsers/GLSLNodeParser.js +11 -0
- package/src/nodes/pmrem/PMREMNode.js +133 -0
- package/src/nodes/pmrem/PMREMUtils.js +1 -1
- package/src/nodes/procedural/Checker.js +9 -0
- package/src/nodes/tsl/TSLBase.js +2 -2
- package/src/nodes/utils/ArrayElementNode.js +38 -2
- package/src/nodes/utils/ConvertNode.js +31 -0
- package/src/nodes/utils/CubeMapNode.js +78 -0
- package/src/nodes/utils/Discard.js +16 -0
- package/src/nodes/utils/EquirectUVNode.js +31 -1
- package/src/nodes/utils/FlipNode.js +38 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
- package/src/nodes/utils/JoinNode.js +25 -0
- package/src/nodes/utils/LoopNode.js +74 -1
- package/src/nodes/utils/MatcapUVNode.js +17 -0
- package/src/nodes/utils/MaxMipLevelNode.js +49 -0
- package/src/nodes/utils/Oscillators.js +33 -0
- package/src/nodes/utils/Packing.js +17 -0
- package/src/nodes/utils/PostProcessingUtils.js +28 -23
- package/src/nodes/utils/RTTNode.js +123 -2
- package/src/nodes/utils/ReflectorNode.js +174 -4
- package/src/nodes/utils/RemapNode.js +79 -0
- package/src/nodes/utils/RotateNode.js +41 -0
- package/src/nodes/utils/SetNode.js +44 -1
- package/src/nodes/utils/SplitNode.js +55 -3
- package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
- package/src/nodes/utils/SpriteUtils.js +17 -0
- package/src/nodes/utils/StorageArrayElementNode.js +40 -0
- package/src/nodes/utils/Timer.js +19 -0
- package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
- package/src/nodes/utils/UVUtils.js +20 -0
- package/src/nodes/utils/ViewportUtils.js +13 -0
- package/src/objects/BatchedMesh.js +1 -2
- package/src/objects/ClippingGroup.js +49 -0
- package/src/renderers/WebGLRenderer.js +23 -4
- package/src/renderers/common/Animation.js +63 -0
- package/src/renderers/common/Attributes.js +36 -0
- package/src/renderers/common/Backend.js +467 -52
- package/src/renderers/common/Background.js +34 -1
- package/src/renderers/common/BindGroup.js +43 -0
- package/src/renderers/common/Binding.js +35 -0
- package/src/renderers/common/Bindings.js +93 -1
- package/src/renderers/common/Buffer.js +49 -0
- package/src/renderers/common/BufferUtils.js +27 -0
- package/src/renderers/common/BundleGroup.js +57 -0
- package/src/renderers/common/ChainMap.js +38 -1
- package/src/renderers/common/ClippingContext.js +107 -14
- package/src/renderers/common/Color4.js +36 -0
- package/src/renderers/common/ComputePipeline.js +24 -0
- package/src/renderers/common/CubeRenderTarget.js +13 -0
- package/src/renderers/common/DataMap.js +37 -1
- package/src/renderers/common/Geometries.js +98 -0
- package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
- package/src/renderers/common/Info.js +87 -0
- package/src/renderers/common/Lighting.js +26 -0
- package/src/renderers/common/Pipeline.js +22 -0
- package/src/renderers/common/Pipelines.js +148 -5
- package/src/renderers/common/PostProcessing.js +75 -3
- package/src/renderers/common/ProgrammableStage.js +60 -2
- package/src/renderers/common/QuadMesh.js +54 -5
- package/src/renderers/common/RenderBundle.js +14 -8
- package/src/renderers/common/RenderBundles.js +33 -10
- package/src/renderers/common/RenderContext.js +169 -4
- package/src/renderers/common/RenderContexts.js +42 -2
- package/src/renderers/common/RenderList.js +178 -0
- package/src/renderers/common/RenderLists.js +31 -0
- package/src/renderers/common/RenderObject.js +328 -4
- package/src/renderers/common/RenderObjects.js +101 -7
- package/src/renderers/common/RenderPipeline.js +24 -0
- package/src/renderers/common/Renderer.js +1096 -31
- package/src/renderers/common/RendererUtils.js +193 -0
- package/src/renderers/common/SampledTexture.js +121 -0
- package/src/renderers/common/Sampler.js +30 -0
- package/src/renderers/common/StorageBuffer.js +24 -0
- package/src/renderers/common/StorageBufferAttribute.js +31 -2
- package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
- package/src/renderers/common/StorageTexture.js +38 -0
- package/src/renderers/common/Textures.js +83 -0
- package/src/renderers/common/Uniform.js +188 -2
- package/src/renderers/common/UniformBuffer.js +19 -0
- package/src/renderers/common/UniformsGroup.js +139 -2
- package/src/renderers/common/extras/PMREMGenerator.js +24 -3
- package/src/renderers/common/nodes/NodeBuilderState.js +95 -1
- package/src/renderers/common/nodes/NodeLibrary.js +89 -0
- package/src/renderers/common/nodes/NodeSampledTexture.js +91 -2
- package/src/renderers/common/nodes/NodeSampler.js +28 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
- package/src/renderers/common/nodes/NodeUniform.js +189 -0
- package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
- package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
- package/src/renderers/common/nodes/Nodes.js +327 -60
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +547 -29
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +0 -1
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +1 -1
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +1 -1
- package/src/renderers/webgpu/WebGPUBackend.js +480 -49
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +34 -0
- package/src/renderers/webgpu/WebGPURenderer.js +35 -0
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +59 -11
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
- package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +10 -8
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +9 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +5 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +30 -0
- package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
- package/src/renderers/webxr/WebXRManager.js +7 -1
- package/src/textures/Data3DTexture.js +2 -2
- package/src/textures/Texture.js +4 -0
- package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
- package/examples/jsm/animation/MMDPhysics.js +0 -1408
- package/examples/jsm/exporters/MMDExporter.js +0 -223
- package/examples/jsm/libs/mmdparser.module.js +0 -11530
- package/examples/jsm/loaders/MMDLoader.js +0 -2298
- package/examples/jsm/shaders/MMDToonShader.js +0 -134
- package/src/nodes/core/UniformGroup.js +0 -13
- package/src/nodes/fog/FogExp2Node.js +0 -35
- package/src/nodes/fog/FogNode.js +0 -50
- package/src/nodes/fog/FogRangeNode.js +0 -36
- package/src/renderers/common/PostProcessingUtils.js +0 -86
|
@@ -1,14 +1,36 @@
|
|
|
1
|
-
import { DataTexture, RenderTarget, RepeatWrapping, Vector2, Vector3, TempNode, QuadMesh, NodeMaterial,
|
|
1
|
+
import { DataTexture, RenderTarget, RepeatWrapping, Vector2, Vector3, TempNode, QuadMesh, NodeMaterial, RendererUtils } from 'three/webgpu';
|
|
2
2
|
import { reference, logarithmicDepthToViewZ, viewZToPerspectiveDepth, getNormalFromDepth, getScreenPosition, getViewPosition, nodeObject, Fn, float, NodeUpdateType, uv, uniform, Loop, vec2, vec3, vec4, int, dot, max, pow, abs, If, textureSize, sin, cos, PI, texture, passTexture, mat3, add, normalize, mul, cross, div, mix, sqrt, sub, acos, clamp } from 'three/tsl';
|
|
3
3
|
|
|
4
|
+
/** @module GTAONode **/
|
|
5
|
+
|
|
4
6
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
7
|
const _size = /*@__PURE__*/ new Vector2();
|
|
6
8
|
|
|
7
9
|
let _rendererState;
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
+
* Post processing node for applying Ground Truth Ambient Occlusion (GTAO) to a scene.
|
|
13
|
+
* ```js
|
|
14
|
+
* const postProcessing = new THREE.PostProcessing( renderer );
|
|
15
|
+
*
|
|
16
|
+
* const scenePass = pass( scene, camera );
|
|
17
|
+
* scenePass.setMRT( mrt( {
|
|
18
|
+
* output: output,
|
|
19
|
+
* normal: normalView
|
|
20
|
+
* } ) );
|
|
21
|
+
*
|
|
22
|
+
* const scenePassColor = scenePass.getTextureNode( 'output' );
|
|
23
|
+
* const scenePassNormal = scenePass.getTextureNode( 'normal' );
|
|
24
|
+
* const scenePassDepth = scenePass.getTextureNode( 'depth' );
|
|
25
|
+
*
|
|
26
|
+
* const aoPass = ao( scenePassDepth, scenePassNormal, camera );
|
|
27
|
+
*
|
|
28
|
+
* postProcessing.outputNod = aoPass.getTextureNode().mul( scenePassColor );
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* Reference: {@link https://www.activision.com/cdn/research/Practical_Real_Time_Strategies_for_Accurate_Indirect_Occlusion_NEW%20VERSION_COLOR.pdf}.
|
|
32
|
+
*
|
|
33
|
+
* @augments TempNode
|
|
12
34
|
*/
|
|
13
35
|
class GTAONode extends TempNode {
|
|
14
36
|
|
|
@@ -18,55 +40,193 @@ class GTAONode extends TempNode {
|
|
|
18
40
|
|
|
19
41
|
}
|
|
20
42
|
|
|
43
|
+
/**
|
|
44
|
+
* Constructs a new GTAO node.
|
|
45
|
+
*
|
|
46
|
+
* @param {Node<float>} depthNode - A node that represents the scene's depth.
|
|
47
|
+
* @param {Node<vec3>?} normalNode - A node that represents the scene's normals.
|
|
48
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
49
|
+
*/
|
|
21
50
|
constructor( depthNode, normalNode, camera ) {
|
|
22
51
|
|
|
23
52
|
super( 'vec4' );
|
|
24
53
|
|
|
54
|
+
/**
|
|
55
|
+
* A node that represents the scene's depth.
|
|
56
|
+
*
|
|
57
|
+
* @type {Node<float>}
|
|
58
|
+
*/
|
|
25
59
|
this.depthNode = depthNode;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A node that represents the scene's normals. If no normals are passed to the
|
|
63
|
+
* constructor (because MRT is not available), normals can be automatically
|
|
64
|
+
* reconstructed from depth values in the shader.
|
|
65
|
+
*
|
|
66
|
+
* @type {Node<vec3>?}
|
|
67
|
+
*/
|
|
26
68
|
this.normalNode = normalNode;
|
|
27
69
|
|
|
70
|
+
/**
|
|
71
|
+
* The resolution scale. By default the effect is rendered in full resolution
|
|
72
|
+
* for best quality but a value of `0.5` should be sufficient for most scenes.
|
|
73
|
+
*
|
|
74
|
+
* @type {Number}
|
|
75
|
+
* @default 1
|
|
76
|
+
*/
|
|
28
77
|
this.resolutionScale = 1;
|
|
29
78
|
|
|
79
|
+
/**
|
|
80
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
81
|
+
* its effect once per frame in `updateBefore()`.
|
|
82
|
+
*
|
|
83
|
+
* @type {String}
|
|
84
|
+
* @default 'frame'
|
|
85
|
+
*/
|
|
30
86
|
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
31
87
|
|
|
32
|
-
|
|
33
|
-
|
|
88
|
+
/**
|
|
89
|
+
* The render target the ambient occlusion is rendered into.
|
|
90
|
+
*
|
|
91
|
+
* @private
|
|
92
|
+
* @type {RenderTarget}
|
|
93
|
+
*/
|
|
34
94
|
this._aoRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
35
95
|
this._aoRenderTarget.texture.name = 'GTAONode.AO';
|
|
36
96
|
|
|
37
97
|
// uniforms
|
|
38
98
|
|
|
99
|
+
/**
|
|
100
|
+
* The radius of the ambient occlusion.
|
|
101
|
+
*
|
|
102
|
+
* @type {UniformNode<float>}
|
|
103
|
+
*/
|
|
39
104
|
this.radius = uniform( 0.25 );
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The resolution of the effect. Can be scaled via
|
|
108
|
+
* `resolutionScale`.
|
|
109
|
+
*
|
|
110
|
+
* @type {UniformNode<vec2>}
|
|
111
|
+
*/
|
|
40
112
|
this.resolution = uniform( new Vector2() );
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The thickness of the ambient occlusion.
|
|
116
|
+
*
|
|
117
|
+
* @type {UniformNode<float>}
|
|
118
|
+
*/
|
|
41
119
|
this.thickness = uniform( 1 );
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Another option to tweak the occlusion. The recommended range is
|
|
123
|
+
* `[1,2]` for attenuating the AO.
|
|
124
|
+
*
|
|
125
|
+
* @type {UniformNode<float>}
|
|
126
|
+
*/
|
|
42
127
|
this.distanceExponent = uniform( 1 );
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The distance fall off value of the ambient occlusion.
|
|
131
|
+
* A lower value leads to a larger AO effect. The value
|
|
132
|
+
* should lie in the range `[0,1]`.
|
|
133
|
+
*
|
|
134
|
+
* @type {UniformNode<float>}
|
|
135
|
+
*/
|
|
43
136
|
this.distanceFallOff = uniform( 1 );
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* The scale of the ambient occlusion.
|
|
140
|
+
*
|
|
141
|
+
* @type {UniformNode<float>}
|
|
142
|
+
*/
|
|
44
143
|
this.scale = uniform( 1 );
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* How many samples are used to compute the AO.
|
|
147
|
+
* A higher value results in better quality but also
|
|
148
|
+
* in a more expensive runtime behavior.
|
|
149
|
+
*
|
|
150
|
+
* @type {UniformNode<float>}
|
|
151
|
+
*/
|
|
45
152
|
this.samples = uniform( 16 );
|
|
46
153
|
|
|
154
|
+
/**
|
|
155
|
+
* The node represents the internal noise texture used by the AO.
|
|
156
|
+
*
|
|
157
|
+
* @private
|
|
158
|
+
* @type {TextureNode}
|
|
159
|
+
*/
|
|
47
160
|
this._noiseNode = texture( generateMagicSquareNoise() );
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Represents the projection matrix of the scene's camera.
|
|
164
|
+
*
|
|
165
|
+
* @private
|
|
166
|
+
* @type {UniformNode<mat4>}
|
|
167
|
+
*/
|
|
48
168
|
this._cameraProjectionMatrix = uniform( camera.projectionMatrix );
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Represents the inverse projection matrix of the scene's camera.
|
|
172
|
+
*
|
|
173
|
+
* @private
|
|
174
|
+
* @type {UniformNode<mat4>}
|
|
175
|
+
*/
|
|
49
176
|
this._cameraProjectionMatrixInverse = uniform( camera.projectionMatrixInverse );
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Represents the near value of the scene's camera.
|
|
180
|
+
*
|
|
181
|
+
* @private
|
|
182
|
+
* @type {ReferenceNode<float>}
|
|
183
|
+
*/
|
|
50
184
|
this._cameraNear = reference( 'near', 'float', camera );
|
|
51
|
-
this._cameraFar = reference( 'far', 'float', camera );
|
|
52
185
|
|
|
53
|
-
|
|
186
|
+
/**
|
|
187
|
+
* Represents the far value of the scene's camera.
|
|
188
|
+
*
|
|
189
|
+
* @private
|
|
190
|
+
* @type {ReferenceNode<float>}
|
|
191
|
+
*/
|
|
192
|
+
this._cameraFar = reference( 'far', 'float', camera );
|
|
54
193
|
|
|
194
|
+
/**
|
|
195
|
+
* The material that is used to render the effect.
|
|
196
|
+
*
|
|
197
|
+
* @private
|
|
198
|
+
* @type {NodeMaterial}
|
|
199
|
+
*/
|
|
55
200
|
this._material = new NodeMaterial();
|
|
56
201
|
this._material.name = 'GTAO';
|
|
57
202
|
|
|
58
|
-
|
|
59
|
-
|
|
203
|
+
/**
|
|
204
|
+
* The result of the effect is represented as a separate texture node.
|
|
205
|
+
*
|
|
206
|
+
* @private
|
|
207
|
+
* @type {PassTextureNode}
|
|
208
|
+
*/
|
|
60
209
|
this._textureNode = passTexture( this, this._aoRenderTarget.texture );
|
|
61
210
|
|
|
62
211
|
}
|
|
63
212
|
|
|
213
|
+
/**
|
|
214
|
+
* Returns the result of the effect as a texture node.
|
|
215
|
+
*
|
|
216
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
217
|
+
*/
|
|
64
218
|
getTextureNode() {
|
|
65
219
|
|
|
66
220
|
return this._textureNode;
|
|
67
221
|
|
|
68
222
|
}
|
|
69
223
|
|
|
224
|
+
/**
|
|
225
|
+
* Sets the size of the effect.
|
|
226
|
+
*
|
|
227
|
+
* @param {Number} width - The width of the effect.
|
|
228
|
+
* @param {Number} height - The height of the effect.
|
|
229
|
+
*/
|
|
70
230
|
setSize( width, height ) {
|
|
71
231
|
|
|
72
232
|
width = Math.round( this.resolutionScale * width );
|
|
@@ -77,11 +237,16 @@ class GTAONode extends TempNode {
|
|
|
77
237
|
|
|
78
238
|
}
|
|
79
239
|
|
|
240
|
+
/**
|
|
241
|
+
* This method is used to render the effect once per frame.
|
|
242
|
+
*
|
|
243
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
244
|
+
*/
|
|
80
245
|
updateBefore( frame ) {
|
|
81
246
|
|
|
82
247
|
const { renderer } = frame;
|
|
83
248
|
|
|
84
|
-
_rendererState =
|
|
249
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
85
250
|
|
|
86
251
|
//
|
|
87
252
|
|
|
@@ -101,17 +266,23 @@ class GTAONode extends TempNode {
|
|
|
101
266
|
|
|
102
267
|
// restore
|
|
103
268
|
|
|
104
|
-
|
|
269
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
105
270
|
|
|
106
271
|
}
|
|
107
272
|
|
|
273
|
+
/**
|
|
274
|
+
* This method is used to setup the effect's TSL code.
|
|
275
|
+
*
|
|
276
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
277
|
+
* @return {PassTextureNode}
|
|
278
|
+
*/
|
|
108
279
|
setup( builder ) {
|
|
109
280
|
|
|
110
281
|
const uvNode = uv();
|
|
111
282
|
|
|
112
283
|
const sampleDepth = ( uv ) => {
|
|
113
284
|
|
|
114
|
-
const depth = this.depthNode.
|
|
285
|
+
const depth = this.depthNode.sample( uv ).r;
|
|
115
286
|
|
|
116
287
|
if ( builder.renderer.logarithmicDepthBuffer === true ) {
|
|
117
288
|
|
|
@@ -125,8 +296,8 @@ class GTAONode extends TempNode {
|
|
|
125
296
|
|
|
126
297
|
};
|
|
127
298
|
|
|
128
|
-
const sampleNoise = ( uv ) => this._noiseNode.
|
|
129
|
-
const sampleNormal = ( uv ) => ( this.normalNode !== null ) ? this.normalNode.
|
|
299
|
+
const sampleNoise = ( uv ) => this._noiseNode.sample( uv );
|
|
300
|
+
const sampleNormal = ( uv ) => ( this.normalNode !== null ) ? this.normalNode.sample( uv ).rgb.normalize() : getNormalFromDepth( uv, this.depthNode.value, this._cameraProjectionMatrixInverse );
|
|
130
301
|
|
|
131
302
|
const ao = Fn( () => {
|
|
132
303
|
|
|
@@ -227,6 +398,10 @@ class GTAONode extends TempNode {
|
|
|
227
398
|
|
|
228
399
|
}
|
|
229
400
|
|
|
401
|
+
/**
|
|
402
|
+
* Frees internal resources. This method should be called
|
|
403
|
+
* when the effect is no longer required.
|
|
404
|
+
*/
|
|
230
405
|
dispose() {
|
|
231
406
|
|
|
232
407
|
this._aoRenderTarget.dispose();
|
|
@@ -239,6 +414,12 @@ class GTAONode extends TempNode {
|
|
|
239
414
|
|
|
240
415
|
export default GTAONode;
|
|
241
416
|
|
|
417
|
+
/**
|
|
418
|
+
* Generates the AO's noise texture for the given size.
|
|
419
|
+
*
|
|
420
|
+
* @param {Number} [size=5] - The noise size.
|
|
421
|
+
* @return {DataTexture} The generated noise texture.
|
|
422
|
+
*/
|
|
242
423
|
function generateMagicSquareNoise( size = 5 ) {
|
|
243
424
|
|
|
244
425
|
const noiseSize = Math.floor( size ) % 2 === 0 ? Math.floor( size ) + 1 : Math.floor( size );
|
|
@@ -271,6 +452,12 @@ function generateMagicSquareNoise( size = 5 ) {
|
|
|
271
452
|
|
|
272
453
|
}
|
|
273
454
|
|
|
455
|
+
/**
|
|
456
|
+
* Computes an array of magic square values required to generate the noise texture.
|
|
457
|
+
*
|
|
458
|
+
* @param {Number} size - The noise size.
|
|
459
|
+
* @return {Array<Number>} The magic square values.
|
|
460
|
+
*/
|
|
274
461
|
function generateMagicSquare( size ) {
|
|
275
462
|
|
|
276
463
|
const noiseSize = Math.floor( size ) % 2 === 0 ? Math.floor( size ) + 1 : Math.floor( size );
|
|
@@ -323,4 +510,13 @@ function generateMagicSquare( size ) {
|
|
|
323
510
|
|
|
324
511
|
}
|
|
325
512
|
|
|
513
|
+
/**
|
|
514
|
+
* TSL function for creating a Ground Truth Ambient Occlusion (GTAO) effect.
|
|
515
|
+
*
|
|
516
|
+
* @function
|
|
517
|
+
* @param {Node<float>} depthNode - A node that represents the scene's depth.
|
|
518
|
+
* @param {Node<vec3>?} normalNode - A node that represents the scene's normals.
|
|
519
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
520
|
+
* @returns {GTAONode}
|
|
521
|
+
*/
|
|
326
522
|
export const ao = ( depthNode, normalNode, camera ) => nodeObject( new GTAONode( nodeObject( depthNode ), nodeObject( normalNode ), camera ) );
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { RenderTarget, Vector2, NodeMaterial,
|
|
1
|
+
import { RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, TempNode, NodeUpdateType } from 'three/webgpu';
|
|
2
2
|
import { nodeObject, Fn, If, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, mul } from 'three/tsl';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
// alternates between source textures and triggers creation of new BindGroups and BindGroupLayouts every frame.
|
|
4
|
+
/** @module GaussianBlurNode **/
|
|
6
5
|
|
|
7
6
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
8
7
|
|
|
@@ -34,6 +33,11 @@ const unpremult = /*@__PURE__*/ Fn( ( [ color ] ) => {
|
|
|
34
33
|
]
|
|
35
34
|
} );
|
|
36
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Post processing node for creating a gaussian blur effect.
|
|
38
|
+
*
|
|
39
|
+
* @augments TempNode
|
|
40
|
+
*/
|
|
37
41
|
class GaussianBlurNode extends TempNode {
|
|
38
42
|
|
|
39
43
|
static get type() {
|
|
@@ -42,33 +46,116 @@ class GaussianBlurNode extends TempNode {
|
|
|
42
46
|
|
|
43
47
|
}
|
|
44
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Constructs a new gaussian blur node.
|
|
51
|
+
*
|
|
52
|
+
* @param {TextureNode} textureNode - The texture node that represents the input of the effect.
|
|
53
|
+
* @param {Node<vec2|float>} directionNode - Defines the direction and radius of the blur.
|
|
54
|
+
* @param {Number} sigma - Controls the kernel of the blur filter. Higher values mean a wider blur radius.
|
|
55
|
+
*/
|
|
45
56
|
constructor( textureNode, directionNode = null, sigma = 2 ) {
|
|
46
57
|
|
|
47
58
|
super( 'vec4' );
|
|
48
59
|
|
|
60
|
+
/**
|
|
61
|
+
* The texture node that represents the input of the effect.
|
|
62
|
+
*
|
|
63
|
+
* @type {TextureNode}
|
|
64
|
+
*/
|
|
49
65
|
this.textureNode = textureNode;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Defines the direction and radius of the blur.
|
|
69
|
+
*
|
|
70
|
+
* @type {Node<vec2|float>}
|
|
71
|
+
*/
|
|
50
72
|
this.directionNode = directionNode;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Controls the kernel of the blur filter. Higher values mean a wider blur radius.
|
|
76
|
+
*
|
|
77
|
+
* @type {Number}
|
|
78
|
+
*/
|
|
51
79
|
this.sigma = sigma;
|
|
52
80
|
|
|
81
|
+
/**
|
|
82
|
+
* A uniform node holding the inverse resolution value.
|
|
83
|
+
*
|
|
84
|
+
* @private
|
|
85
|
+
* @type {UniformNode<vec2>}
|
|
86
|
+
*/
|
|
53
87
|
this._invSize = uniform( new Vector2() );
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Gaussian blur is applied in two passes (horizontal, vertical).
|
|
91
|
+
* This node controls the direction of each pass.
|
|
92
|
+
*
|
|
93
|
+
* @private
|
|
94
|
+
* @type {UniformNode<vec2>}
|
|
95
|
+
*/
|
|
54
96
|
this._passDirection = uniform( new Vector2() );
|
|
55
97
|
|
|
98
|
+
/**
|
|
99
|
+
* The render target used for the horizontal pass.
|
|
100
|
+
*
|
|
101
|
+
* @private
|
|
102
|
+
* @type {RenderTarget}
|
|
103
|
+
*/
|
|
56
104
|
this._horizontalRT = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
57
105
|
this._horizontalRT.texture.name = 'GaussianBlurNode.horizontal';
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The render target used for the vertical pass.
|
|
109
|
+
*
|
|
110
|
+
* @private
|
|
111
|
+
* @type {RenderTarget}
|
|
112
|
+
*/
|
|
58
113
|
this._verticalRT = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
59
114
|
this._verticalRT.texture.name = 'GaussianBlurNode.vertical';
|
|
60
115
|
|
|
116
|
+
/**
|
|
117
|
+
* The result of the effect is represented as a separate texture node.
|
|
118
|
+
*
|
|
119
|
+
* @private
|
|
120
|
+
* @type {PassTextureNode}
|
|
121
|
+
*/
|
|
61
122
|
this._textureNode = passTexture( this, this._verticalRT.texture );
|
|
62
123
|
this._textureNode.uvNode = textureNode.uvNode;
|
|
63
124
|
|
|
125
|
+
/**
|
|
126
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
127
|
+
* its effect once per frame in `updateBefore()`.
|
|
128
|
+
*
|
|
129
|
+
* @type {String}
|
|
130
|
+
* @default 'frame'
|
|
131
|
+
*/
|
|
64
132
|
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
65
133
|
|
|
134
|
+
/**
|
|
135
|
+
* Controls the resolution of the effect.
|
|
136
|
+
*
|
|
137
|
+
* @type {Vector2}
|
|
138
|
+
* @default (1,1)
|
|
139
|
+
*/
|
|
66
140
|
this.resolution = new Vector2( 1, 1 );
|
|
67
141
|
|
|
142
|
+
/**
|
|
143
|
+
* Whether the effect should use premultiplied alpha or not. Set this to `true`
|
|
144
|
+
* if you are going to blur texture input with transparency.
|
|
145
|
+
*
|
|
146
|
+
* @type {Boolean}
|
|
147
|
+
* @default false
|
|
148
|
+
*/
|
|
68
149
|
this.premultipliedAlpha = false;
|
|
69
150
|
|
|
70
151
|
}
|
|
71
152
|
|
|
153
|
+
/**
|
|
154
|
+
* Sets the given premultiplied alpha value.
|
|
155
|
+
*
|
|
156
|
+
* @param {Boolean} value - Whether the effect should use premultiplied alpha or not.
|
|
157
|
+
* @return {GaussianBlurNode} height - A reference to this node.
|
|
158
|
+
*/
|
|
72
159
|
setPremultipliedAlpha( value ) {
|
|
73
160
|
|
|
74
161
|
this.premultipliedAlpha = value;
|
|
@@ -77,12 +164,23 @@ class GaussianBlurNode extends TempNode {
|
|
|
77
164
|
|
|
78
165
|
}
|
|
79
166
|
|
|
167
|
+
/**
|
|
168
|
+
* Returns the premultiplied alpha value.
|
|
169
|
+
*
|
|
170
|
+
* @return {Boolean} Whether the effect should use premultiplied alpha or not.
|
|
171
|
+
*/
|
|
80
172
|
getPremultipliedAlpha() {
|
|
81
173
|
|
|
82
174
|
return this.premultipliedAlpha;
|
|
83
175
|
|
|
84
176
|
}
|
|
85
177
|
|
|
178
|
+
/**
|
|
179
|
+
* Sets the size of the effect.
|
|
180
|
+
*
|
|
181
|
+
* @param {Number} width - The width of the effect.
|
|
182
|
+
* @param {Number} height - The height of the effect.
|
|
183
|
+
*/
|
|
86
184
|
setSize( width, height ) {
|
|
87
185
|
|
|
88
186
|
width = Math.max( Math.round( width * this.resolution.x ), 1 );
|
|
@@ -94,11 +192,16 @@ class GaussianBlurNode extends TempNode {
|
|
|
94
192
|
|
|
95
193
|
}
|
|
96
194
|
|
|
195
|
+
/**
|
|
196
|
+
* This method is used to render the effect once per frame.
|
|
197
|
+
*
|
|
198
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
199
|
+
*/
|
|
97
200
|
updateBefore( frame ) {
|
|
98
201
|
|
|
99
202
|
const { renderer } = frame;
|
|
100
203
|
|
|
101
|
-
_rendererState =
|
|
204
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
102
205
|
|
|
103
206
|
//
|
|
104
207
|
|
|
@@ -137,23 +240,34 @@ class GaussianBlurNode extends TempNode {
|
|
|
137
240
|
|
|
138
241
|
textureNode.value = currentTexture;
|
|
139
242
|
|
|
140
|
-
|
|
243
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
141
244
|
|
|
142
245
|
}
|
|
143
246
|
|
|
247
|
+
/**
|
|
248
|
+
* Returns the result of the effect as a texture node.
|
|
249
|
+
*
|
|
250
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
251
|
+
*/
|
|
144
252
|
getTextureNode() {
|
|
145
253
|
|
|
146
254
|
return this._textureNode;
|
|
147
255
|
|
|
148
256
|
}
|
|
149
257
|
|
|
258
|
+
/**
|
|
259
|
+
* This method is used to setup the effect's TSL code.
|
|
260
|
+
*
|
|
261
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
262
|
+
* @return {PassTextureNode}
|
|
263
|
+
*/
|
|
150
264
|
setup( builder ) {
|
|
151
265
|
|
|
152
266
|
const textureNode = this.textureNode;
|
|
153
267
|
|
|
154
268
|
//
|
|
155
269
|
|
|
156
|
-
const uvNode =
|
|
270
|
+
const uvNode = uv();
|
|
157
271
|
const directionNode = vec2( this.directionNode || 1 );
|
|
158
272
|
|
|
159
273
|
let sampleTexture, output;
|
|
@@ -162,12 +276,12 @@ class GaussianBlurNode extends TempNode {
|
|
|
162
276
|
|
|
163
277
|
// https://lisyarus.github.io/blog/posts/blur-coefficients-generator.html
|
|
164
278
|
|
|
165
|
-
sampleTexture = ( uv ) => premult( textureNode.
|
|
279
|
+
sampleTexture = ( uv ) => premult( textureNode.sample( uv ) );
|
|
166
280
|
output = ( color ) => unpremult( color );
|
|
167
281
|
|
|
168
282
|
} else {
|
|
169
283
|
|
|
170
|
-
sampleTexture = ( uv ) => textureNode.
|
|
284
|
+
sampleTexture = ( uv ) => textureNode.sample( uv );
|
|
171
285
|
output = ( color ) => color;
|
|
172
286
|
|
|
173
287
|
}
|
|
@@ -220,6 +334,10 @@ class GaussianBlurNode extends TempNode {
|
|
|
220
334
|
|
|
221
335
|
}
|
|
222
336
|
|
|
337
|
+
/**
|
|
338
|
+
* Frees internal resources. This method should be called
|
|
339
|
+
* when the effect is no longer required.
|
|
340
|
+
*/
|
|
223
341
|
dispose() {
|
|
224
342
|
|
|
225
343
|
this._horizontalRT.dispose();
|
|
@@ -227,6 +345,13 @@ class GaussianBlurNode extends TempNode {
|
|
|
227
345
|
|
|
228
346
|
}
|
|
229
347
|
|
|
348
|
+
/**
|
|
349
|
+
* Computes gaussian coefficients depending on the given kernel radius.
|
|
350
|
+
*
|
|
351
|
+
* @private
|
|
352
|
+
* @param {Number} kernelRadius - The kernel radius.
|
|
353
|
+
* @return {Array<Number>}
|
|
354
|
+
*/
|
|
230
355
|
_getCoefficients( kernelRadius ) {
|
|
231
356
|
|
|
232
357
|
const coefficients = [];
|
|
@@ -245,5 +370,24 @@ class GaussianBlurNode extends TempNode {
|
|
|
245
370
|
|
|
246
371
|
export default GaussianBlurNode;
|
|
247
372
|
|
|
373
|
+
/**
|
|
374
|
+
* TSL function for creating a gaussian blur node for post processing.
|
|
375
|
+
*
|
|
376
|
+
* @function
|
|
377
|
+
* @param {Node<vec4>} node - The node that represents the input of the effect.
|
|
378
|
+
* @param {Node<vec2|float>} directionNode - Defines the direction and radius of the blur.
|
|
379
|
+
* @param {Number} sigma - Controls the kernel of the blur filter. Higher values mean a wider blur radius.
|
|
380
|
+
* @returns {GaussianBlurNode}
|
|
381
|
+
*/
|
|
248
382
|
export const gaussianBlur = ( node, directionNode, sigma ) => nodeObject( new GaussianBlurNode( convertToTexture( node ), directionNode, sigma ) );
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* TSL function for creating a gaussian blur node for post processing with enabled premultiplied alpha.
|
|
386
|
+
*
|
|
387
|
+
* @function
|
|
388
|
+
* @param {Node<vec4>} node - The node that represents the input of the effect.
|
|
389
|
+
* @param {Node<vec2|float>} directionNode - Defines the direction and radius of the blur.
|
|
390
|
+
* @param {Number} sigma - Controls the kernel of the blur filter. Higher values mean a wider blur radius.
|
|
391
|
+
* @returns {GaussianBlurNode}
|
|
392
|
+
*/
|
|
249
393
|
export const premultipliedGaussianBlur = ( node, directionNode, sigma ) => nodeObject( new GaussianBlurNode( convertToTexture( node ), directionNode, sigma ).setPremultipliedAlpha( true ) );
|