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,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Loop, int, exp, min, float, mul, uv, vec2, vec3, Fn, textureSize, orthographicDepthToViewZ, screenUV, nodeObject, uniform, vec4, passTexture, texture, perspectiveDepthToViewZ, positionView } from 'three/tsl';
|
|
1
|
+
import { DepthTexture, FloatType, RenderTarget, Vector2, TempNode, QuadMesh, NodeMaterial, RendererUtils, NodeUpdateType } from 'three/webgpu';
|
|
2
|
+
import { Loop, int, exp, min, float, mul, uv, vec2, vec3, Fn, textureSize, orthographicDepthToViewZ, screenUV, nodeObject, uniform, vec4, passTexture, texture, perspectiveDepthToViewZ, positionView, reference } from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
/** @module OutlineNode **/
|
|
3
5
|
|
|
4
6
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
7
|
const _size = /*@__PURE__*/ new Vector2();
|
|
@@ -8,6 +10,39 @@ const _BLUR_DIRECTION_Y = /*@__PURE__*/ new Vector2( 0.0, 1.0 );
|
|
|
8
10
|
|
|
9
11
|
let _rendererState;
|
|
10
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Post processing node for rendering outlines around selected objects. The node
|
|
15
|
+
* gives you great flexibility in composing the final outline look depending on
|
|
16
|
+
* your requirements.
|
|
17
|
+
* ```js
|
|
18
|
+
* const postProcessing = new THREE.PostProcessing( renderer );
|
|
19
|
+
*
|
|
20
|
+
* const scenePass = pass( scene, camera );
|
|
21
|
+
*
|
|
22
|
+
* // outline parameter
|
|
23
|
+
*
|
|
24
|
+
* const edgeStrength = uniform( 3.0 );
|
|
25
|
+
* const edgeGlow = uniform( 0.0 );
|
|
26
|
+
* const edgeThickness = uniform( 1.0 );
|
|
27
|
+
* const visibleEdgeColor = uniform( new THREE.Color( 0xffffff ) );
|
|
28
|
+
* const hiddenEdgeColor = uniform( new THREE.Color( 0x4e3636 ) );
|
|
29
|
+
*
|
|
30
|
+
* outlinePass = outline( scene, camera, {
|
|
31
|
+
* selectedObjects,
|
|
32
|
+
* edgeGlow,
|
|
33
|
+
* edgeThickness
|
|
34
|
+
* } );
|
|
35
|
+
*
|
|
36
|
+
* // compose custom outline
|
|
37
|
+
*
|
|
38
|
+
* const { visibleEdge, hiddenEdge } = outlinePass;
|
|
39
|
+
* const outlineColor = visibleEdge.mul( visibleEdgeColor ).add( hiddenEdge.mul( hiddenEdgeColor ) ).mul( edgeStrength );
|
|
40
|
+
*
|
|
41
|
+
* postProcessing.outputNode = outlineColor.add( scenePass );
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @augments TempNode
|
|
45
|
+
*/
|
|
11
46
|
class OutlineNode extends TempNode {
|
|
12
47
|
|
|
13
48
|
static get type() {
|
|
@@ -16,6 +51,17 @@ class OutlineNode extends TempNode {
|
|
|
16
51
|
|
|
17
52
|
}
|
|
18
53
|
|
|
54
|
+
/**
|
|
55
|
+
* Constructs a new outline node.
|
|
56
|
+
*
|
|
57
|
+
* @param {Scene} scene - A reference to the scene.
|
|
58
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
59
|
+
* @param {Object} params - The configuration parameters.
|
|
60
|
+
* @param {Array<Object3D>} params.selectedObjects - An array of selected objects.
|
|
61
|
+
* @param {Node<float>} [params.edgeThickness=float(1)] - The thickness of the edges.
|
|
62
|
+
* @param {Node<float>} [params.edgeGlow=float(0)] - Can be used for an animated glow/pulse effects.
|
|
63
|
+
* @param {Number} [params.downSampleRatio=2] - The downsample ratio.
|
|
64
|
+
*/
|
|
19
65
|
constructor( scene, camera, params = {} ) {
|
|
20
66
|
|
|
21
67
|
super( 'vec4' );
|
|
@@ -27,101 +73,341 @@ class OutlineNode extends TempNode {
|
|
|
27
73
|
downSampleRatio = 2
|
|
28
74
|
} = params;
|
|
29
75
|
|
|
76
|
+
/**
|
|
77
|
+
* A reference to the scene.
|
|
78
|
+
*
|
|
79
|
+
* @type {Scene}
|
|
80
|
+
*/
|
|
30
81
|
this.scene = scene;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The camera the scene is rendered with.
|
|
85
|
+
*
|
|
86
|
+
* @type {Camera}
|
|
87
|
+
*/
|
|
31
88
|
this.camera = camera;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* An array of selected objects.
|
|
92
|
+
*
|
|
93
|
+
* @type {Array<Object3D>}
|
|
94
|
+
*/
|
|
32
95
|
this.selectedObjects = selectedObjects;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The thickness of the edges.
|
|
99
|
+
*
|
|
100
|
+
* @type {Node<float>}
|
|
101
|
+
*/
|
|
33
102
|
this.edgeThicknessNode = nodeObject( edgeThickness );
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Can be used for an animated glow/pulse effect.
|
|
106
|
+
*
|
|
107
|
+
* @type {Node<float>}
|
|
108
|
+
*/
|
|
34
109
|
this.edgeGlowNode = nodeObject( edgeGlow );
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The downsample ratio.
|
|
113
|
+
*
|
|
114
|
+
* @type {Number}
|
|
115
|
+
* @default 2
|
|
116
|
+
*/
|
|
35
117
|
this.downSampleRatio = downSampleRatio;
|
|
36
118
|
|
|
119
|
+
/**
|
|
120
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
121
|
+
* its effect once per frame in `updateBefore()`.
|
|
122
|
+
*
|
|
123
|
+
* @type {String}
|
|
124
|
+
* @default 'frame'
|
|
125
|
+
*/
|
|
37
126
|
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
38
127
|
|
|
39
128
|
// render targets
|
|
40
129
|
|
|
130
|
+
/**
|
|
131
|
+
* The render target for the depth pre-pass.
|
|
132
|
+
*
|
|
133
|
+
* @private
|
|
134
|
+
* @type {RenderTarget}
|
|
135
|
+
*/
|
|
41
136
|
this._renderTargetDepthBuffer = new RenderTarget();
|
|
42
137
|
this._renderTargetDepthBuffer.depthTexture = new DepthTexture();
|
|
43
138
|
this._renderTargetDepthBuffer.depthTexture.type = FloatType;
|
|
44
139
|
|
|
140
|
+
/**
|
|
141
|
+
* The render target for the mask pass.
|
|
142
|
+
*
|
|
143
|
+
* @private
|
|
144
|
+
* @type {RenderTarget}
|
|
145
|
+
*/
|
|
45
146
|
this._renderTargetMaskBuffer = new RenderTarget();
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The render target for the mask downsample.
|
|
150
|
+
*
|
|
151
|
+
* @private
|
|
152
|
+
* @type {RenderTarget}
|
|
153
|
+
*/
|
|
46
154
|
this._renderTargetMaskDownSampleBuffer = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* The first render target for the edge detection.
|
|
158
|
+
*
|
|
159
|
+
* @private
|
|
160
|
+
* @type {RenderTarget}
|
|
161
|
+
*/
|
|
47
162
|
this._renderTargetEdgeBuffer1 = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* The second render target for the edge detection.
|
|
166
|
+
*
|
|
167
|
+
* @private
|
|
168
|
+
* @type {RenderTarget}
|
|
169
|
+
*/
|
|
48
170
|
this._renderTargetEdgeBuffer2 = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* The first render target for the blur pass.
|
|
174
|
+
*
|
|
175
|
+
* @private
|
|
176
|
+
* @type {RenderTarget}
|
|
177
|
+
*/
|
|
49
178
|
this._renderTargetBlurBuffer1 = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* The second render target for the blur pass.
|
|
182
|
+
*
|
|
183
|
+
* @private
|
|
184
|
+
* @type {RenderTarget}
|
|
185
|
+
*/
|
|
50
186
|
this._renderTargetBlurBuffer2 = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* The render target for the final composite.
|
|
190
|
+
*
|
|
191
|
+
* @private
|
|
192
|
+
* @type {RenderTarget}
|
|
193
|
+
*/
|
|
51
194
|
this._renderTargetComposite = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
52
195
|
|
|
53
196
|
// uniforms
|
|
54
197
|
|
|
55
|
-
|
|
56
|
-
|
|
198
|
+
/**
|
|
199
|
+
* Represents the near value of the scene's camera.
|
|
200
|
+
*
|
|
201
|
+
* @private
|
|
202
|
+
* @type {ReferenceNode<float>}
|
|
203
|
+
*/
|
|
204
|
+
this._cameraNear = reference( 'near', 'float', camera );
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Represents the far value of the scene's camera.
|
|
208
|
+
*
|
|
209
|
+
* @private
|
|
210
|
+
* @type {ReferenceNode<float>}
|
|
211
|
+
*/
|
|
212
|
+
this._cameraFar = reference( 'far', 'float', camera );
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Uniform that represents the blur direction of the pass.
|
|
216
|
+
*
|
|
217
|
+
* @private
|
|
218
|
+
* @type {UniformNode<vec2>}
|
|
219
|
+
*/
|
|
57
220
|
this._blurDirection = uniform( new Vector2() );
|
|
58
221
|
|
|
222
|
+
/**
|
|
223
|
+
* Texture node that holds the data from the depth pre-pass.
|
|
224
|
+
*
|
|
225
|
+
* @private
|
|
226
|
+
* @type {TextureNode}
|
|
227
|
+
*/
|
|
59
228
|
this._depthTextureUniform = texture( this._renderTargetDepthBuffer.depthTexture );
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Texture node that holds the data from the mask pass.
|
|
232
|
+
*
|
|
233
|
+
* @private
|
|
234
|
+
* @type {TextureNode}
|
|
235
|
+
*/
|
|
60
236
|
this._maskTextureUniform = texture( this._renderTargetMaskBuffer.texture );
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Texture node that holds the data from the mask downsample pass.
|
|
240
|
+
*
|
|
241
|
+
* @private
|
|
242
|
+
* @type {TextureNode}
|
|
243
|
+
*/
|
|
61
244
|
this._maskTextureDownsSampleUniform = texture( this._renderTargetMaskDownSampleBuffer.texture );
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Texture node that holds the data from the first edge detection pass.
|
|
248
|
+
*
|
|
249
|
+
* @private
|
|
250
|
+
* @type {TextureNode}
|
|
251
|
+
*/
|
|
62
252
|
this._edge1TextureUniform = texture( this._renderTargetEdgeBuffer1.texture );
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Texture node that holds the data from the second edge detection pass.
|
|
256
|
+
*
|
|
257
|
+
* @private
|
|
258
|
+
* @type {TextureNode}
|
|
259
|
+
*/
|
|
63
260
|
this._edge2TextureUniform = texture( this._renderTargetEdgeBuffer2.texture );
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Texture node that holds the current blurred color data.
|
|
264
|
+
*
|
|
265
|
+
* @private
|
|
266
|
+
* @type {TextureNode}
|
|
267
|
+
*/
|
|
64
268
|
this._blurColorTextureUniform = texture( this._renderTargetEdgeBuffer1.texture );
|
|
65
269
|
|
|
66
270
|
// constants
|
|
67
271
|
|
|
272
|
+
/**
|
|
273
|
+
* Visible edge color.
|
|
274
|
+
*
|
|
275
|
+
* @private
|
|
276
|
+
* @type {Node<vec3>}
|
|
277
|
+
*/
|
|
68
278
|
this._visibleEdgeColor = vec3( 1, 0, 0 );
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Hidden edge color.
|
|
282
|
+
*
|
|
283
|
+
* @private
|
|
284
|
+
* @type {Node<vec3>}
|
|
285
|
+
*/
|
|
69
286
|
this._hiddenEdgeColor = vec3( 0, 1, 0 );
|
|
70
287
|
|
|
71
288
|
// materials
|
|
72
289
|
|
|
290
|
+
/**
|
|
291
|
+
* The material for the depth pre-pass.
|
|
292
|
+
*
|
|
293
|
+
* @private
|
|
294
|
+
* @type {NodeMaterial}
|
|
295
|
+
*/
|
|
73
296
|
this._depthMaterial = new NodeMaterial();
|
|
74
297
|
this._depthMaterial.fragmentNode = vec4( 0, 0, 0, 1 );
|
|
75
298
|
this._depthMaterial.name = 'OutlineNode.depth';
|
|
76
299
|
|
|
300
|
+
/**
|
|
301
|
+
* The material for preparing the mask.
|
|
302
|
+
*
|
|
303
|
+
* @private
|
|
304
|
+
* @type {NodeMaterial}
|
|
305
|
+
*/
|
|
77
306
|
this._prepareMaskMaterial = new NodeMaterial();
|
|
78
307
|
this._prepareMaskMaterial.name = 'OutlineNode.prepareMask';
|
|
79
308
|
|
|
309
|
+
/**
|
|
310
|
+
* The copy material
|
|
311
|
+
*
|
|
312
|
+
* @private
|
|
313
|
+
* @type {NodeMaterial}
|
|
314
|
+
*/
|
|
80
315
|
this._materialCopy = new NodeMaterial();
|
|
81
316
|
this._materialCopy.name = 'OutlineNode.copy';
|
|
82
317
|
|
|
318
|
+
/**
|
|
319
|
+
* The edge detection material.
|
|
320
|
+
*
|
|
321
|
+
* @private
|
|
322
|
+
* @type {NodeMaterial}
|
|
323
|
+
*/
|
|
83
324
|
this._edgeDetectionMaterial = new NodeMaterial();
|
|
84
325
|
this._edgeDetectionMaterial.name = 'OutlineNode.edgeDetection';
|
|
85
326
|
|
|
327
|
+
/**
|
|
328
|
+
* The material that is used to render in the blur pass.
|
|
329
|
+
*
|
|
330
|
+
* @private
|
|
331
|
+
* @type {NodeMaterial}
|
|
332
|
+
*/
|
|
86
333
|
this._separableBlurMaterial = new NodeMaterial();
|
|
87
334
|
this._separableBlurMaterial.name = 'OutlineNode.separableBlur';
|
|
88
335
|
|
|
336
|
+
/**
|
|
337
|
+
* The material that is used to render in the blur pass.
|
|
338
|
+
*
|
|
339
|
+
* @private
|
|
340
|
+
* @type {NodeMaterial}
|
|
341
|
+
*/
|
|
89
342
|
this._separableBlurMaterial2 = new NodeMaterial();
|
|
90
343
|
this._separableBlurMaterial2.name = 'OutlineNode.separableBlur2';
|
|
91
344
|
|
|
345
|
+
/**
|
|
346
|
+
* The final composite material.
|
|
347
|
+
*
|
|
348
|
+
* @private
|
|
349
|
+
* @type {NodeMaterial}
|
|
350
|
+
*/
|
|
92
351
|
this._compositeMaterial = new NodeMaterial();
|
|
93
352
|
this._compositeMaterial.name = 'OutlineNode.composite';
|
|
94
353
|
|
|
95
|
-
|
|
96
|
-
|
|
354
|
+
/**
|
|
355
|
+
* A set to cache selected objects in the scene.
|
|
356
|
+
*
|
|
357
|
+
* @private
|
|
358
|
+
* @type {Set<Object3D>}
|
|
359
|
+
*/
|
|
97
360
|
this._selectionCache = new Set();
|
|
98
|
-
this._tempPulseColor1 = new Color();
|
|
99
|
-
this._tempPulseColor2 = new Color();
|
|
100
|
-
|
|
101
|
-
//
|
|
102
361
|
|
|
362
|
+
/**
|
|
363
|
+
* The result of the effect is represented as a separate texture node.
|
|
364
|
+
*
|
|
365
|
+
* @private
|
|
366
|
+
* @type {PassTextureNode}
|
|
367
|
+
*/
|
|
103
368
|
this._textureNode = passTexture( this, this._renderTargetComposite.texture );
|
|
104
369
|
|
|
105
370
|
}
|
|
106
371
|
|
|
372
|
+
/**
|
|
373
|
+
* A mask value that represents the visible edge.
|
|
374
|
+
*
|
|
375
|
+
* @return {Node<float>} The visible edge.
|
|
376
|
+
*/
|
|
107
377
|
get visibleEdge() {
|
|
108
378
|
|
|
109
379
|
return this.r;
|
|
110
380
|
|
|
111
381
|
}
|
|
112
382
|
|
|
383
|
+
/**
|
|
384
|
+
* A mask value that represents the hidden edge.
|
|
385
|
+
*
|
|
386
|
+
* @return {Node<float>} The hidden edge.
|
|
387
|
+
*/
|
|
113
388
|
get hiddenEdge() {
|
|
114
389
|
|
|
115
390
|
return this.g;
|
|
116
391
|
|
|
117
392
|
}
|
|
118
393
|
|
|
394
|
+
/**
|
|
395
|
+
* Returns the result of the effect as a texture node.
|
|
396
|
+
*
|
|
397
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
398
|
+
*/
|
|
119
399
|
getTextureNode() {
|
|
120
400
|
|
|
121
401
|
return this._textureNode;
|
|
122
402
|
|
|
123
403
|
}
|
|
124
404
|
|
|
405
|
+
/**
|
|
406
|
+
* Sets the size of the effect.
|
|
407
|
+
*
|
|
408
|
+
* @param {Number} width - The width of the effect.
|
|
409
|
+
* @param {Number} height - The height of the effect.
|
|
410
|
+
*/
|
|
125
411
|
setSize( width, height ) {
|
|
126
412
|
|
|
127
413
|
this._renderTargetDepthBuffer.setSize( width, height );
|
|
@@ -147,12 +433,17 @@ class OutlineNode extends TempNode {
|
|
|
147
433
|
|
|
148
434
|
}
|
|
149
435
|
|
|
436
|
+
/**
|
|
437
|
+
* This method is used to render the effect once per frame.
|
|
438
|
+
*
|
|
439
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
440
|
+
*/
|
|
150
441
|
updateBefore( frame ) {
|
|
151
442
|
|
|
152
443
|
const { renderer } = frame;
|
|
153
444
|
const { camera, scene } = this;
|
|
154
445
|
|
|
155
|
-
_rendererState =
|
|
446
|
+
_rendererState = RendererUtils.resetRendererAndSceneState( renderer, scene, _rendererState );
|
|
156
447
|
|
|
157
448
|
//
|
|
158
449
|
|
|
@@ -255,17 +546,23 @@ class OutlineNode extends TempNode {
|
|
|
255
546
|
|
|
256
547
|
// restore
|
|
257
548
|
|
|
258
|
-
|
|
549
|
+
RendererUtils.restoreRendererAndSceneState( renderer, scene, _rendererState );
|
|
259
550
|
|
|
260
551
|
}
|
|
261
552
|
|
|
553
|
+
/**
|
|
554
|
+
* This method is used to setup the effect's TSL code.
|
|
555
|
+
*
|
|
556
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
557
|
+
* @return {PassTextureNode}
|
|
558
|
+
*/
|
|
262
559
|
setup() {
|
|
263
560
|
|
|
264
561
|
// prepare mask material
|
|
265
562
|
|
|
266
563
|
const prepareMask = () => {
|
|
267
564
|
|
|
268
|
-
const depth = this._depthTextureUniform.
|
|
565
|
+
const depth = this._depthTextureUniform.sample( screenUV );
|
|
269
566
|
|
|
270
567
|
let viewZNode;
|
|
271
568
|
|
|
@@ -301,10 +598,10 @@ class OutlineNode extends TempNode {
|
|
|
301
598
|
const uvOffset = vec4( 1.0, 0.0, 0.0, 1.0 ).mul( vec4( invSize, invSize ) );
|
|
302
599
|
|
|
303
600
|
const uvNode = uv();
|
|
304
|
-
const c1 = this._maskTextureDownsSampleUniform.
|
|
305
|
-
const c2 = this._maskTextureDownsSampleUniform.
|
|
306
|
-
const c3 = this._maskTextureDownsSampleUniform.
|
|
307
|
-
const c4 = this._maskTextureDownsSampleUniform.
|
|
601
|
+
const c1 = this._maskTextureDownsSampleUniform.sample( uvNode.add( uvOffset.xy ) ).toVar();
|
|
602
|
+
const c2 = this._maskTextureDownsSampleUniform.sample( uvNode.sub( uvOffset.xy ) ).toVar();
|
|
603
|
+
const c3 = this._maskTextureDownsSampleUniform.sample( uvNode.add( uvOffset.yw ) ).toVar();
|
|
604
|
+
const c4 = this._maskTextureDownsSampleUniform.sample( uvNode.sub( uvOffset.yw ) ).toVar();
|
|
308
605
|
|
|
309
606
|
const diff1 = mul( c1.r.sub( c2.r ), 0.5 );
|
|
310
607
|
const diff2 = mul( c3.r.sub( c4.r ), 0.5 );
|
|
@@ -320,7 +617,7 @@ class OutlineNode extends TempNode {
|
|
|
320
617
|
this._edgeDetectionMaterial.fragmentNode = edgeDetection();
|
|
321
618
|
this._edgeDetectionMaterial.needsUpdate = true;
|
|
322
619
|
|
|
323
|
-
//
|
|
620
|
+
// separable blur material
|
|
324
621
|
|
|
325
622
|
const MAX_RADIUS = 4;
|
|
326
623
|
|
|
@@ -330,7 +627,7 @@ class OutlineNode extends TempNode {
|
|
|
330
627
|
|
|
331
628
|
} );
|
|
332
629
|
|
|
333
|
-
const
|
|
630
|
+
const separableBlur = Fn( ( [ kernelRadius ] ) => {
|
|
334
631
|
|
|
335
632
|
const resolution = textureSize( this._maskTextureDownsSampleUniform );
|
|
336
633
|
const invSize = vec2( 1 ).div( resolution ).toVar();
|
|
@@ -338,7 +635,7 @@ class OutlineNode extends TempNode {
|
|
|
338
635
|
|
|
339
636
|
const sigma = kernelRadius.div( 2 ).toVar();
|
|
340
637
|
const weightSum = gaussianPdf( 0, sigma ).toVar();
|
|
341
|
-
const diffuseSum = this._blurColorTextureUniform.
|
|
638
|
+
const diffuseSum = this._blurColorTextureUniform.sample( uvNode ).mul( weightSum ).toVar();
|
|
342
639
|
const delta = this._blurDirection.mul( invSize ).mul( kernelRadius ).div( MAX_RADIUS ).toVar();
|
|
343
640
|
|
|
344
641
|
const uvOffset = delta.toVar();
|
|
@@ -347,8 +644,8 @@ class OutlineNode extends TempNode {
|
|
|
347
644
|
|
|
348
645
|
const x = kernelRadius.mul( float( i ) ).div( MAX_RADIUS );
|
|
349
646
|
const w = gaussianPdf( x, sigma );
|
|
350
|
-
const sample1 = this._blurColorTextureUniform.
|
|
351
|
-
const sample2 = this._blurColorTextureUniform.
|
|
647
|
+
const sample1 = this._blurColorTextureUniform.sample( uvNode.add( uvOffset ) );
|
|
648
|
+
const sample2 = this._blurColorTextureUniform.sample( uvNode.sub( uvOffset ) );
|
|
352
649
|
|
|
353
650
|
diffuseSum.addAssign( sample1.add( sample2 ).mul( w ) );
|
|
354
651
|
weightSum.addAssign( w.mul( 2 ) );
|
|
@@ -360,10 +657,10 @@ class OutlineNode extends TempNode {
|
|
|
360
657
|
|
|
361
658
|
} );
|
|
362
659
|
|
|
363
|
-
this._separableBlurMaterial.fragmentNode =
|
|
660
|
+
this._separableBlurMaterial.fragmentNode = separableBlur( this.edgeThicknessNode );
|
|
364
661
|
this._separableBlurMaterial.needsUpdate = true;
|
|
365
662
|
|
|
366
|
-
this._separableBlurMaterial2.fragmentNode =
|
|
663
|
+
this._separableBlurMaterial2.fragmentNode = separableBlur( MAX_RADIUS );
|
|
367
664
|
this._separableBlurMaterial2.needsUpdate = true;
|
|
368
665
|
|
|
369
666
|
// composite material
|
|
@@ -387,6 +684,10 @@ class OutlineNode extends TempNode {
|
|
|
387
684
|
|
|
388
685
|
}
|
|
389
686
|
|
|
687
|
+
/**
|
|
688
|
+
* Frees internal resources. This method should be called
|
|
689
|
+
* when the effect is no longer required.
|
|
690
|
+
*/
|
|
390
691
|
dispose() {
|
|
391
692
|
|
|
392
693
|
this.selectedObjects.length = 0;
|
|
@@ -410,8 +711,11 @@ class OutlineNode extends TempNode {
|
|
|
410
711
|
|
|
411
712
|
}
|
|
412
713
|
|
|
413
|
-
|
|
414
|
-
|
|
714
|
+
/**
|
|
715
|
+
* Updates the selection cache based on the selected objects.
|
|
716
|
+
*
|
|
717
|
+
* @private
|
|
718
|
+
*/
|
|
415
719
|
_updateSelectionCache() {
|
|
416
720
|
|
|
417
721
|
for ( let i = 0; i < this.selectedObjects.length; i ++ ) {
|
|
@@ -431,4 +735,17 @@ class OutlineNode extends TempNode {
|
|
|
431
735
|
|
|
432
736
|
export default OutlineNode;
|
|
433
737
|
|
|
738
|
+
/**
|
|
739
|
+
* TSL function for creating an outline effect around selected objects.
|
|
740
|
+
*
|
|
741
|
+
* @function
|
|
742
|
+
* @param {Scene} scene - A reference to the scene.
|
|
743
|
+
* @param {Camera} camera - The camera the scene is rendered with.
|
|
744
|
+
* @param {Object} params - The configuration parameters.
|
|
745
|
+
* @param {Array<Object3D>} params.selectedObjects - An array of selected objects.
|
|
746
|
+
* @param {Node<float>} [params.edgeThickness=float(1)] - The thickness of the edges.
|
|
747
|
+
* @param {Node<float>} [params.edgeGlow=float(0)] - Can be used for animated glow/pulse effects.
|
|
748
|
+
* @param {Number} [params.downSampleRatio=2] - The downsample ratio.
|
|
749
|
+
* @returns {OutlineNode}
|
|
750
|
+
*/
|
|
434
751
|
export const outline = ( scene, camera, params ) => nodeObject( new OutlineNode( scene, camera, params ) );
|
|
@@ -2,6 +2,13 @@ import { NodeMaterial } from 'three/webgpu';
|
|
|
2
2
|
import { nodeObject, Fn, vec4, uv, If, mod, screenCoordinate } from 'three/tsl';
|
|
3
3
|
import StereoCompositePassNode from './StereoCompositePassNode.js';
|
|
4
4
|
|
|
5
|
+
/** @module ParallaxBarrierPassNode **/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A render pass node that creates a parallax barrier effect.
|
|
9
|
+
*
|
|
10
|
+
* @augments StereoCompositePassNode
|
|
11
|
+
*/
|
|
5
12
|
class ParallaxBarrierPassNode extends StereoCompositePassNode {
|
|
6
13
|
|
|
7
14
|
static get type() {
|
|
@@ -10,14 +17,33 @@ class ParallaxBarrierPassNode extends StereoCompositePassNode {
|
|
|
10
17
|
|
|
11
18
|
}
|
|
12
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Constructs a new parallax barrier pass node.
|
|
22
|
+
*
|
|
23
|
+
* @param {Scene} scene - The scene to render.
|
|
24
|
+
* @param {Camera} camera - The camera to render the scene with.
|
|
25
|
+
*/
|
|
13
26
|
constructor( scene, camera ) {
|
|
14
27
|
|
|
15
28
|
super( scene, camera );
|
|
16
29
|
|
|
30
|
+
/**
|
|
31
|
+
* This flag can be used for type testing.
|
|
32
|
+
*
|
|
33
|
+
* @type {Boolean}
|
|
34
|
+
* @readonly
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
17
37
|
this.isParallaxBarrierPassNode = true;
|
|
18
38
|
|
|
19
39
|
}
|
|
20
40
|
|
|
41
|
+
/**
|
|
42
|
+
* This method is used to setup the effect's TSL code.
|
|
43
|
+
*
|
|
44
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
45
|
+
* @return {PassTextureNode}
|
|
46
|
+
*/
|
|
21
47
|
setup( builder ) {
|
|
22
48
|
|
|
23
49
|
const uvNode = uv();
|
|
@@ -28,11 +54,11 @@ class ParallaxBarrierPassNode extends StereoCompositePassNode {
|
|
|
28
54
|
|
|
29
55
|
If( mod( screenCoordinate.y, 2 ).greaterThan( 1 ), () => {
|
|
30
56
|
|
|
31
|
-
color.assign( this._mapLeft.
|
|
57
|
+
color.assign( this._mapLeft.sample( uvNode ) );
|
|
32
58
|
|
|
33
59
|
} ).Else( () => {
|
|
34
60
|
|
|
35
|
-
color.assign( this._mapRight.
|
|
61
|
+
color.assign( this._mapRight.sample( uvNode ) );
|
|
36
62
|
|
|
37
63
|
} );
|
|
38
64
|
|
|
@@ -52,4 +78,12 @@ class ParallaxBarrierPassNode extends StereoCompositePassNode {
|
|
|
52
78
|
|
|
53
79
|
export default ParallaxBarrierPassNode;
|
|
54
80
|
|
|
81
|
+
/**
|
|
82
|
+
* TSL function for creating an parallax barrier pass node.
|
|
83
|
+
*
|
|
84
|
+
* @function
|
|
85
|
+
* @param {Scene} scene - The scene to render.
|
|
86
|
+
* @param {Camera} camera - The camera to render the scene with.
|
|
87
|
+
* @returns {ParallaxBarrierPassNode}
|
|
88
|
+
*/
|
|
55
89
|
export const parallaxBarrierPass = ( scene, camera ) => nodeObject( new ParallaxBarrierPassNode( scene, camera ) );
|