@plastic-software/three 0.175.14 → 0.178.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 +3 -3
- package/build/three.cjs +7746 -6791
- package/build/three.core.js +7371 -6576
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +189 -29
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +19 -11
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +4989 -2235
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +5082 -2469
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +0 -1
- package/examples/jsm/animation/AnimationClipCreator.js +1 -0
- package/examples/jsm/animation/CCDIKSolver.js +6 -3
- package/examples/jsm/capabilities/WebGL.js +1 -27
- package/examples/jsm/capabilities/WebGPU.js +1 -0
- package/examples/jsm/controls/ArcballControls.js +15 -4
- package/examples/jsm/controls/DragControls.js +1 -0
- package/examples/jsm/controls/FirstPersonControls.js +1 -0
- package/examples/jsm/controls/FlyControls.js +1 -0
- package/examples/jsm/controls/MapControls.js +1 -0
- package/examples/jsm/controls/OrbitControls.js +1 -0
- package/examples/jsm/controls/PointerLockControls.js +5 -3
- package/examples/jsm/controls/TrackballControls.js +1 -0
- package/examples/jsm/controls/TransformControls.js +62 -14
- package/examples/jsm/csm/CSM.js +2 -0
- package/examples/jsm/csm/CSMFrustum.js +2 -0
- package/examples/jsm/csm/CSMHelper.js +1 -0
- package/examples/jsm/csm/CSMShader.js +4 -1
- package/examples/jsm/csm/CSMShadowNode.js +18 -4
- package/examples/jsm/curves/CurveExtras.js +14 -0
- package/examples/jsm/curves/NURBSCurve.js +1 -0
- package/examples/jsm/curves/NURBSSurface.js +2 -0
- package/examples/jsm/curves/NURBSUtils.js +4 -1
- package/examples/jsm/curves/NURBSVolume.js +2 -0
- package/examples/jsm/effects/AnaglyphEffect.js +2 -0
- package/examples/jsm/effects/AsciiEffect.js +2 -0
- package/examples/jsm/effects/OutlineEffect.js +2 -0
- package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
- package/examples/jsm/effects/StereoEffect.js +2 -0
- package/examples/jsm/environments/DebugEnvironment.js +1 -0
- package/examples/jsm/environments/RoomEnvironment.js +49 -35
- package/examples/jsm/exporters/DRACOExporter.js +4 -2
- package/examples/jsm/exporters/EXRExporter.js +2 -0
- package/examples/jsm/exporters/GLTFExporter.js +7 -4
- package/examples/jsm/exporters/KTX2Exporter.js +2 -0
- package/examples/jsm/exporters/OBJExporter.js +3 -1
- package/examples/jsm/exporters/PLYExporter.js +4 -2
- package/examples/jsm/exporters/STLExporter.js +2 -0
- package/examples/jsm/exporters/USDZExporter.js +12 -10
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
- package/examples/jsm/geometries/ConvexGeometry.js +1 -0
- package/examples/jsm/geometries/DecalGeometry.js +1 -0
- package/examples/jsm/geometries/ParametricFunctions.js +4 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -0
- package/examples/jsm/geometries/RoundedBoxGeometry.js +2 -1
- package/examples/jsm/geometries/TeapotGeometry.js +1 -0
- package/examples/jsm/geometries/TextGeometry.js +1 -0
- package/examples/jsm/helpers/LightProbeHelper.js +1 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
- package/examples/jsm/helpers/OctreeHelper.js +1 -0
- package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
- package/examples/jsm/helpers/RapierHelper.js +59 -0
- package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
- package/examples/jsm/helpers/TextureHelper.js +1 -0
- package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
- package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
- package/examples/jsm/helpers/ViewHelper.js +1 -0
- package/examples/jsm/interactive/HTMLMesh.js +7 -0
- package/examples/jsm/interactive/InteractiveGroup.js +1 -0
- package/examples/jsm/interactive/SelectionBox.js +2 -0
- package/examples/jsm/interactive/SelectionHelper.js +2 -0
- package/examples/jsm/lighting/TiledLighting.js +1 -0
- package/examples/jsm/lights/LightProbeGenerator.js +1 -0
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
- package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
- package/examples/jsm/lines/Line2.js +1 -0
- package/examples/jsm/lines/LineGeometry.js +1 -0
- package/examples/jsm/lines/LineMaterial.js +4 -4
- package/examples/jsm/lines/LineSegments2.js +1 -0
- package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
- package/examples/jsm/lines/Wireframe.js +1 -0
- package/examples/jsm/lines/WireframeGeometry2.js +1 -0
- package/examples/jsm/lines/webgpu/Line2.js +1 -0
- package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
- package/examples/jsm/loaders/3DMLoader.js +1 -0
- package/examples/jsm/loaders/3MFLoader.js +1 -0
- package/examples/jsm/loaders/AMFLoader.js +1 -0
- package/examples/jsm/loaders/BVHLoader.js +1 -0
- package/examples/jsm/loaders/ColladaLoader.js +6 -5
- package/examples/jsm/loaders/DDSLoader.js +1 -0
- package/examples/jsm/loaders/DRACOLoader.js +2 -1
- package/examples/jsm/loaders/EXRLoader.js +1 -0
- package/examples/jsm/loaders/FBXLoader.js +25 -23
- package/examples/jsm/loaders/FontLoader.js +1 -0
- package/examples/jsm/loaders/GCodeLoader.js +1 -0
- package/examples/jsm/loaders/GLTFLoader.js +10 -82
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
- package/examples/jsm/loaders/IESLoader.js +1 -0
- package/examples/jsm/loaders/KMZLoader.js +1 -0
- package/examples/jsm/loaders/KTX2Loader.js +67 -26
- package/examples/jsm/loaders/KTXLoader.js +1 -0
- package/examples/jsm/loaders/LDrawLoader.js +55 -3
- package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
- package/examples/jsm/loaders/LUTImageLoader.js +1 -0
- package/examples/jsm/loaders/LWOLoader.js +1 -13
- package/examples/jsm/loaders/LottieLoader.js +15 -0
- package/examples/jsm/loaders/MD2Loader.js +1 -0
- package/examples/jsm/loaders/MDDLoader.js +1 -0
- package/examples/jsm/loaders/MTLLoader.js +4 -3
- package/examples/jsm/loaders/MaterialXLoader.js +1 -0
- package/examples/jsm/loaders/NRRDLoader.js +1 -0
- package/examples/jsm/loaders/OBJLoader.js +1 -0
- package/examples/jsm/loaders/PCDLoader.js +122 -19
- package/examples/jsm/loaders/PDBLoader.js +1 -0
- package/examples/jsm/loaders/PLYLoader.js +1 -0
- package/examples/jsm/loaders/PVRLoader.js +1 -0
- package/examples/jsm/loaders/RGBELoader.js +1 -0
- package/examples/jsm/loaders/RGBMLoader.js +1 -0
- package/examples/jsm/loaders/STLLoader.js +1 -0
- package/examples/jsm/loaders/SVGLoader.js +1 -0
- package/examples/jsm/loaders/TDSLoader.js +1 -0
- package/examples/jsm/loaders/TGALoader.js +1 -0
- package/examples/jsm/loaders/TIFFLoader.js +1 -0
- package/examples/jsm/loaders/TTFLoader.js +1 -0
- package/examples/jsm/loaders/USDZLoader.js +1 -0
- package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
- package/examples/jsm/loaders/VOXLoader.js +1 -0
- package/examples/jsm/loaders/VRMLLoader.js +3 -2
- package/examples/jsm/loaders/VTKLoader.js +1 -0
- package/examples/jsm/loaders/XYZLoader.js +1 -0
- package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
- package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
- package/examples/jsm/math/Capsule.js +2 -0
- package/examples/jsm/math/ColorConverter.js +1 -0
- package/examples/jsm/math/ConvexHull.js +2 -0
- package/examples/jsm/math/ImprovedNoise.js +19 -14
- package/examples/jsm/math/Lut.js +2 -0
- package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
- package/examples/jsm/math/OBB.js +2 -0
- package/examples/jsm/math/Octree.js +20 -1
- package/examples/jsm/math/SimplexNoise.js +2 -0
- package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/Gyroscope.js +1 -0
- package/examples/jsm/misc/MD2Character.js +2 -0
- package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
- package/examples/jsm/misc/MorphAnimMesh.js +1 -0
- package/examples/jsm/misc/MorphBlendMesh.js +1 -0
- package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +5 -0
- package/examples/jsm/misc/Timer.js +2 -0
- package/examples/jsm/misc/TubePainter.js +1 -0
- package/examples/jsm/misc/Volume.js +2 -0
- package/examples/jsm/misc/VolumeSlice.js +1 -0
- package/examples/jsm/modifiers/CurveModifier.js +3 -0
- package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
- package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
- package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
- package/examples/jsm/modifiers/TessellateModifier.js +2 -0
- package/examples/jsm/objects/GroundedSkybox.js +1 -0
- package/examples/jsm/objects/Lensflare.js +3 -0
- package/examples/jsm/objects/LensflareMesh.js +1 -0
- package/examples/jsm/objects/MarchingCubes.js +2 -0
- package/examples/jsm/objects/Reflector.js +1 -0
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Refractor.js +1 -0
- package/examples/jsm/objects/ShadowMesh.js +1 -0
- package/examples/jsm/objects/Sky.js +2 -1
- package/examples/jsm/objects/SkyMesh.js +20 -17
- package/examples/jsm/objects/Water.js +1 -0
- package/examples/jsm/objects/Water2.js +1 -0
- package/examples/jsm/objects/Water2Mesh.js +3 -1
- package/examples/jsm/objects/WaterMesh.js +2 -1
- package/examples/jsm/physics/AmmoPhysics.js +1 -0
- package/examples/jsm/physics/JoltPhysics.js +1 -0
- package/examples/jsm/physics/RapierPhysics.js +139 -12
- package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -1
- package/examples/jsm/postprocessing/BokehPass.js +2 -1
- package/examples/jsm/postprocessing/ClearPass.js +1 -0
- package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
- package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
- package/examples/jsm/postprocessing/EffectComposer.js +4 -2
- package/examples/jsm/postprocessing/FXAAPass.js +40 -0
- package/examples/jsm/postprocessing/FilmPass.js +1 -0
- package/examples/jsm/postprocessing/GTAOPass.js +4 -3
- package/examples/jsm/postprocessing/GlitchPass.js +2 -1
- package/examples/jsm/postprocessing/HalftonePass.js +2 -1
- package/examples/jsm/postprocessing/LUTPass.js +1 -0
- package/examples/jsm/postprocessing/MaskPass.js +1 -0
- package/examples/jsm/postprocessing/OutlinePass.js +5 -2
- package/examples/jsm/postprocessing/OutputPass.js +1 -0
- package/examples/jsm/postprocessing/Pass.js +3 -1
- package/examples/jsm/postprocessing/RenderPass.js +1 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
- package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
- package/examples/jsm/postprocessing/SAOPass.js +3 -2
- package/examples/jsm/postprocessing/SMAAPass.js +3 -2
- package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
- package/examples/jsm/postprocessing/SSAOPass.js +2 -1
- package/examples/jsm/postprocessing/SSRPass.js +4 -3
- package/examples/jsm/postprocessing/SavePass.js +2 -1
- package/examples/jsm/postprocessing/ShaderPass.js +1 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
- package/examples/jsm/postprocessing/TexturePass.js +1 -0
- package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
- package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
- package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
- package/examples/jsm/renderers/Projector.js +2 -0
- package/examples/jsm/renderers/SVGRenderer.js +3 -0
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
- package/examples/jsm/shaders/AfterimageShader.js +4 -1
- package/examples/jsm/shaders/BasicShader.js +4 -1
- package/examples/jsm/shaders/BleachBypassShader.js +4 -1
- package/examples/jsm/shaders/BlendShader.js +4 -1
- package/examples/jsm/shaders/BokehShader.js +4 -1
- package/examples/jsm/shaders/BokehShader2.js +4 -1
- package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
- package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
- package/examples/jsm/shaders/ColorifyShader.js +4 -1
- package/examples/jsm/shaders/ConvolutionShader.js +4 -1
- package/examples/jsm/shaders/CopyShader.js +4 -1
- package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/DigitalGlitch.js +4 -1
- package/examples/jsm/shaders/DotScreenShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +4 -1
- package/examples/jsm/shaders/FXAAShader.js +4 -1
- package/examples/jsm/shaders/FilmShader.js +4 -1
- package/examples/jsm/shaders/FocusShader.js +4 -1
- package/examples/jsm/shaders/FreiChenShader.js +4 -1
- package/examples/jsm/shaders/GTAOShader.js +4 -1
- package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
- package/examples/jsm/shaders/GodRaysShader.js +4 -1
- package/examples/jsm/shaders/HalftoneShader.js +4 -1
- package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
- package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
- package/examples/jsm/shaders/HueSaturationShader.js +4 -1
- package/examples/jsm/shaders/KaleidoShader.js +4 -1
- package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
- package/examples/jsm/shaders/LuminosityShader.js +4 -1
- package/examples/jsm/shaders/MirrorShader.js +4 -1
- package/examples/jsm/shaders/NormalMapShader.js +4 -1
- package/examples/jsm/shaders/OutputShader.js +4 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
- package/examples/jsm/shaders/RGBShiftShader.js +4 -1
- package/examples/jsm/shaders/SAOShader.js +4 -1
- package/examples/jsm/shaders/SMAAShader.js +1 -0
- package/examples/jsm/shaders/SSAOShader.js +4 -1
- package/examples/jsm/shaders/SSRShader.js +1 -0
- package/examples/jsm/shaders/SepiaShader.js +4 -1
- package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
- package/examples/jsm/shaders/TechnicolorShader.js +4 -1
- package/examples/jsm/shaders/ToonShader.js +2 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +4 -1
- package/examples/jsm/shaders/VelocityShader.js +4 -1
- package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
- package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
- package/examples/jsm/shaders/VignetteShader.js +4 -1
- package/examples/jsm/shaders/VolumeShader.js +5 -2
- package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
- package/examples/jsm/textures/FlakesTexture.js +2 -0
- package/examples/jsm/transpiler/AST.js +381 -30
- package/examples/jsm/transpiler/GLSLDecoder.js +226 -87
- package/examples/jsm/transpiler/Linker.js +327 -0
- package/examples/jsm/transpiler/TSLEncoder.js +234 -85
- package/examples/jsm/transpiler/Transpiler.js +19 -1
- package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
- package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
- package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
- package/examples/jsm/tsl/display/BloomNode.js +1 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
- package/examples/jsm/tsl/display/FXAANode.js +3 -2
- package/examples/jsm/tsl/display/FilmNode.js +1 -0
- package/examples/jsm/tsl/display/GTAONode.js +1 -0
- package/examples/jsm/tsl/display/GaussianBlurNode.js +4 -29
- package/examples/jsm/tsl/display/LensflareNode.js +1 -0
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
- package/examples/jsm/tsl/display/OutlineNode.js +1 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
- package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
- package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
- package/examples/jsm/tsl/display/SMAANode.js +9 -8
- package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
- package/examples/jsm/tsl/display/SSRNode.js +1 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
- package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
- package/examples/jsm/tsl/display/TransitionNode.js +1 -0
- package/examples/jsm/tsl/display/hashBlur.js +28 -6
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
- package/examples/jsm/tsl/math/Bayer.js +4 -1
- package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
- package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
- package/examples/jsm/tsl/utils/Raymarching.js +6 -3
- package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
- package/examples/jsm/utils/CameraUtils.js +4 -1
- package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
- package/examples/jsm/utils/GeometryUtils.js +4 -1
- package/examples/jsm/utils/LDrawUtils.js +2 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -0
- package/examples/jsm/utils/SceneUtils.js +4 -1
- package/examples/jsm/utils/ShadowMapViewer.js +2 -0
- package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
- package/examples/jsm/utils/SkeletonUtils.js +4 -1
- package/examples/jsm/utils/SortUtils.js +4 -1
- package/examples/jsm/utils/UVsDebug.js +4 -1
- package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
- package/examples/jsm/utils/WorkerPool.js +2 -0
- package/examples/jsm/webxr/ARButton.js +1 -0
- package/examples/jsm/webxr/OculusHandModel.js +1 -0
- package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
- package/examples/jsm/webxr/Text2D.js +4 -1
- package/examples/jsm/webxr/VRButton.js +1 -0
- package/examples/jsm/webxr/XRButton.js +1 -0
- package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
- package/examples/jsm/webxr/XREstimatedLight.js +1 -0
- package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
- package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
- package/examples/jsm/webxr/XRPlanes.js +1 -0
- package/package.json +6 -4
- package/src/Three.Core.js +1 -1
- package/src/Three.TSL.js +18 -10
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +3 -0
- package/src/audio/AudioListener.js +13 -10
- package/src/cameras/ArrayCamera.js +9 -1
- package/src/constants.js +47 -20
- package/src/core/BufferAttribute.js +3 -3
- package/src/core/BufferGeometry.js +2 -5
- package/src/core/Clock.js +2 -8
- package/src/core/GLBufferAttribute.js +13 -1
- package/src/core/Object3D.js +23 -22
- package/src/core/RenderTarget.js +65 -21
- package/src/core/RenderTarget3D.js +1 -0
- package/src/extras/TextureUtils.js +1 -5
- package/src/extras/core/Curve.js +1 -1
- package/src/extras/core/Path.js +22 -22
- package/src/geometries/CapsuleGeometry.js +167 -17
- package/src/geometries/ExtrudeGeometry.js +39 -29
- package/src/helpers/ArrowHelper.js +2 -2
- package/src/helpers/SkeletonHelper.js +1 -1
- package/src/lights/LightShadow.js +14 -0
- package/src/lights/SpotLightShadow.js +9 -1
- package/src/lights/webgpu/ProjectorLight.js +46 -0
- package/src/loaders/BufferGeometryLoader.js +1 -10
- package/src/loaders/FileLoader.js +2 -2
- package/src/loaders/ImageBitmapLoader.js +25 -9
- package/src/loaders/ImageLoader.js +55 -8
- package/src/loaders/ObjectLoader.js +44 -16
- package/src/loaders/nodes/NodeObjectLoader.js +2 -2
- package/src/materials/Material.js +1 -7
- package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
- package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
- package/src/materials/nodes/NodeMaterial.js +105 -19
- package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
- package/src/math/Box3.js +28 -0
- package/src/math/Color.js +7 -7
- package/src/math/ColorManagement.js +22 -3
- package/src/math/Frustum.js +6 -1
- package/src/math/FrustumArray.js +253 -0
- package/src/math/Quaternion.js +1 -1
- package/src/math/Ray.js +2 -0
- package/src/math/Sphere.js +28 -0
- package/src/nodes/Nodes.js +2 -3
- package/src/nodes/TSL.js +5 -3
- package/src/nodes/accessors/AccessorsUtils.js +7 -8
- package/src/nodes/accessors/Bitangent.js +54 -26
- package/src/nodes/accessors/Camera.js +31 -4
- package/src/nodes/accessors/CubeTextureNode.js +50 -2
- package/src/nodes/accessors/InstanceNode.js +5 -4
- package/src/nodes/accessors/Lights.js +2 -2
- package/src/nodes/accessors/MaterialNode.js +4 -0
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +102 -16
- package/src/nodes/accessors/Object3DNode.js +7 -8
- package/src/nodes/accessors/Position.js +14 -4
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +1 -1
- package/src/nodes/accessors/ReflectVector.js +3 -3
- package/src/nodes/accessors/SkinningNode.js +3 -2
- package/src/nodes/accessors/StorageBufferNode.js +25 -0
- package/src/nodes/accessors/StorageTextureNode.js +14 -3
- package/src/nodes/accessors/Tangent.js +25 -17
- package/src/nodes/accessors/TangentUtils.js +46 -0
- package/src/nodes/accessors/TextureBicubic.js +21 -3
- package/src/nodes/accessors/TextureNode.js +59 -8
- package/src/nodes/accessors/UniformArrayNode.js +0 -16
- package/src/nodes/accessors/VelocityNode.js +1 -0
- package/src/nodes/accessors/VertexColorNode.js +4 -4
- package/src/nodes/code/CodeNode.js +8 -11
- package/src/nodes/core/AssignNode.js +27 -5
- package/src/nodes/core/AttributeNode.js +2 -2
- package/src/nodes/core/ContextNode.js +7 -3
- package/src/nodes/core/Node.js +69 -20
- package/src/nodes/core/NodeBuilder.js +248 -29
- package/src/nodes/core/NodeUtils.js +42 -0
- package/src/nodes/core/NodeVarying.js +19 -1
- package/src/nodes/core/PropertyNode.js +8 -12
- package/src/nodes/core/StackNode.js +129 -26
- package/src/nodes/core/StructTypeNode.js +26 -4
- package/src/nodes/core/SubBuildNode.js +89 -0
- package/src/nodes/core/VarNode.js +11 -2
- package/src/nodes/core/VaryingNode.js +45 -24
- package/src/nodes/display/BlendModes.js +42 -1
- package/src/nodes/display/ColorSpaceNode.js +4 -27
- package/src/nodes/display/FrontFacingNode.js +34 -2
- package/src/nodes/display/NormalMapNode.js +19 -50
- package/src/nodes/display/PassNode.js +18 -19
- package/src/nodes/display/ScreenNode.js +0 -26
- package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
- package/src/nodes/functions/PhongLightingModel.js +3 -3
- package/src/nodes/functions/PhysicalLightingModel.js +14 -14
- package/src/nodes/functions/ShadowMaskModel.js +5 -1
- package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
- package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
- package/src/nodes/gpgpu/BarrierNode.js +3 -3
- package/src/nodes/gpgpu/ComputeNode.js +1 -1
- package/src/nodes/lighting/AnalyticLightNode.js +7 -13
- package/src/nodes/lighting/EnvironmentNode.js +5 -5
- package/src/nodes/lighting/HemisphereLightNode.js +2 -2
- package/src/nodes/lighting/IESSpotLightNode.js +2 -1
- package/src/nodes/lighting/LightsNode.js +29 -11
- package/src/nodes/lighting/ProjectorLightNode.js +78 -0
- package/src/nodes/lighting/ShadowBaseNode.js +1 -12
- package/src/nodes/lighting/ShadowFilterNode.js +274 -0
- package/src/nodes/lighting/ShadowNode.js +174 -242
- package/src/nodes/lighting/SpotLightNode.js +44 -7
- package/src/nodes/materialx/lib/mx_noise.js +1 -1
- package/src/nodes/math/ConditionalNode.js +0 -19
- package/src/nodes/math/MathNode.js +68 -21
- package/src/nodes/math/OperatorNode.js +108 -98
- package/src/nodes/shapes/Shapes.js +5 -4
- package/src/nodes/tsl/TSLBase.js +1 -0
- package/src/nodes/tsl/TSLCore.js +160 -65
- package/src/nodes/utils/DebugNode.js +15 -3
- package/src/nodes/utils/Discard.js +2 -2
- package/src/nodes/utils/EquirectUV.js +27 -0
- package/src/nodes/utils/LoopNode.js +64 -34
- package/src/nodes/utils/MatcapUV.js +22 -0
- package/src/nodes/utils/RTTNode.js +13 -5
- package/src/nodes/utils/ReflectorNode.js +77 -7
- package/src/nodes/utils/SampleNode.js +81 -0
- package/src/nodes/utils/TriplanarTextures.js +65 -0
- package/src/objects/BatchedMesh.js +16 -4
- package/src/objects/Mesh.js +9 -0
- package/src/objects/Skeleton.js +1 -1
- package/src/objects/Sprite.js +9 -0
- package/src/renderers/WebGL3DRenderTarget.js +1 -0
- package/src/renderers/WebGLArrayRenderTarget.js +1 -0
- package/src/renderers/WebGLCubeRenderTarget.js +2 -4
- package/src/renderers/WebGLRenderer.js +25 -11
- package/src/renderers/common/Animation.js +2 -2
- package/src/renderers/common/Background.js +13 -2
- package/src/renderers/common/CubeRenderTarget.js +1 -1
- package/src/renderers/common/RenderList.js +0 -4
- package/src/renderers/common/RenderObject.js +80 -4
- package/src/renderers/common/Renderer.js +116 -8
- package/src/renderers/common/Storage3DTexture.js +79 -0
- package/src/renderers/common/StorageArrayTexture.js +63 -0
- package/src/renderers/common/Textures.js +15 -21
- package/src/renderers/common/TimestampQueryPool.js +1 -0
- package/src/renderers/common/Uniform.js +1 -1
- package/src/renderers/common/UniformsGroup.js +14 -18
- package/src/renderers/common/XRManager.js +157 -27
- package/src/renderers/common/XRRenderTarget.js +21 -4
- package/src/renderers/common/extras/PMREMGenerator.js +30 -23
- package/src/renderers/common/nodes/Nodes.js +13 -3
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
- package/src/renderers/webgl/WebGLAttributes.js +4 -0
- package/src/renderers/webgl/WebGLPrograms.js +4 -2
- package/src/renderers/webgl/WebGLShadowMap.js +3 -2
- package/src/renderers/webgl/WebGLState.js +4 -4
- package/src/renderers/webgl/WebGLTextures.js +144 -4
- package/src/renderers/webgl/WebGLUtils.js +1 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +244 -87
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +73 -7
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
- package/src/renderers/webgpu/WebGPUBackend.js +451 -128
- package/src/renderers/webgpu/WebGPURenderer.js +7 -0
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +86 -33
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +28 -5
- package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +45 -50
- package/src/renderers/webxr/WebXRController.js +1 -1
- package/src/renderers/webxr/WebXRManager.js +2 -1
- package/src/textures/DepthTexture.js +6 -10
- package/src/textures/Source.js +22 -0
- package/src/textures/Texture.js +118 -1
- package/src/textures/VideoTexture.js +1 -1
- package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
- package/src/core/RenderTargetArray.js +0 -40
- package/src/nodes/utils/EquirectUVNode.js +0 -65
- package/src/nodes/utils/MatcapUVNode.js +0 -49
- package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
|
@@ -7,6 +7,7 @@ import { nodeObject, Fn, uv, uniform, convertToTexture, vec2, vec3, vec4, mat3,
|
|
|
7
7
|
* space conversion.
|
|
8
8
|
*
|
|
9
9
|
* @augments TempNode
|
|
10
|
+
* @three_import import { sobel } from 'three/addons/tsl/display/SobelOperatorNode.js';
|
|
10
11
|
*/
|
|
11
12
|
class SobelOperatorNode extends TempNode {
|
|
12
13
|
|
|
@@ -9,6 +9,7 @@ let _rendererState;
|
|
|
9
9
|
* A special render pass node that renders the scene as a stereoscopic image.
|
|
10
10
|
*
|
|
11
11
|
* @augments PassNode
|
|
12
|
+
* @three_import import { stereoPass } from 'three/addons/tsl/display/StereoPassNode.js';
|
|
12
13
|
*/
|
|
13
14
|
class StereoPassNode extends PassNode {
|
|
14
15
|
|
|
@@ -17,6 +17,7 @@ let _rendererState;
|
|
|
17
17
|
* - {@link https://www.elopezr.com/temporal-aa-and-the-quest-for-the-holy-trail/}
|
|
18
18
|
*
|
|
19
19
|
* @augments PassNode
|
|
20
|
+
* @three_import import { traaPass } from 'three/addons/tsl/display/TRAAPassNode.js';
|
|
20
21
|
*/
|
|
21
22
|
class TRAAPassNode extends PassNode {
|
|
22
23
|
|
|
@@ -153,7 +154,7 @@ class TRAAPassNode extends PassNode {
|
|
|
153
154
|
const { renderer } = frame;
|
|
154
155
|
const { scene, camera } = this;
|
|
155
156
|
|
|
156
|
-
_rendererState = RendererUtils.
|
|
157
|
+
_rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
|
|
157
158
|
|
|
158
159
|
//
|
|
159
160
|
|
|
@@ -291,7 +292,7 @@ class TRAAPassNode extends PassNode {
|
|
|
291
292
|
|
|
292
293
|
velocityOutput.setProjectionMatrix( null );
|
|
293
294
|
|
|
294
|
-
RendererUtils.
|
|
295
|
+
RendererUtils.restoreRendererState( renderer, _rendererState );
|
|
295
296
|
|
|
296
297
|
}
|
|
297
298
|
|
|
@@ -379,8 +380,8 @@ class TRAAPassNode extends PassNode {
|
|
|
379
380
|
const currentWeight = float( 0.05 ).toVar();
|
|
380
381
|
const historyWeight = currentWeight.oneMinus().toVar();
|
|
381
382
|
|
|
382
|
-
const compressedCurrent = currentColor.mul( float( 1 ).div( ( max(
|
|
383
|
-
const compressedHistory = clampedHistoryColor.mul( float( 1 ).div( ( max(
|
|
383
|
+
const compressedCurrent = currentColor.mul( float( 1 ).div( ( max( currentColor.r, currentColor.g, currentColor.b ).add( 1.0 ) ) ) );
|
|
384
|
+
const compressedHistory = clampedHistoryColor.mul( float( 1 ).div( ( max( clampedHistoryColor.r, clampedHistoryColor.g, clampedHistoryColor.b ).add( 1.0 ) ) ) );
|
|
384
385
|
|
|
385
386
|
const luminanceCurrent = luminance( compressedCurrent.rgb );
|
|
386
387
|
const luminanceHistory = luminance( compressedHistory.rgb );
|
|
@@ -5,6 +5,7 @@ import { nodeObject, Fn, float, uv, convertToTexture, vec4, If, int, clamp, sub,
|
|
|
5
5
|
* Post processing node for creating a transition effect between scenes.
|
|
6
6
|
*
|
|
7
7
|
* @augments TempNode
|
|
8
|
+
* @three_import import { transition } from 'three/addons/tsl/display/TransitionNode.js';
|
|
8
9
|
*/
|
|
9
10
|
class TransitionNode extends TempNode {
|
|
10
11
|
|
|
@@ -1,20 +1,42 @@
|
|
|
1
|
-
import { float, Fn, vec2, uv, sin, rand, degrees, cos, Loop, vec4 } from 'three/tsl';
|
|
1
|
+
import { float, Fn, vec2, uv, sin, rand, degrees, cos, Loop, vec4, premultiplyAlpha, unpremultiplyAlpha } from 'three/tsl';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Applies a hash blur effect to the given texture node.
|
|
5
5
|
*
|
|
6
6
|
* Reference: {@link https://www.shadertoy.com/view/4lXXWn}.
|
|
7
7
|
*
|
|
8
|
-
* @tsl
|
|
9
8
|
* @function
|
|
10
9
|
* @param {Node<vec4>} textureNode - The texture node that should be blurred.
|
|
11
10
|
* @param {Node<float>} [bluramount=float(0.1)] - This node determines the amount of blur.
|
|
12
|
-
* @param {
|
|
11
|
+
* @param {Object} [options={}] - Additional options for the hash blur effect.
|
|
12
|
+
* @param {Node<float>} [options.repeats=float(45)] - The number of iterations for the blur effect.
|
|
13
|
+
* @param {Node<vec4>} [options.mask=null] - A mask node to control the alpha blending of the blur.
|
|
14
|
+
* @param {boolean} [options.premultipliedAlpha=false] - Whether to use premultiplied alpha for the blur effect.
|
|
13
15
|
* @return {Node<vec4>} The blurred texture node.
|
|
14
16
|
*/
|
|
15
|
-
export const hashBlur = /*#__PURE__*/ Fn( ( [ textureNode, bluramount = float( 0.1 ),
|
|
17
|
+
export const hashBlur = /*#__PURE__*/ Fn( ( [ textureNode, bluramount = float( 0.1 ), options = {} ] ) => {
|
|
16
18
|
|
|
17
|
-
const
|
|
19
|
+
const {
|
|
20
|
+
repeats = float( 45 ),
|
|
21
|
+
mask = null,
|
|
22
|
+
premultipliedAlpha = false
|
|
23
|
+
} = options;
|
|
24
|
+
|
|
25
|
+
const draw = ( uv ) => {
|
|
26
|
+
|
|
27
|
+
let sample = textureNode.sample( uv );
|
|
28
|
+
|
|
29
|
+
if ( mask !== null ) {
|
|
30
|
+
|
|
31
|
+
const alpha = mask.sample( uv ).x;
|
|
32
|
+
|
|
33
|
+
sample = vec4( sample.rgb, sample.a.mul( alpha ) );
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return premultipliedAlpha ? premultiplyAlpha( sample ) : sample;
|
|
38
|
+
|
|
39
|
+
};
|
|
18
40
|
|
|
19
41
|
const targetUV = textureNode.uvNode || uv();
|
|
20
42
|
const blurred_image = vec4( 0. ).toVar();
|
|
@@ -29,6 +51,6 @@ export const hashBlur = /*#__PURE__*/ Fn( ( [ textureNode, bluramount = float( 0
|
|
|
29
51
|
|
|
30
52
|
blurred_image.divAssign( repeats );
|
|
31
53
|
|
|
32
|
-
return blurred_image;
|
|
54
|
+
return premultipliedAlpha ? unpremultiplyAlpha( blurred_image ) : blurred_image;
|
|
33
55
|
|
|
34
56
|
} );
|
|
@@ -40,6 +40,7 @@ const _size = /*@__PURE__*/ new Vector2();
|
|
|
40
40
|
* a custom implementation.
|
|
41
41
|
*
|
|
42
42
|
* @augments LightsNode
|
|
43
|
+
* @three_import import { tiledLights } from 'three/addons/tsl/lighting/TiledLightsNode.js';
|
|
43
44
|
*/
|
|
44
45
|
class TiledLightsNode extends LightsNode {
|
|
45
46
|
|
|
@@ -233,8 +234,8 @@ class TiledLightsNode extends LightsNode {
|
|
|
233
234
|
const lightingModel = builder.context.reflectedLight;
|
|
234
235
|
|
|
235
236
|
// force declaration order, before of the loop
|
|
236
|
-
lightingModel.directDiffuse.
|
|
237
|
-
lightingModel.directSpecular.
|
|
237
|
+
lightingModel.directDiffuse.toStack();
|
|
238
|
+
lightingModel.directSpecular.toStack();
|
|
238
239
|
|
|
239
240
|
super.setupLights( builder, lightNodes );
|
|
240
241
|
|
|
@@ -261,7 +262,7 @@ class TiledLightsNode extends LightsNode {
|
|
|
261
262
|
|
|
262
263
|
} );
|
|
263
264
|
|
|
264
|
-
} )()
|
|
265
|
+
}, 'void' )();
|
|
265
266
|
|
|
266
267
|
}
|
|
267
268
|
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { TextureLoader } from 'three';
|
|
2
2
|
import { Fn, int, ivec2, textureLoad } from 'three/tsl';
|
|
3
3
|
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* @module Bayer
|
|
6
|
+
* @three_import import { bayer16 } from 'three/addons/tsl/math/Bayer.js';
|
|
7
|
+
*/
|
|
5
8
|
|
|
6
9
|
let bayer16Texture = null;
|
|
7
10
|
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Vector3,
|
|
3
|
+
Object3D,
|
|
4
|
+
ShadowBaseNode,
|
|
5
|
+
Plane,
|
|
6
|
+
Line3,
|
|
7
|
+
DepthTexture,
|
|
8
|
+
LessCompare,
|
|
9
|
+
Vector2,
|
|
10
|
+
RedFormat,
|
|
11
|
+
ArrayCamera,
|
|
12
|
+
VSMShadowMap,
|
|
13
|
+
RendererUtils,
|
|
14
|
+
Quaternion
|
|
15
|
+
} from 'three/webgpu';
|
|
16
|
+
|
|
17
|
+
import { min, Fn, shadow, NodeUpdateType, getShadowMaterial, getShadowRenderObjectFunction } from 'three/tsl';
|
|
18
|
+
|
|
19
|
+
const { resetRendererAndSceneState, restoreRendererAndSceneState } = RendererUtils;
|
|
20
|
+
let _rendererState;
|
|
21
|
+
|
|
22
|
+
const _cameraLayers = [];
|
|
23
|
+
const _vec3Temp1 = /*@__PURE__*/ new Vector3();
|
|
24
|
+
const _vec3Temp2 = /*@__PURE__*/ new Vector3();
|
|
25
|
+
const _vec3Temp3 = /*@__PURE__*/ new Vector3();
|
|
26
|
+
const _quatTemp1 = /*@__PURE__*/ new Quaternion();
|
|
27
|
+
|
|
28
|
+
class LwLight extends Object3D {
|
|
29
|
+
|
|
30
|
+
constructor() {
|
|
31
|
+
|
|
32
|
+
super();
|
|
33
|
+
this.target = new Object3D();
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A class that extends `ShadowBaseNode` to implement tiled shadow mapping.
|
|
41
|
+
* This allows splitting a shadow map into multiple tiles, each with its own light and camera,
|
|
42
|
+
* to improve shadow quality and performance for large scenes.
|
|
43
|
+
*
|
|
44
|
+
* **Note:** This class does not support `VSMShadowMap` at the moment.
|
|
45
|
+
*
|
|
46
|
+
* @class
|
|
47
|
+
* @augments ShadowBaseNode
|
|
48
|
+
* @three_import import { TileShadowNode } from 'three/addons/tsl/shadows/TileShadowNode.js';
|
|
49
|
+
*/
|
|
50
|
+
class TileShadowNode extends ShadowBaseNode {
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Creates an instance of `TileShadowNode`.
|
|
54
|
+
*
|
|
55
|
+
* @param {Light} light - The original light source used for shadow mapping.
|
|
56
|
+
* @param {Object} [options={}] - Configuration options for the tiled shadow node.
|
|
57
|
+
* @param {number} [options.tilesX=2] - The number of tiles along the X-axis.
|
|
58
|
+
* @param {number} [options.tilesY=2] - The number of tiles along the Y-axis.
|
|
59
|
+
* @param {Object} [options.resolution] - The resolution of the shadow map.
|
|
60
|
+
* @param {boolean} [options.debug=false] - Whether to enable debug mode.
|
|
61
|
+
*/
|
|
62
|
+
constructor( light, options = {} ) {
|
|
63
|
+
|
|
64
|
+
super( light );
|
|
65
|
+
|
|
66
|
+
// Default configuration with sensible defaults
|
|
67
|
+
this.config = {
|
|
68
|
+
tilesX: options.tilesX || 2,
|
|
69
|
+
tilesY: options.tilesY || 2,
|
|
70
|
+
resolution: options.resolution || light.shadow.mapSize,
|
|
71
|
+
debug: options.debug !== undefined ? options.debug : false
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
this.debug = this.config.debug;
|
|
75
|
+
|
|
76
|
+
this.originalLight = light;
|
|
77
|
+
this.lightPlane = new Plane( new Vector3( 0, 1, 0 ), 0 );
|
|
78
|
+
this.line = new Line3();
|
|
79
|
+
|
|
80
|
+
this.initialLightDirection = new Vector3();
|
|
81
|
+
this.updateLightDirection();
|
|
82
|
+
|
|
83
|
+
this._cameraFrameId = new WeakMap();
|
|
84
|
+
|
|
85
|
+
this.shadowSize = {
|
|
86
|
+
top: light.shadow.camera.top,
|
|
87
|
+
bottom: light.shadow.camera.bottom,
|
|
88
|
+
left: light.shadow.camera.left,
|
|
89
|
+
right: light.shadow.camera.right,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
this.lights = [];
|
|
93
|
+
this._shadowNodes = [];
|
|
94
|
+
|
|
95
|
+
this.tiles = this.generateTiles( this.config.tilesX, this.config.tilesY );
|
|
96
|
+
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Generates the tiles for the shadow map based on the specified number of tiles along the X and Y axes.
|
|
101
|
+
*
|
|
102
|
+
* @param {number} tilesX - The number of tiles along the X-axis.
|
|
103
|
+
* @param {number} tilesY - The number of tiles along the Y-axis.
|
|
104
|
+
* @returns {Array<Object>} An array of tile objects, each containing the tile's bounds and index.
|
|
105
|
+
*/
|
|
106
|
+
generateTiles( tilesX, tilesY ) {
|
|
107
|
+
|
|
108
|
+
const tiles = [];
|
|
109
|
+
const tileWidth = 1 / tilesX;
|
|
110
|
+
const tileHeight = 1 / tilesY;
|
|
111
|
+
|
|
112
|
+
for ( let y = 0; y < tilesY; y ++ ) {
|
|
113
|
+
|
|
114
|
+
for ( let x = 0; x < tilesX; x ++ ) {
|
|
115
|
+
|
|
116
|
+
tiles.push( {
|
|
117
|
+
x: [ x * tileWidth, ( x + 1 ) * tileWidth ],
|
|
118
|
+
y: [ ( tilesY - 1 - y ) * tileHeight, ( tilesY - y ) * tileHeight ], // Start from top row
|
|
119
|
+
index: y * tilesX + x
|
|
120
|
+
} );
|
|
121
|
+
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return tiles;
|
|
127
|
+
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Updates the initial light direction based on the light's target position.
|
|
132
|
+
*/
|
|
133
|
+
updateLightDirection() {
|
|
134
|
+
|
|
135
|
+
this.initialLightDirection.subVectors(
|
|
136
|
+
this.originalLight.target.getWorldPosition( new Vector3() ),
|
|
137
|
+
this.originalLight.getWorldPosition( new Vector3() )
|
|
138
|
+
).normalize();
|
|
139
|
+
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Initializes the tiled shadow node by creating lights, cameras, and shadow maps for each tile.
|
|
144
|
+
*
|
|
145
|
+
* @param {Builder} builder - The builder used to create render targets and other resources.
|
|
146
|
+
*/
|
|
147
|
+
init( builder ) {
|
|
148
|
+
|
|
149
|
+
const light = this.originalLight;
|
|
150
|
+
const parent = light.parent;
|
|
151
|
+
|
|
152
|
+
const width = this.shadowSize.right - this.shadowSize.left;
|
|
153
|
+
const height = this.shadowSize.top - this.shadowSize.bottom;
|
|
154
|
+
|
|
155
|
+
const tileCount = this.tiles.length;
|
|
156
|
+
const shadowWidth = this.config.resolution.width;
|
|
157
|
+
const shadowHeight = this.config.resolution.height;
|
|
158
|
+
|
|
159
|
+
// Clear existing lights/nodes if re-initializing
|
|
160
|
+
this.disposeLightsAndNodes();
|
|
161
|
+
|
|
162
|
+
const depthTexture = new DepthTexture( shadowWidth, shadowHeight, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, tileCount );
|
|
163
|
+
depthTexture.compareFunction = LessCompare;
|
|
164
|
+
depthTexture.name = 'ShadowDepthArrayTexture';
|
|
165
|
+
const shadowMap = builder.createRenderTarget( shadowWidth, shadowHeight, { format: RedFormat, depth: tileCount } );
|
|
166
|
+
shadowMap.depthTexture = depthTexture;
|
|
167
|
+
shadowMap.texture.name = 'ShadowTexture';
|
|
168
|
+
this.shadowMap = shadowMap;
|
|
169
|
+
const cameras = [];
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
// Create lights, one for each tile
|
|
173
|
+
for ( let i = 0; i < tileCount; i ++ ) {
|
|
174
|
+
|
|
175
|
+
const lwLight = new LwLight();
|
|
176
|
+
lwLight.castShadow = true;
|
|
177
|
+
const lShadow = light.shadow.clone();
|
|
178
|
+
lShadow.filterNode = light.shadow.filterNode;
|
|
179
|
+
const tile = this.tiles[ i ];
|
|
180
|
+
lShadow.camera.left = this.shadowSize.left + width * tile.x[ 0 ];
|
|
181
|
+
lShadow.camera.right = this.shadowSize.left + width * tile.x[ 1 ];
|
|
182
|
+
lShadow.camera.top = this.shadowSize.bottom + height * tile.y[ 1 ];
|
|
183
|
+
lShadow.camera.bottom = this.shadowSize.bottom + height * tile.y[ 0 ];
|
|
184
|
+
lShadow.bias = light.shadow.bias;
|
|
185
|
+
lShadow.camera.near = light.shadow.camera.near;
|
|
186
|
+
lShadow.camera.far = light.shadow.camera.far;
|
|
187
|
+
lShadow.camera.userData.tileIndex = i;
|
|
188
|
+
lwLight.shadow = lShadow;
|
|
189
|
+
|
|
190
|
+
if ( parent ) {
|
|
191
|
+
|
|
192
|
+
parent.add( lwLight );
|
|
193
|
+
parent.add( lwLight.target );
|
|
194
|
+
|
|
195
|
+
} else {
|
|
196
|
+
|
|
197
|
+
console.warn( 'TileShadowNode: Original light has no parent during init. Tile lights not added to scene graph directly.' );
|
|
198
|
+
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
this.syncLightTransformation( lwLight, light );
|
|
202
|
+
|
|
203
|
+
this.lights.push( lwLight );
|
|
204
|
+
lShadow.camera.updateMatrixWorld();
|
|
205
|
+
|
|
206
|
+
cameras.push( lShadow.camera );
|
|
207
|
+
const shadowNode = shadow( lwLight, lShadow );
|
|
208
|
+
shadowNode.depthLayer = i;
|
|
209
|
+
shadowNode.updateBeforeType = NodeUpdateType.NONE;
|
|
210
|
+
|
|
211
|
+
shadowNode.setupRenderTarget = () => {
|
|
212
|
+
|
|
213
|
+
return { shadowMap, depthTexture };
|
|
214
|
+
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
this._shadowNodes.push( shadowNode );
|
|
218
|
+
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const cameraArray = new ArrayCamera( cameras );
|
|
222
|
+
this.cameraArray = cameraArray;
|
|
223
|
+
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Updates the light transformations and shadow cameras for each tile.
|
|
228
|
+
*/
|
|
229
|
+
update() {
|
|
230
|
+
|
|
231
|
+
const light = this.originalLight;
|
|
232
|
+
|
|
233
|
+
const shadowCam = light.shadow.camera;
|
|
234
|
+
const lsMin = new Vector2( shadowCam.left, shadowCam.bottom );
|
|
235
|
+
const lsMax = new Vector2( shadowCam.right, shadowCam.top );
|
|
236
|
+
const fullWidth = lsMax.x - lsMin.x;
|
|
237
|
+
const fullHeight = lsMax.y - lsMin.y;
|
|
238
|
+
|
|
239
|
+
for ( let i = 0; i < this.lights.length; i ++ ) {
|
|
240
|
+
|
|
241
|
+
const lwLight = this.lights[ i ];
|
|
242
|
+
const tile = this.tiles[ i ];
|
|
243
|
+
this.syncLightTransformation( lwLight, light );
|
|
244
|
+
const lShadow = lwLight.shadow;
|
|
245
|
+
const tileLeft = lsMin.x + tile.x[ 0 ] * fullWidth;
|
|
246
|
+
const tileRight = lsMin.x + tile.x[ 1 ] * fullWidth;
|
|
247
|
+
const tileBottom = lsMin.y + tile.y[ 0 ] * fullHeight;
|
|
248
|
+
const tileTop = lsMin.y + tile.y[ 1 ] * fullHeight;
|
|
249
|
+
lShadow.camera.left = tileLeft;
|
|
250
|
+
lShadow.camera.right = tileRight;
|
|
251
|
+
lShadow.camera.bottom = tileBottom;
|
|
252
|
+
lShadow.camera.top = tileTop;
|
|
253
|
+
lShadow.camera.near = light.shadow.camera.near;
|
|
254
|
+
lShadow.camera.far = light.shadow.camera.far;
|
|
255
|
+
lShadow.camera.updateProjectionMatrix();
|
|
256
|
+
lShadow.camera.updateWorldMatrix( true, false );
|
|
257
|
+
lShadow.camera.updateMatrixWorld( true );
|
|
258
|
+
this._shadowNodes[ i ].shadow.needsUpdate = true;
|
|
259
|
+
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Updates the shadow map rendering.
|
|
266
|
+
* @param {NodeFrame} frame - A reference to the current node frame.
|
|
267
|
+
*/
|
|
268
|
+
updateShadow( frame ) {
|
|
269
|
+
|
|
270
|
+
const { shadowMap, light } = this;
|
|
271
|
+
const { renderer, scene, camera } = frame;
|
|
272
|
+
const shadowType = renderer.shadowMap.type;
|
|
273
|
+
const depthVersion = shadowMap.depthTexture.version;
|
|
274
|
+
this._depthVersionCached = depthVersion;
|
|
275
|
+
const currentRenderObjectFunction = renderer.getRenderObjectFunction();
|
|
276
|
+
const currentMRT = renderer.getMRT();
|
|
277
|
+
const useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;
|
|
278
|
+
|
|
279
|
+
_rendererState = resetRendererAndSceneState( renderer, scene, _rendererState );
|
|
280
|
+
scene.overrideMaterial = getShadowMaterial( light );
|
|
281
|
+
renderer.setRenderTarget( this.shadowMap );
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
for ( let index = 0; index < this.lights.length; index ++ ) {
|
|
285
|
+
|
|
286
|
+
const light = this.lights[ index ];
|
|
287
|
+
const shadow = light.shadow;
|
|
288
|
+
|
|
289
|
+
const _shadowCameraLayer = shadow.camera.layers.mask;
|
|
290
|
+
_cameraLayers.push( _shadowCameraLayer );
|
|
291
|
+
|
|
292
|
+
if ( ( shadow.camera.layers.mask & 0xFFFFFFFE ) === 0 ) {
|
|
293
|
+
|
|
294
|
+
shadow.camera.layers.mask = camera.layers.mask;
|
|
295
|
+
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
shadow.updateMatrices( light );
|
|
299
|
+
|
|
300
|
+
renderer.setRenderObjectFunction( getShadowRenderObjectFunction( renderer, shadow, shadowType, useVelocity ) );
|
|
301
|
+
this.shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height, shadowMap.depth );
|
|
302
|
+
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
renderer.render( scene, this.cameraArray );
|
|
306
|
+
renderer.setRenderObjectFunction( currentRenderObjectFunction );
|
|
307
|
+
|
|
308
|
+
if ( light.isPointLight !== true && shadowType === VSMShadowMap ) {
|
|
309
|
+
|
|
310
|
+
console.warn( 'THREE.TileShadowNode: VSM shadow map is not supported yet.' );
|
|
311
|
+
// this.vsmPass( renderer );
|
|
312
|
+
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
restoreRendererAndSceneState( renderer, scene, _rendererState );
|
|
316
|
+
|
|
317
|
+
for ( let index = 0; index < this.lights.length; index ++ ) {
|
|
318
|
+
|
|
319
|
+
const light = this.lights[ index ];
|
|
320
|
+
const shadow = light.shadow;
|
|
321
|
+
|
|
322
|
+
shadow.camera.layers.mask = _cameraLayers[ index ];
|
|
323
|
+
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
_cameraLayers.length = 0;
|
|
327
|
+
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* The implementation performs the update of the shadow map if necessary.
|
|
332
|
+
*
|
|
333
|
+
* @param {NodeFrame} frame - A reference to the current node frame.
|
|
334
|
+
*/
|
|
335
|
+
updateBefore( frame ) {
|
|
336
|
+
|
|
337
|
+
const shadow = this.originalLight.shadow;
|
|
338
|
+
|
|
339
|
+
let needsUpdate = shadow.needsUpdate || shadow.autoUpdate;
|
|
340
|
+
|
|
341
|
+
if ( needsUpdate ) {
|
|
342
|
+
|
|
343
|
+
if ( this._cameraFrameId[ frame.camera ] === frame.frameId ) {
|
|
344
|
+
|
|
345
|
+
needsUpdate = false;
|
|
346
|
+
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
this._cameraFrameId[ frame.camera ] = frame.frameId;
|
|
350
|
+
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if ( needsUpdate ) {
|
|
354
|
+
|
|
355
|
+
this.update();
|
|
356
|
+
this.updateShadow( frame );
|
|
357
|
+
|
|
358
|
+
if ( this.shadowMap.depthTexture.version === this._depthVersionCached ) {
|
|
359
|
+
|
|
360
|
+
shadow.needsUpdate = false;
|
|
361
|
+
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Synchronizes the transformation of a tile light with the source light.
|
|
370
|
+
*
|
|
371
|
+
* @param {LwLight} lwLight - The tile light to synchronize.
|
|
372
|
+
* @param {Light} sourceLight - The source light to copy transformations from.
|
|
373
|
+
*/
|
|
374
|
+
syncLightTransformation( lwLight, sourceLight ) {
|
|
375
|
+
|
|
376
|
+
const sourceWorldPos = sourceLight.getWorldPosition( _vec3Temp1 );
|
|
377
|
+
const targetWorldPos = sourceLight.target.getWorldPosition( _vec3Temp2 );
|
|
378
|
+
const forward = _vec3Temp3.subVectors( targetWorldPos, sourceWorldPos );
|
|
379
|
+
const targetDistance = forward.length();
|
|
380
|
+
forward.normalize();
|
|
381
|
+
lwLight.position.copy( sourceWorldPos );
|
|
382
|
+
lwLight.target.position.copy( sourceWorldPos ).add( forward.multiplyScalar( targetDistance ) );
|
|
383
|
+
lwLight.quaternion.copy( sourceLight.getWorldQuaternion( _quatTemp1 ) );
|
|
384
|
+
lwLight.scale.copy( sourceLight.scale );
|
|
385
|
+
lwLight.updateMatrix();
|
|
386
|
+
lwLight.updateMatrixWorld( true );
|
|
387
|
+
lwLight.target.updateMatrix();
|
|
388
|
+
lwLight.target.updateMatrixWorld( true );
|
|
389
|
+
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Sets up the shadow node for rendering.
|
|
394
|
+
*
|
|
395
|
+
* @param {Builder} builder - The builder used to set up the shadow node.
|
|
396
|
+
* @returns {Node} A node representing the shadow value.
|
|
397
|
+
*/
|
|
398
|
+
setup( builder ) {
|
|
399
|
+
|
|
400
|
+
if ( this.lights.length === 0 ) {
|
|
401
|
+
|
|
402
|
+
this.init( builder );
|
|
403
|
+
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return Fn( ( builder ) => {
|
|
407
|
+
|
|
408
|
+
this.setupShadowPosition( builder );
|
|
409
|
+
return min( ...this._shadowNodes ).toVar( 'shadowValue' );
|
|
410
|
+
|
|
411
|
+
} )();
|
|
412
|
+
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Helper method to remove lights and associated nodes/targets.
|
|
417
|
+
* Used internally during dispose and potential re-initialization.
|
|
418
|
+
*/
|
|
419
|
+
disposeLightsAndNodes() {
|
|
420
|
+
|
|
421
|
+
for ( const light of this.lights ) {
|
|
422
|
+
|
|
423
|
+
const parent = light.parent;
|
|
424
|
+
if ( parent ) {
|
|
425
|
+
|
|
426
|
+
parent.remove( light.target );
|
|
427
|
+
parent.remove( light );
|
|
428
|
+
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
this.lights = [];
|
|
434
|
+
this._shadowNodes = [];
|
|
435
|
+
|
|
436
|
+
if ( this.shadowMap ) {
|
|
437
|
+
|
|
438
|
+
this.shadowMap.dispose(); // Disposes render target and textures
|
|
439
|
+
this.shadowMap = null;
|
|
440
|
+
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
dispose() {
|
|
447
|
+
|
|
448
|
+
// Dispose lights, nodes, and shadow map
|
|
449
|
+
this.disposeLightsAndNodes();
|
|
450
|
+
super.dispose();
|
|
451
|
+
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export { TileShadowNode };
|