super-three 0.171.0 → 0.173.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/LICENSE +1 -1
- package/README.md +1 -1
- package/build/three.cjs +594 -427
- package/build/three.core.js +515 -81
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +79 -350
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +20 -7
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +29362 -3427
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +29361 -3427
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +0 -5
- package/examples/jsm/animation/CCDIKSolver.js +9 -7
- package/examples/jsm/capabilities/WebGPU.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +48 -37
- 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 +34 -29
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/PLYExporter.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +1 -12
- package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
- package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
- package/examples/jsm/interactive/InteractiveGroup.js +108 -51
- package/examples/jsm/libs/demuxer_mp4.js +109 -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 +4 -2
- package/examples/jsm/loaders/GLTFLoader.js +22 -4
- 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 -2
- 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/materials/MeshGouraudMaterial.js +2 -0
- package/examples/jsm/math/ConvexHull.js +1 -1
- package/examples/jsm/math/OBB.js +17 -0
- package/examples/jsm/misc/GPUComputationRenderer.js +6 -7
- package/examples/jsm/misc/ProgressiveLightMap.js +4 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +14 -13
- package/examples/jsm/misc/Volume.js +27 -17
- package/examples/jsm/misc/VolumeSlice.js +7 -5
- 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 +29 -24
- package/examples/jsm/physics/JoltPhysics.js +7 -7
- package/examples/jsm/physics/RapierPhysics.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/OutputPass.js +2 -0
- 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/OutputShader.js +5 -1
- package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
- package/examples/jsm/transpiler/TSLEncoder.js +2 -0
- 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 +4 -0
- package/src/Three.Legacy.js +0 -21
- package/src/Three.TSL.js +18 -5
- 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/ArrayCamera.js +1 -0
- package/src/cameras/PerspectiveCamera.js +18 -2
- package/src/constants.js +6 -1
- package/src/core/BufferAttribute.js +4 -0
- package/src/core/EventDispatcher.js +8 -6
- 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/ImageUtils.js +1 -11
- 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/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 +476 -23
- package/src/materials/nodes/NodeMaterials.js +0 -1
- package/src/materials/nodes/PointsNodeMaterial.js +121 -10
- package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
- package/src/materials/nodes/SpriteNodeMaterial.js +78 -20
- package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
- package/src/materials/nodes/manager/NodeMaterialObserver.js +95 -0
- package/src/nodes/Nodes.js +5 -6
- package/src/nodes/TSL.js +6 -3
- package/src/nodes/accessors/AccessorsUtils.js +27 -0
- package/src/nodes/accessors/Arrays.js +47 -6
- package/src/nodes/accessors/BatchNode.js +42 -6
- 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 +113 -3
- 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/Lights.js +50 -1
- package/src/nodes/accessors/MaterialNode.js +306 -12
- 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 +65 -5
- package/src/nodes/accessors/Object3DNode.js +101 -1
- package/src/nodes/accessors/PointUVNode.js +26 -0
- package/src/nodes/accessors/Position.js +56 -7
- package/src/nodes/accessors/ReferenceBaseNode.js +186 -0
- package/src/nodes/accessors/ReferenceNode.js +201 -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 +209 -8
- package/src/nodes/accessors/StorageTextureNode.js +118 -0
- package/src/nodes/accessors/Tangent.js +38 -2
- package/src/nodes/accessors/Texture3DNode.js +91 -7
- package/src/nodes/accessors/TextureBicubic.js +12 -2
- package/src/nodes/accessors/TextureNode.js +316 -10
- package/src/nodes/accessors/TextureSizeNode.js +42 -0
- package/src/nodes/accessors/UV.js +10 -1
- package/src/nodes/accessors/UniformArrayNode.js +231 -25
- package/src/nodes/accessors/UserDataNode.js +46 -0
- package/src/nodes/accessors/VelocityNode.js +80 -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/ArrayNode.js +125 -0
- 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 +32 -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 +350 -12
- package/src/nodes/core/NodeAttribute.js +38 -0
- package/src/nodes/core/NodeBuilder.js +1166 -26
- 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 +152 -1
- package/src/nodes/core/NodeVar.js +47 -1
- package/src/nodes/core/NodeVarying.js +28 -0
- package/src/nodes/core/OutputStructNode.js +51 -10
- package/src/nodes/core/ParameterNode.js +28 -0
- package/src/nodes/core/PropertyNode.js +232 -0
- package/src/nodes/core/StackNode.js +98 -1
- package/src/nodes/core/StructNode.js +121 -0
- package/src/nodes/core/StructType.js +13 -0
- package/src/nodes/core/StructTypeNode.js +105 -6
- package/src/nodes/core/TempNode.js +31 -5
- package/src/nodes/core/UniformGroupNode.js +82 -7
- package/src/nodes/core/UniformNode.js +66 -0
- package/src/nodes/core/VarNode.js +146 -7
- package/src/nodes/core/VaryingNode.js +100 -3
- package/src/nodes/core/constants.js +36 -0
- package/src/nodes/display/BlendModes.js +88 -1
- 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 +300 -7
- package/src/nodes/display/PosterizeNode.js +33 -0
- package/src/nodes/display/RenderOutputNode.js +66 -1
- package/src/nodes/display/ScreenNode.js +96 -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 +110 -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 +174 -2
- package/src/nodes/gpgpu/BarrierNode.js +47 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +134 -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 +241 -35
- package/src/nodes/lighting/SpotLightNode.js +43 -0
- package/src/nodes/math/ConditionalNode.js +78 -4
- package/src/nodes/math/Hash.js +9 -0
- package/src/nodes/math/MathNode.js +627 -11
- package/src/nodes/math/MathUtils.js +45 -1
- package/src/nodes/math/OperatorNode.js +329 -18
- 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 +2 -2
- package/src/nodes/procedural/Checker.js +9 -0
- package/src/nodes/shapes/Shapes.js +33 -0
- package/src/nodes/tsl/TSLBase.js +3 -2
- package/src/nodes/tsl/TSLCore.js +22 -2
- package/src/nodes/utils/ArrayElementNode.js +39 -3
- 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 +82 -2
- package/src/nodes/utils/MatcapUVNode.js +17 -0
- package/src/nodes/utils/MaxMipLevelNode.js +49 -0
- package/src/nodes/utils/MemberNode.js +68 -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 +54 -0
- package/src/nodes/utils/Timer.js +40 -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 +2 -3
- package/src/objects/ClippingGroup.js +49 -0
- package/src/objects/Line.js +6 -6
- package/src/renderers/WebGLRenderer.js +30 -4
- package/src/renderers/common/Animation.js +85 -0
- package/src/renderers/common/Attributes.js +36 -0
- package/src/renderers/common/Backend.js +502 -44
- package/src/renderers/common/Background.js +48 -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 +45 -6
- package/src/renderers/common/ClippingContext.js +108 -15
- package/src/renderers/common/Color4.js +40 -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 +91 -14
- package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
- package/src/renderers/common/Info.js +78 -35
- package/src/renderers/common/Lighting.js +34 -6
- package/src/renderers/common/Pipeline.js +22 -0
- package/src/renderers/common/Pipelines.js +148 -5
- package/src/renderers/common/PostProcessing.js +99 -11
- 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 +39 -10
- package/src/renderers/common/RenderContext.js +201 -2
- package/src/renderers/common/RenderContexts.js +59 -6
- package/src/renderers/common/RenderList.js +178 -0
- package/src/renderers/common/RenderLists.js +40 -3
- package/src/renderers/common/RenderObject.js +400 -17
- package/src/renderers/common/RenderObjects.js +103 -7
- package/src/renderers/common/RenderPipeline.js +24 -0
- package/src/renderers/common/Renderer.js +1170 -86
- package/src/renderers/common/RendererUtils.js +193 -0
- package/src/renderers/common/SampledTexture.js +120 -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 +97 -7
- package/src/renderers/common/TimestampQueryPool.js +39 -0
- package/src/renderers/common/Uniform.js +225 -3
- package/src/renderers/common/UniformBuffer.js +19 -0
- package/src/renderers/common/UniformsGroup.js +141 -2
- package/src/renderers/common/XRManager.js +1193 -0
- package/src/renderers/common/XRRenderTarget.js +74 -0
- package/src/renderers/common/extras/PMREMGenerator.js +76 -10
- package/src/renderers/common/nodes/NodeBuilderState.js +99 -5
- package/src/renderers/common/nodes/NodeLibrary.js +89 -0
- package/src/renderers/common/nodes/NodeSampledTexture.js +90 -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 +243 -2
- 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 +352 -78
- 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/WebGLBackground.js +4 -0
- package/src/renderers/webgl-fallback/WebGLBackend.js +819 -116
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +347 -18
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +58 -1
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
- package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +323 -11
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +168 -22
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +359 -0
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +43 -0
- package/src/renderers/webgpu/WebGPUBackend.js +578 -164
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +36 -0
- package/src/renderers/webgpu/WebGPURenderer.js +36 -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 +674 -52
- 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 +95 -14
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +94 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +102 -3
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +98 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +262 -18
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +274 -0
- package/src/renderers/webgpu/utils/WebGPUUtils.js +116 -4
- package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
- package/src/renderers/webxr/WebXRManager.js +19 -2
- package/src/textures/Data3DTexture.js +2 -2
- package/src/textures/Texture.js +4 -0
- package/src/textures/VideoFrameTexture.js +35 -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/geometries/InstancedPointsGeometry.js +0 -176
- package/examples/jsm/libs/mmdparser.module.js +0 -11530
- package/examples/jsm/loaders/MMDLoader.js +0 -2298
- package/examples/jsm/objects/InstancedPoints.js +0 -19
- package/examples/jsm/shaders/MMDToonShader.js +0 -134
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -156
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -24
- 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,10 +1,17 @@
|
|
|
1
|
-
import { RenderTarget, Vector2, TempNode, QuadMesh, NodeMaterial,
|
|
2
|
-
import { nodeObject, Fn, float, NodeUpdateType, uv, passTexture, uniform, convertToTexture, vec2, vec3, Loop,
|
|
1
|
+
import { RenderTarget, Vector2, TempNode, QuadMesh, NodeMaterial, RendererUtils } from 'three/webgpu';
|
|
2
|
+
import { nodeObject, Fn, float, NodeUpdateType, uv, passTexture, uniform, convertToTexture, vec2, vec3, Loop, mix, luminance } from 'three/tsl';
|
|
3
|
+
|
|
4
|
+
/** @module AnamorphicNode **/
|
|
3
5
|
|
|
4
6
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
7
|
|
|
6
8
|
let _rendererState;
|
|
7
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Post processing node for adding an anamorphic flare effect.
|
|
12
|
+
*
|
|
13
|
+
* @augments TempNode
|
|
14
|
+
*/
|
|
8
15
|
class AnamorphicNode extends TempNode {
|
|
9
16
|
|
|
10
17
|
static get type() {
|
|
@@ -13,34 +20,113 @@ class AnamorphicNode extends TempNode {
|
|
|
13
20
|
|
|
14
21
|
}
|
|
15
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Constructs a new anamorphic node.
|
|
25
|
+
*
|
|
26
|
+
* @param {TextureNode} textureNode - The texture node that represents the input of the effect.
|
|
27
|
+
* @param {Node<float>} tresholdNode - The threshold is one option to control the intensity and size of the effect.
|
|
28
|
+
* @param {Node<float>} scaleNode - Defines the vertical scale of the flares.
|
|
29
|
+
* @param {Number} samples - More samples result in larger flares and a more expensive runtime behavior.
|
|
30
|
+
*/
|
|
16
31
|
constructor( textureNode, tresholdNode, scaleNode, samples ) {
|
|
17
32
|
|
|
18
33
|
super( 'vec4' );
|
|
19
34
|
|
|
35
|
+
/**
|
|
36
|
+
* The texture node that represents the input of the effect.
|
|
37
|
+
*
|
|
38
|
+
* @type {TextureNode}
|
|
39
|
+
*/
|
|
20
40
|
this.textureNode = textureNode;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The threshold is one option to control the intensity and size of the effect.
|
|
44
|
+
*
|
|
45
|
+
* @type {Node<float>}
|
|
46
|
+
*/
|
|
21
47
|
this.tresholdNode = tresholdNode;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Defines the vertical scale of the flares.
|
|
51
|
+
*
|
|
52
|
+
* @type {Node<float>}
|
|
53
|
+
*/
|
|
22
54
|
this.scaleNode = scaleNode;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The color of the flares.
|
|
58
|
+
*
|
|
59
|
+
* @type {Node<vec3>}
|
|
60
|
+
*/
|
|
23
61
|
this.colorNode = vec3( 0.1, 0.0, 1.0 );
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* More samples result in larger flares and a more expensive runtime behavior.
|
|
65
|
+
*
|
|
66
|
+
* @type {Node<float>}
|
|
67
|
+
*/
|
|
24
68
|
this.samples = samples;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The resolution scale.
|
|
72
|
+
*
|
|
73
|
+
* @type {Vector2}
|
|
74
|
+
*/
|
|
25
75
|
this.resolution = new Vector2( 1, 1 );
|
|
26
76
|
|
|
77
|
+
/**
|
|
78
|
+
* The internal render target of the effect.
|
|
79
|
+
*
|
|
80
|
+
* @private
|
|
81
|
+
* @type {RenderTarget}
|
|
82
|
+
*/
|
|
27
83
|
this._renderTarget = new RenderTarget( 1, 1, { depthBuffer: false } );
|
|
28
84
|
this._renderTarget.texture.name = 'anamorphic';
|
|
29
85
|
|
|
86
|
+
/**
|
|
87
|
+
* A uniform node holding the inverse resolution value.
|
|
88
|
+
*
|
|
89
|
+
* @private
|
|
90
|
+
* @type {UniformNode<vec2>}
|
|
91
|
+
*/
|
|
30
92
|
this._invSize = uniform( new Vector2() );
|
|
31
93
|
|
|
94
|
+
/**
|
|
95
|
+
* The result of the effect is represented as a separate texture node.
|
|
96
|
+
*
|
|
97
|
+
* @private
|
|
98
|
+
* @type {PassTextureNode}
|
|
99
|
+
*/
|
|
32
100
|
this._textureNode = passTexture( this, this._renderTarget.texture );
|
|
33
101
|
|
|
102
|
+
/**
|
|
103
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
104
|
+
* its effect once per frame in `updateBefore()`.
|
|
105
|
+
*
|
|
106
|
+
* @type {String}
|
|
107
|
+
* @default 'frame'
|
|
108
|
+
*/
|
|
34
109
|
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
35
110
|
|
|
36
111
|
}
|
|
37
112
|
|
|
113
|
+
/**
|
|
114
|
+
* Returns the result of the effect as a texture node.
|
|
115
|
+
*
|
|
116
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
117
|
+
*/
|
|
38
118
|
getTextureNode() {
|
|
39
119
|
|
|
40
120
|
return this._textureNode;
|
|
41
121
|
|
|
42
122
|
}
|
|
43
123
|
|
|
124
|
+
/**
|
|
125
|
+
* Sets the size of the effect.
|
|
126
|
+
*
|
|
127
|
+
* @param {Number} width - The width of the effect.
|
|
128
|
+
* @param {Number} height - The height of the effect.
|
|
129
|
+
*/
|
|
44
130
|
setSize( width, height ) {
|
|
45
131
|
|
|
46
132
|
this._invSize.value.set( 1 / width, 1 / height );
|
|
@@ -52,11 +138,16 @@ class AnamorphicNode extends TempNode {
|
|
|
52
138
|
|
|
53
139
|
}
|
|
54
140
|
|
|
141
|
+
/**
|
|
142
|
+
* This method is used to render the effect once per frame.
|
|
143
|
+
*
|
|
144
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
145
|
+
*/
|
|
55
146
|
updateBefore( frame ) {
|
|
56
147
|
|
|
57
148
|
const { renderer } = frame;
|
|
58
149
|
|
|
59
|
-
_rendererState =
|
|
150
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
60
151
|
|
|
61
152
|
//
|
|
62
153
|
|
|
@@ -81,16 +172,24 @@ class AnamorphicNode extends TempNode {
|
|
|
81
172
|
|
|
82
173
|
textureNode.value = currentTexture;
|
|
83
174
|
|
|
84
|
-
|
|
175
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
85
176
|
|
|
86
177
|
}
|
|
87
178
|
|
|
179
|
+
/**
|
|
180
|
+
* This method is used to setup the effect's TSL code.
|
|
181
|
+
*
|
|
182
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
183
|
+
* @return {PassTextureNode}
|
|
184
|
+
*/
|
|
88
185
|
setup( builder ) {
|
|
89
186
|
|
|
90
187
|
const textureNode = this.textureNode;
|
|
91
188
|
const uvNode = textureNode.uvNode || uv();
|
|
92
189
|
|
|
93
|
-
const sampleTexture = ( uv ) => textureNode.
|
|
190
|
+
const sampleTexture = ( uv ) => textureNode.sample( uv );
|
|
191
|
+
|
|
192
|
+
const threshold = ( color, threshold ) => mix( vec3( 0.0 ), color, luminance( color ).sub( threshold ).max( 0 ) );
|
|
94
193
|
|
|
95
194
|
const anamorph = Fn( () => {
|
|
96
195
|
|
|
@@ -132,6 +231,10 @@ class AnamorphicNode extends TempNode {
|
|
|
132
231
|
|
|
133
232
|
}
|
|
134
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Frees internal resources. This method should be called
|
|
236
|
+
* when the effect is no longer required.
|
|
237
|
+
*/
|
|
135
238
|
dispose() {
|
|
136
239
|
|
|
137
240
|
this._renderTarget.dispose();
|
|
@@ -140,6 +243,16 @@ class AnamorphicNode extends TempNode {
|
|
|
140
243
|
|
|
141
244
|
}
|
|
142
245
|
|
|
246
|
+
/**
|
|
247
|
+
* TSL function for creating an anamorphic flare effect.
|
|
248
|
+
*
|
|
249
|
+
* @function
|
|
250
|
+
* @param {TextureNode} node - The node that represents the input of the effect.
|
|
251
|
+
* @param {Node<float> | Number} [threshold=0.9] - The threshold is one option to control the intensity and size of the effect.
|
|
252
|
+
* @param {Node<float> | Number} [scale=3] - Defines the vertical scale of the flares.
|
|
253
|
+
* @param {Number} [samples=32] - More samples result in larger flares and a more expensive runtime behavior.
|
|
254
|
+
* @returns {AnamorphicNode}
|
|
255
|
+
*/
|
|
143
256
|
export const anamorphic = ( node, threshold = .9, scale = 3, samples = 32 ) => nodeObject( new AnamorphicNode( convertToTexture( node ), nodeObject( threshold ), nodeObject( scale ), samples ) );
|
|
144
257
|
|
|
145
258
|
export default AnamorphicNode;
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { float, Fn, vec3, vec4, min, max, mix, luminance } from 'three/tsl';
|
|
2
2
|
|
|
3
|
+
/** @module BleachBypass **/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Applies a bleach bypass effect to the given color node.
|
|
7
|
+
*
|
|
8
|
+
* @function
|
|
9
|
+
* @param {Node<vec4>} color - The color node to apply the sepia for.
|
|
10
|
+
* @param {Node<float>} [opacity=1] - Influences how strong the effect is blended with the original color.
|
|
11
|
+
* @return {Node<vec4>} The updated color node.
|
|
12
|
+
*/
|
|
3
13
|
export const bleach = /*@__PURE__*/ Fn( ( [ color, opacity = 1 ] ) => {
|
|
4
14
|
|
|
5
15
|
const base = color;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { HalfFloatType, RenderTarget, Vector2, Vector3, TempNode, QuadMesh, NodeMaterial,
|
|
1
|
+
import { HalfFloatType, RenderTarget, Vector2, Vector3, TempNode, QuadMesh, NodeMaterial, RendererUtils, NodeUpdateType } from 'three/webgpu';
|
|
2
2
|
import { nodeObject, Fn, float, uv, passTexture, uniform, Loop, texture, luminance, smoothstep, mix, vec4, uniformArray, add, int } from 'three/tsl';
|
|
3
3
|
|
|
4
|
+
/** @module BloomNode **/
|
|
5
|
+
|
|
4
6
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
7
|
const _size = /*@__PURE__*/ new Vector2();
|
|
6
8
|
|
|
@@ -9,6 +11,38 @@ const _BlurDirectionY = /*@__PURE__*/ new Vector2( 0.0, 1.0 );
|
|
|
9
11
|
|
|
10
12
|
let _rendererState;
|
|
11
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Post processing node for creating a bloom effect.
|
|
16
|
+
* ```js
|
|
17
|
+
* const postProcessing = new THREE.PostProcessing( renderer );
|
|
18
|
+
*
|
|
19
|
+
* const scenePass = pass( scene, camera );
|
|
20
|
+
* const scenePassColor = scenePass.getTextureNode( 'output' );
|
|
21
|
+
*
|
|
22
|
+
* const bloomPass = bloom( scenePassColor );
|
|
23
|
+
*
|
|
24
|
+
* postProcessing.outputNode = scenePassColor.add( bloomPass );
|
|
25
|
+
* ```
|
|
26
|
+
* By default, the node affects the entire image. For a selective bloom,
|
|
27
|
+
* use the `emissive` material property to control which objects should
|
|
28
|
+
* contribute to bloom or not. This can be achieved via MRT.
|
|
29
|
+
* ```js
|
|
30
|
+
* const postProcessing = new THREE.PostProcessing( renderer );
|
|
31
|
+
*
|
|
32
|
+
* const scenePass = pass( scene, camera );
|
|
33
|
+
* scenePass.setMRT( mrt( {
|
|
34
|
+
* output,
|
|
35
|
+
* emissive
|
|
36
|
+
* } ) );
|
|
37
|
+
*
|
|
38
|
+
* const scenePassColor = scenePass.getTextureNode( 'output' );
|
|
39
|
+
* const emissivePass = scenePass.getTextureNode( 'emissive' );
|
|
40
|
+
*
|
|
41
|
+
* const bloomPass = bloom( emissivePass );
|
|
42
|
+
* postProcessing.outputNode = scenePassColor.add( bloomPass );
|
|
43
|
+
* ```
|
|
44
|
+
* @augments TempNode
|
|
45
|
+
*/
|
|
12
46
|
class BloomNode extends TempNode {
|
|
13
47
|
|
|
14
48
|
static get type() {
|
|
@@ -17,29 +51,89 @@ class BloomNode extends TempNode {
|
|
|
17
51
|
|
|
18
52
|
}
|
|
19
53
|
|
|
54
|
+
/**
|
|
55
|
+
* Constructs a new bloom node.
|
|
56
|
+
*
|
|
57
|
+
* @param {Node<vec4>} inputNode - The node that represents the input of the effect.
|
|
58
|
+
* @param {Number} [strength=1] - The strength of the bloom.
|
|
59
|
+
* @param {Number} [radius=0] - The radius of the bloom.
|
|
60
|
+
* @param {Number} [threshold=0] - The luminance threshold limits which bright areas contribute to the bloom effect.
|
|
61
|
+
*/
|
|
20
62
|
constructor( inputNode, strength = 1, radius = 0, threshold = 0 ) {
|
|
21
63
|
|
|
22
64
|
super( 'vec4' );
|
|
23
65
|
|
|
66
|
+
/**
|
|
67
|
+
* The node that represents the input of the effect.
|
|
68
|
+
*
|
|
69
|
+
* @type {Node<vec4>}
|
|
70
|
+
*/
|
|
24
71
|
this.inputNode = inputNode;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The strength of the bloom.
|
|
75
|
+
*
|
|
76
|
+
* @type {UniformNode<float>}
|
|
77
|
+
*/
|
|
25
78
|
this.strength = uniform( strength );
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* The radius of the bloom.
|
|
82
|
+
*
|
|
83
|
+
* @type {UniformNode<float>}
|
|
84
|
+
*/
|
|
26
85
|
this.radius = uniform( radius );
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The luminance threshold limits which bright areas contribute to the bloom effect.
|
|
89
|
+
*
|
|
90
|
+
* @type {UniformNode<float>}
|
|
91
|
+
*/
|
|
27
92
|
this.threshold = uniform( threshold );
|
|
28
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Can be used to tweak the extracted luminance from the scene.
|
|
96
|
+
*
|
|
97
|
+
* @type {UniformNode<float>}
|
|
98
|
+
*/
|
|
29
99
|
this.smoothWidth = uniform( 0.01 );
|
|
30
100
|
|
|
31
|
-
|
|
32
|
-
|
|
101
|
+
/**
|
|
102
|
+
* An array that holds the render targets for the horizontal blur passes.
|
|
103
|
+
*
|
|
104
|
+
* @private
|
|
105
|
+
* @type {Array<RenderTarget>}
|
|
106
|
+
*/
|
|
33
107
|
this._renderTargetsHorizontal = [];
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* An array that holds the render targets for the vertical blur passes.
|
|
111
|
+
*
|
|
112
|
+
* @private
|
|
113
|
+
* @type {Array<RenderTarget>}
|
|
114
|
+
*/
|
|
34
115
|
this._renderTargetsVertical = [];
|
|
35
|
-
this._nMips = 5;
|
|
36
116
|
|
|
37
|
-
|
|
117
|
+
/**
|
|
118
|
+
* The number if blur mips.
|
|
119
|
+
*
|
|
120
|
+
* @private
|
|
121
|
+
* @type {Number}
|
|
122
|
+
*/
|
|
123
|
+
this._nMips = 5;
|
|
38
124
|
|
|
125
|
+
/**
|
|
126
|
+
* The render target for the luminance pass.
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
* @type {RenderTarget}
|
|
130
|
+
*/
|
|
39
131
|
this._renderTargetBright = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
|
|
40
132
|
this._renderTargetBright.texture.name = 'UnrealBloomPass.bright';
|
|
41
133
|
this._renderTargetBright.texture.generateMipmaps = false;
|
|
42
134
|
|
|
135
|
+
//
|
|
136
|
+
|
|
43
137
|
for ( let i = 0; i < this._nMips; i ++ ) {
|
|
44
138
|
|
|
45
139
|
const renderTargetHorizontal = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
|
|
@@ -58,33 +152,114 @@ class BloomNode extends TempNode {
|
|
|
58
152
|
|
|
59
153
|
}
|
|
60
154
|
|
|
61
|
-
|
|
62
|
-
|
|
155
|
+
/**
|
|
156
|
+
* The material for the composite pass.
|
|
157
|
+
*
|
|
158
|
+
* @private
|
|
159
|
+
* @type {NodeMaterial?}
|
|
160
|
+
*/
|
|
63
161
|
this._compositeMaterial = null;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The material for the luminance pass.
|
|
165
|
+
*
|
|
166
|
+
* @private
|
|
167
|
+
* @type {NodeMaterial?}
|
|
168
|
+
*/
|
|
64
169
|
this._highPassFilterMaterial = null;
|
|
65
|
-
this._separableBlurMaterials = [];
|
|
66
170
|
|
|
67
|
-
|
|
171
|
+
/**
|
|
172
|
+
* The materials for the blur pass.
|
|
173
|
+
*
|
|
174
|
+
* @private
|
|
175
|
+
* @type {Array<NodeMaterial>}
|
|
176
|
+
*/
|
|
177
|
+
this._separableBlurMaterials = [];
|
|
68
178
|
|
|
179
|
+
/**
|
|
180
|
+
* The result of the luminance pass as a texture node for further processing.
|
|
181
|
+
*
|
|
182
|
+
* @private
|
|
183
|
+
* @type {TextureNode}
|
|
184
|
+
*/
|
|
69
185
|
this._textureNodeBright = texture( this._renderTargetBright.texture );
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The result of the first blur pass as a texture node for further processing.
|
|
189
|
+
*
|
|
190
|
+
* @private
|
|
191
|
+
* @type {TextureNode}
|
|
192
|
+
*/
|
|
70
193
|
this._textureNodeBlur0 = texture( this._renderTargetsVertical[ 0 ].texture );
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* The result of the second blur pass as a texture node for further processing.
|
|
197
|
+
*
|
|
198
|
+
* @private
|
|
199
|
+
* @type {TextureNode}
|
|
200
|
+
*/
|
|
71
201
|
this._textureNodeBlur1 = texture( this._renderTargetsVertical[ 1 ].texture );
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* The result of the third blur pass as a texture node for further processing.
|
|
205
|
+
*
|
|
206
|
+
* @private
|
|
207
|
+
* @type {TextureNode}
|
|
208
|
+
*/
|
|
72
209
|
this._textureNodeBlur2 = texture( this._renderTargetsVertical[ 2 ].texture );
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* The result of the fourth blur pass as a texture node for further processing.
|
|
213
|
+
*
|
|
214
|
+
* @private
|
|
215
|
+
* @type {TextureNode}
|
|
216
|
+
*/
|
|
73
217
|
this._textureNodeBlur3 = texture( this._renderTargetsVertical[ 3 ].texture );
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* The result of the fifth blur pass as a texture node for further processing.
|
|
221
|
+
*
|
|
222
|
+
* @private
|
|
223
|
+
* @type {TextureNode}
|
|
224
|
+
*/
|
|
74
225
|
this._textureNodeBlur4 = texture( this._renderTargetsVertical[ 4 ].texture );
|
|
75
226
|
|
|
227
|
+
/**
|
|
228
|
+
* The result of the effect is represented as a separate texture node.
|
|
229
|
+
*
|
|
230
|
+
* @private
|
|
231
|
+
* @type {PassTextureNode}
|
|
232
|
+
*/
|
|
76
233
|
this._textureOutput = passTexture( this, this._renderTargetsHorizontal[ 0 ].texture );
|
|
77
234
|
|
|
235
|
+
/**
|
|
236
|
+
* The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
|
|
237
|
+
* its effect once per frame in `updateBefore()`.
|
|
238
|
+
*
|
|
239
|
+
* @type {String}
|
|
240
|
+
* @default 'frame'
|
|
241
|
+
*/
|
|
78
242
|
this.updateBeforeType = NodeUpdateType.FRAME;
|
|
79
243
|
|
|
80
244
|
}
|
|
81
245
|
|
|
246
|
+
/**
|
|
247
|
+
* Returns the result of the effect as a texture node.
|
|
248
|
+
*
|
|
249
|
+
* @return {PassTextureNode} A texture node that represents the result of the effect.
|
|
250
|
+
*/
|
|
82
251
|
getTextureNode() {
|
|
83
252
|
|
|
84
253
|
return this._textureOutput;
|
|
85
254
|
|
|
86
255
|
}
|
|
87
256
|
|
|
257
|
+
/**
|
|
258
|
+
* Sets the size of the effect.
|
|
259
|
+
*
|
|
260
|
+
* @param {Number} width - The width of the effect.
|
|
261
|
+
* @param {Number} height - The height of the effect.
|
|
262
|
+
*/
|
|
88
263
|
setSize( width, height ) {
|
|
89
264
|
|
|
90
265
|
let resx = Math.round( width / 2 );
|
|
@@ -106,24 +281,29 @@ class BloomNode extends TempNode {
|
|
|
106
281
|
|
|
107
282
|
}
|
|
108
283
|
|
|
284
|
+
/**
|
|
285
|
+
* This method is used to render the effect once per frame.
|
|
286
|
+
*
|
|
287
|
+
* @param {NodeFrame} frame - The current node frame.
|
|
288
|
+
*/
|
|
109
289
|
updateBefore( frame ) {
|
|
110
290
|
|
|
111
291
|
const { renderer } = frame;
|
|
112
292
|
|
|
113
|
-
_rendererState =
|
|
293
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
114
294
|
|
|
115
295
|
//
|
|
116
296
|
|
|
117
297
|
const size = renderer.getDrawingBufferSize( _size );
|
|
118
298
|
this.setSize( size.width, size.height );
|
|
119
299
|
|
|
120
|
-
// 1. Extract
|
|
300
|
+
// 1. Extract bright areas
|
|
121
301
|
|
|
122
302
|
renderer.setRenderTarget( this._renderTargetBright );
|
|
123
303
|
_quadMesh.material = this._highPassFilterMaterial;
|
|
124
304
|
_quadMesh.render( renderer );
|
|
125
305
|
|
|
126
|
-
// 2. Blur
|
|
306
|
+
// 2. Blur all the mips progressively
|
|
127
307
|
|
|
128
308
|
let inputRenderTarget = this._renderTargetBright;
|
|
129
309
|
|
|
@@ -145,7 +325,7 @@ class BloomNode extends TempNode {
|
|
|
145
325
|
|
|
146
326
|
}
|
|
147
327
|
|
|
148
|
-
// 3. Composite
|
|
328
|
+
// 3. Composite all the mips
|
|
149
329
|
|
|
150
330
|
renderer.setRenderTarget( this._renderTargetsHorizontal[ 0 ] );
|
|
151
331
|
_quadMesh.material = this._compositeMaterial;
|
|
@@ -153,10 +333,16 @@ class BloomNode extends TempNode {
|
|
|
153
333
|
|
|
154
334
|
// restore
|
|
155
335
|
|
|
156
|
-
|
|
336
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
157
337
|
|
|
158
338
|
}
|
|
159
339
|
|
|
340
|
+
/**
|
|
341
|
+
* This method is used to setup the effect's TSL code.
|
|
342
|
+
*
|
|
343
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
344
|
+
* @return {PassTextureNode}
|
|
345
|
+
*/
|
|
160
346
|
setup( builder ) {
|
|
161
347
|
|
|
162
348
|
// luminosity high pass material
|
|
@@ -183,7 +369,7 @@ class BloomNode extends TempNode {
|
|
|
183
369
|
|
|
184
370
|
for ( let i = 0; i < this._nMips; i ++ ) {
|
|
185
371
|
|
|
186
|
-
this._separableBlurMaterials.push( this.
|
|
372
|
+
this._separableBlurMaterials.push( this._getSeparableBlurMaterial( builder, kernelSizeArray[ i ] ) );
|
|
187
373
|
|
|
188
374
|
}
|
|
189
375
|
|
|
@@ -232,6 +418,10 @@ class BloomNode extends TempNode {
|
|
|
232
418
|
|
|
233
419
|
}
|
|
234
420
|
|
|
421
|
+
/**
|
|
422
|
+
* Frees internal resources. This method should be called
|
|
423
|
+
* when the effect is no longer required.
|
|
424
|
+
*/
|
|
235
425
|
dispose() {
|
|
236
426
|
|
|
237
427
|
for ( let i = 0; i < this._renderTargetsHorizontal.length; i ++ ) {
|
|
@@ -250,7 +440,14 @@ class BloomNode extends TempNode {
|
|
|
250
440
|
|
|
251
441
|
}
|
|
252
442
|
|
|
253
|
-
|
|
443
|
+
/**
|
|
444
|
+
* Create a separable blur material for the given kernel radius.
|
|
445
|
+
*
|
|
446
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
447
|
+
* @param {Number} kernelRadius - The kernel radius.
|
|
448
|
+
* @return {NodeMaterial}
|
|
449
|
+
*/
|
|
450
|
+
_getSeparableBlurMaterial( builder, kernelRadius ) {
|
|
254
451
|
|
|
255
452
|
const coefficients = [];
|
|
256
453
|
|
|
@@ -268,9 +465,9 @@ class BloomNode extends TempNode {
|
|
|
268
465
|
const direction = uniform( new Vector2( 0.5, 0.5 ) );
|
|
269
466
|
|
|
270
467
|
const uvNode = uv();
|
|
271
|
-
const sampleTexel = ( uv ) => colorTexture.
|
|
468
|
+
const sampleTexel = ( uv ) => colorTexture.sample( uv );
|
|
272
469
|
|
|
273
|
-
const
|
|
470
|
+
const separableBlurPass = Fn( () => {
|
|
274
471
|
|
|
275
472
|
const weightSum = gaussianCoefficients.element( 0 ).toVar();
|
|
276
473
|
const diffuseSum = sampleTexel( uvNode ).rgb.mul( weightSum ).toVar();
|
|
@@ -291,22 +488,32 @@ class BloomNode extends TempNode {
|
|
|
291
488
|
|
|
292
489
|
} );
|
|
293
490
|
|
|
294
|
-
const
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
491
|
+
const separableBlurMaterial = new NodeMaterial();
|
|
492
|
+
separableBlurMaterial.fragmentNode = separableBlurPass().context( builder.getSharedContext() );
|
|
493
|
+
separableBlurMaterial.name = 'Bloom_separable';
|
|
494
|
+
separableBlurMaterial.needsUpdate = true;
|
|
298
495
|
|
|
299
496
|
// uniforms
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
497
|
+
separableBlurMaterial.colorTexture = colorTexture;
|
|
498
|
+
separableBlurMaterial.direction = direction;
|
|
499
|
+
separableBlurMaterial.invSize = invSize;
|
|
303
500
|
|
|
304
|
-
return
|
|
501
|
+
return separableBlurMaterial;
|
|
305
502
|
|
|
306
503
|
}
|
|
307
504
|
|
|
308
505
|
}
|
|
309
506
|
|
|
507
|
+
/**
|
|
508
|
+
* TSL function for creating a bloom effect.
|
|
509
|
+
*
|
|
510
|
+
* @function
|
|
511
|
+
* @param {Node<vec4>} node - The node that represents the input of the effect.
|
|
512
|
+
* @param {Number} [strength=1] - The strength of the bloom.
|
|
513
|
+
* @param {Number} [radius=0] - The radius of the bloom.
|
|
514
|
+
* @param {Number} [threshold=0] - The luminance threshold limits which bright areas contribute to the bloom effect.
|
|
515
|
+
* @returns {BloomNode}
|
|
516
|
+
*/
|
|
310
517
|
export const bloom = ( node, strength, radius, threshold ) => nodeObject( new BloomNode( nodeObject( node ), strength, radius, threshold ) );
|
|
311
518
|
|
|
312
519
|
export default BloomNode;
|