super-three 0.175.0 → 0.177.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 +7631 -6743
- package/build/three.core.js +7496 -6758
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +172 -22
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +14 -6
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +3948 -1678
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +3941 -1678
- 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 -0
- package/examples/jsm/capabilities/WebGPU.js +1 -0
- package/examples/jsm/controls/ArcballControls.js +14 -3
- 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 +1 -0
- 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 +1 -0
- 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 +5 -4
- 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 +24 -22
- 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 +58 -1
- 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 +5 -6
- 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/GLSLDecoder.js +1 -2
- package/examples/jsm/transpiler/TSLEncoder.js +52 -8
- package/examples/jsm/transpiler/Transpiler.js +2 -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/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 +2 -27
- 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 +3 -2
- 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 +13 -5
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +1 -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 +1 -1
- package/src/core/BufferGeometry.js +2 -5
- package/src/core/Object3D.js +22 -21
- 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/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/ImageBitmapLoader.js +21 -5
- 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/NodeMaterial.js +81 -18
- 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/FrustumArray.js +253 -0
- package/src/math/Ray.js +2 -0
- package/src/math/Sphere.js +28 -0
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +1 -0
- package/src/nodes/accessors/Bitangent.js +31 -9
- 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 +26 -6
- package/src/nodes/accessors/Object3DNode.js +6 -7
- 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/SkinningNode.js +3 -2
- package/src/nodes/accessors/StorageBufferNode.js +25 -0
- package/src/nodes/accessors/StorageTextureNode.js +14 -3
- package/src/nodes/accessors/TextureNode.js +59 -8
- 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/CacheNode.js +14 -0
- package/src/nodes/core/ContextNode.js +7 -3
- package/src/nodes/core/Node.js +68 -19
- package/src/nodes/core/NodeBuilder.js +100 -12
- 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 +127 -2
- package/src/nodes/core/StructTypeNode.js +26 -4
- package/src/nodes/core/VarNode.js +11 -2
- package/src/nodes/core/VaryingNode.js +40 -21
- package/src/nodes/display/BlendModes.js +42 -1
- package/src/nodes/display/ColorSpaceNode.js +4 -27
- package/src/nodes/display/PassNode.js +8 -11
- package/src/nodes/functions/ShadowMaskModel.js +5 -1
- 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/HemisphereLightNode.js +2 -2
- package/src/nodes/lighting/IESSpotLightNode.js +2 -1
- package/src/nodes/lighting/LightsNode.js +25 -7
- 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 +172 -240
- package/src/nodes/lighting/SpotLightNode.js +44 -7
- package/src/nodes/materialx/lib/mx_noise.js +1 -1
- package/src/nodes/math/MathNode.js +56 -20
- package/src/nodes/math/OperatorNode.js +109 -82
- package/src/nodes/shapes/Shapes.js +5 -4
- package/src/nodes/tsl/TSLCore.js +140 -49
- package/src/nodes/utils/DebugNode.js +15 -3
- package/src/nodes/utils/Discard.js +2 -2
- package/src/nodes/utils/LoopNode.js +64 -17
- package/src/nodes/utils/ReflectorNode.js +67 -4
- 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 +21 -10
- package/src/renderers/common/Animation.js +2 -2
- package/src/renderers/common/Background.js +11 -0
- package/src/renderers/common/RenderList.js +0 -4
- package/src/renderers/common/RenderObject.js +12 -1
- package/src/renderers/common/Renderer.js +116 -8
- 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 +154 -25
- package/src/renderers/common/extras/PMREMGenerator.js +29 -22
- 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/WebGLShadowMap.js +3 -2
- package/src/renderers/webgl/WebGLTextures.js +143 -4
- package/src/renderers/webgl/WebGLUtils.js +1 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +170 -34
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -7
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +42 -29
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
- package/src/renderers/webgpu/WebGPUBackend.js +442 -127
- 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 +75 -27
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -5
- package/src/renderers/webgpu/utils/WebGPUConstants.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +34 -4
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +44 -49
- 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/tsl/TSLCore.js
CHANGED
|
@@ -85,7 +85,7 @@ const shaderNodeHandler = {
|
|
|
85
85
|
|
|
86
86
|
prop = parseSwizzleAndSort( prop.slice( 3 ).toLowerCase() );
|
|
87
87
|
|
|
88
|
-
return ( value ) => nodeObject( new SetNode( node, prop, value ) );
|
|
88
|
+
return ( value ) => nodeObject( new SetNode( node, prop, nodeObject( value ) ) );
|
|
89
89
|
|
|
90
90
|
} else if ( /^flip[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
|
|
91
91
|
|
|
@@ -304,6 +304,8 @@ class ShaderCallNodeInternal extends Node {
|
|
|
304
304
|
this.shaderNode = shaderNode;
|
|
305
305
|
this.inputNodes = inputNodes;
|
|
306
306
|
|
|
307
|
+
this.isShaderCallNodeInternal = true;
|
|
308
|
+
|
|
307
309
|
}
|
|
308
310
|
|
|
309
311
|
getNodeType( builder ) {
|
|
@@ -323,7 +325,13 @@ class ShaderCallNodeInternal extends Node {
|
|
|
323
325
|
const { shaderNode, inputNodes } = this;
|
|
324
326
|
|
|
325
327
|
const properties = builder.getNodeProperties( shaderNode );
|
|
326
|
-
|
|
328
|
+
const onceNS = shaderNode.namespace && shaderNode.namespace === builder.namespace ? builder.getNamespace( 'once' ) : 'once';
|
|
329
|
+
|
|
330
|
+
if ( properties[ onceNS ] ) {
|
|
331
|
+
|
|
332
|
+
return properties[ onceNS ];
|
|
333
|
+
|
|
334
|
+
}
|
|
327
335
|
|
|
328
336
|
//
|
|
329
337
|
|
|
@@ -366,7 +374,7 @@ class ShaderCallNodeInternal extends Node {
|
|
|
366
374
|
|
|
367
375
|
if ( shaderNode.once ) {
|
|
368
376
|
|
|
369
|
-
properties
|
|
377
|
+
properties[ onceNS ] = result;
|
|
370
378
|
|
|
371
379
|
}
|
|
372
380
|
|
|
@@ -374,41 +382,63 @@ class ShaderCallNodeInternal extends Node {
|
|
|
374
382
|
|
|
375
383
|
}
|
|
376
384
|
|
|
385
|
+
setupOutput( builder ) {
|
|
386
|
+
|
|
387
|
+
builder.addStack();
|
|
388
|
+
|
|
389
|
+
builder.stack.outputNode = this.call( builder );
|
|
390
|
+
|
|
391
|
+
return builder.removeStack();
|
|
392
|
+
|
|
393
|
+
}
|
|
394
|
+
|
|
377
395
|
getOutputNode( builder ) {
|
|
378
396
|
|
|
379
397
|
const properties = builder.getNodeProperties( this );
|
|
398
|
+
const outputNamespace = builder.getOutputNamespace();
|
|
380
399
|
|
|
381
|
-
|
|
400
|
+
properties[ outputNamespace ] = properties[ outputNamespace ] || this.setupOutput( builder );
|
|
382
401
|
|
|
383
|
-
|
|
402
|
+
return properties[ outputNamespace ];
|
|
384
403
|
|
|
385
|
-
|
|
404
|
+
}
|
|
386
405
|
|
|
387
|
-
|
|
406
|
+
build( builder, output = null ) {
|
|
388
407
|
|
|
389
|
-
|
|
408
|
+
let result = null;
|
|
390
409
|
|
|
391
|
-
|
|
410
|
+
const buildStage = builder.getBuildStage();
|
|
411
|
+
const properties = builder.getNodeProperties( this );
|
|
392
412
|
|
|
393
|
-
|
|
413
|
+
const outputNamespace = builder.getOutputNamespace();
|
|
414
|
+
const outputNode = this.getOutputNode( builder );
|
|
394
415
|
|
|
395
|
-
|
|
416
|
+
if ( buildStage === 'setup' ) {
|
|
396
417
|
|
|
397
|
-
|
|
418
|
+
const initializedNamespace = builder.getNamespace( 'initialized' );
|
|
398
419
|
|
|
399
|
-
|
|
420
|
+
if ( properties[ initializedNamespace ] !== true ) {
|
|
400
421
|
|
|
401
|
-
|
|
422
|
+
properties[ initializedNamespace ] = true;
|
|
402
423
|
|
|
403
|
-
|
|
424
|
+
properties[ outputNamespace ] = this.getOutputNode( builder );
|
|
425
|
+
properties[ outputNamespace ].build( builder );
|
|
404
426
|
|
|
405
|
-
|
|
427
|
+
}
|
|
406
428
|
|
|
407
|
-
|
|
429
|
+
result = properties[ outputNamespace ];
|
|
408
430
|
|
|
409
|
-
|
|
431
|
+
} else if ( buildStage === 'analyze' ) {
|
|
432
|
+
|
|
433
|
+
outputNode.build( builder, output );
|
|
434
|
+
|
|
435
|
+
} else if ( buildStage === 'generate' ) {
|
|
410
436
|
|
|
411
|
-
|
|
437
|
+
result = outputNode.build( builder, output ) || '';
|
|
438
|
+
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
return result;
|
|
412
442
|
|
|
413
443
|
}
|
|
414
444
|
|
|
@@ -426,6 +456,7 @@ class ShaderNodeInternal extends Node {
|
|
|
426
456
|
this.global = true;
|
|
427
457
|
|
|
428
458
|
this.once = false;
|
|
459
|
+
this.namespace = null;
|
|
429
460
|
|
|
430
461
|
}
|
|
431
462
|
|
|
@@ -598,7 +629,9 @@ export const Fn = ( jsFunc, layout = null ) => {
|
|
|
598
629
|
|
|
599
630
|
nodeObjects( params );
|
|
600
631
|
|
|
601
|
-
|
|
632
|
+
const isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
|
|
633
|
+
|
|
634
|
+
if ( isArrayAsParameter ) {
|
|
602
635
|
|
|
603
636
|
inputs = [ ...params ];
|
|
604
637
|
|
|
@@ -608,11 +641,19 @@ export const Fn = ( jsFunc, layout = null ) => {
|
|
|
608
641
|
|
|
609
642
|
}
|
|
610
643
|
|
|
611
|
-
|
|
644
|
+
const fnCall = shaderNode.call( inputs );
|
|
645
|
+
|
|
646
|
+
if ( nodeType === 'void' ) fnCall.toStack();
|
|
647
|
+
|
|
648
|
+
return fnCall;
|
|
612
649
|
|
|
613
650
|
};
|
|
614
651
|
|
|
615
652
|
fn.shaderNode = shaderNode;
|
|
653
|
+
fn.id = shaderNode.id;
|
|
654
|
+
|
|
655
|
+
fn.getNodeType = ( ...params ) => shaderNode.getNodeType( ...params );
|
|
656
|
+
fn.getCacheKey = ( ...params ) => shaderNode.getCacheKey( ...params );
|
|
616
657
|
|
|
617
658
|
fn.setLayout = ( layout ) => {
|
|
618
659
|
|
|
@@ -622,9 +663,10 @@ export const Fn = ( jsFunc, layout = null ) => {
|
|
|
622
663
|
|
|
623
664
|
};
|
|
624
665
|
|
|
625
|
-
fn.once = () => {
|
|
666
|
+
fn.once = ( namespace = null ) => {
|
|
626
667
|
|
|
627
668
|
shaderNode.once = true;
|
|
669
|
+
shaderNode.namespace = namespace;
|
|
628
670
|
|
|
629
671
|
return fn;
|
|
630
672
|
|
|
@@ -663,31 +705,6 @@ export const Fn = ( jsFunc, layout = null ) => {
|
|
|
663
705
|
|
|
664
706
|
};
|
|
665
707
|
|
|
666
|
-
/**
|
|
667
|
-
* @tsl
|
|
668
|
-
* @function
|
|
669
|
-
* @deprecated since r168. Use {@link Fn} instead.
|
|
670
|
-
*
|
|
671
|
-
* @param {...any} params
|
|
672
|
-
* @returns {Function}
|
|
673
|
-
*/
|
|
674
|
-
export const tslFn = ( ...params ) => { // @deprecated, r168
|
|
675
|
-
|
|
676
|
-
console.warn( 'THREE.TSL: tslFn() has been renamed to Fn().' );
|
|
677
|
-
return Fn( ...params );
|
|
678
|
-
|
|
679
|
-
};
|
|
680
|
-
|
|
681
|
-
//
|
|
682
|
-
|
|
683
|
-
addMethodChaining( 'toGlobal', ( node ) => {
|
|
684
|
-
|
|
685
|
-
node.global = true;
|
|
686
|
-
|
|
687
|
-
return node;
|
|
688
|
-
|
|
689
|
-
} );
|
|
690
|
-
|
|
691
708
|
//
|
|
692
709
|
|
|
693
710
|
export const setCurrentStack = ( stack ) => {
|
|
@@ -704,9 +721,44 @@ export const setCurrentStack = ( stack ) => {
|
|
|
704
721
|
|
|
705
722
|
export const getCurrentStack = () => currentStack;
|
|
706
723
|
|
|
724
|
+
/**
|
|
725
|
+
* Represent a conditional node using if/else statements.
|
|
726
|
+
*
|
|
727
|
+
* ```js
|
|
728
|
+
* If( condition, function )
|
|
729
|
+
* .ElseIf( condition, function )
|
|
730
|
+
* .Else( function )
|
|
731
|
+
* ```
|
|
732
|
+
* @tsl
|
|
733
|
+
* @function
|
|
734
|
+
* @param {...any} params - The parameters for the conditional node.
|
|
735
|
+
* @returns {StackNode} The conditional node.
|
|
736
|
+
*/
|
|
707
737
|
export const If = ( ...params ) => currentStack.If( ...params );
|
|
708
738
|
|
|
709
|
-
|
|
739
|
+
/**
|
|
740
|
+
* Represent a conditional node using switch/case statements.
|
|
741
|
+
*
|
|
742
|
+
* ```js
|
|
743
|
+
* Switch( value )
|
|
744
|
+
* .Case( 1, function )
|
|
745
|
+
* .Case( 2, 3, 4, function )
|
|
746
|
+
* .Default( function )
|
|
747
|
+
* ```
|
|
748
|
+
* @tsl
|
|
749
|
+
* @function
|
|
750
|
+
* @param {...any} params - The parameters for the conditional node.
|
|
751
|
+
* @returns {StackNode} The conditional node.
|
|
752
|
+
*/
|
|
753
|
+
export const Switch = ( ...params ) => currentStack.Switch( ...params );
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* Add the given node to the current stack.
|
|
757
|
+
*
|
|
758
|
+
* @param {Node} node - The node to add.
|
|
759
|
+
* @returns {Node} The node that was added to the stack.
|
|
760
|
+
*/
|
|
761
|
+
export function Stack( node ) {
|
|
710
762
|
|
|
711
763
|
if ( currentStack ) currentStack.add( node );
|
|
712
764
|
|
|
@@ -714,7 +766,7 @@ export function append( node ) {
|
|
|
714
766
|
|
|
715
767
|
}
|
|
716
768
|
|
|
717
|
-
addMethodChaining( '
|
|
769
|
+
addMethodChaining( 'toStack', Stack );
|
|
718
770
|
|
|
719
771
|
// types
|
|
720
772
|
|
|
@@ -776,3 +828,42 @@ export const split = ( node, channels ) => nodeObject( new SplitNode( nodeObject
|
|
|
776
828
|
|
|
777
829
|
addMethodChaining( 'element', element );
|
|
778
830
|
addMethodChaining( 'convert', convert );
|
|
831
|
+
|
|
832
|
+
// deprecated
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* @tsl
|
|
836
|
+
* @function
|
|
837
|
+
* @deprecated since r176. Use {@link Stack} instead.
|
|
838
|
+
*
|
|
839
|
+
* @param {Node} node - The node to add.
|
|
840
|
+
* @returns {Function}
|
|
841
|
+
*/
|
|
842
|
+
export const append = ( node ) => { // @deprecated, r176
|
|
843
|
+
|
|
844
|
+
console.warn( 'THREE.TSL: append() has been renamed to Stack().' );
|
|
845
|
+
return Stack( node );
|
|
846
|
+
|
|
847
|
+
};
|
|
848
|
+
|
|
849
|
+
addMethodChaining( 'append', ( node ) => { // @deprecated, r176
|
|
850
|
+
|
|
851
|
+
console.warn( 'THREE.TSL: .append() has been renamed to .toStack().' );
|
|
852
|
+
return Stack( node );
|
|
853
|
+
|
|
854
|
+
} );
|
|
855
|
+
|
|
856
|
+
/**
|
|
857
|
+
* @tsl
|
|
858
|
+
* @function
|
|
859
|
+
* @deprecated since r168. Use {@link Fn} instead.
|
|
860
|
+
*
|
|
861
|
+
* @param {...any} params
|
|
862
|
+
* @returns {Function}
|
|
863
|
+
*/
|
|
864
|
+
export const tslFn = ( ...params ) => { // @deprecated, r168
|
|
865
|
+
|
|
866
|
+
console.warn( 'THREE.TSL: tslFn() has been renamed to Fn().' );
|
|
867
|
+
return Fn( ...params );
|
|
868
|
+
|
|
869
|
+
};
|
|
@@ -41,15 +41,18 @@ class DebugNode extends TempNode {
|
|
|
41
41
|
const callback = this.callback;
|
|
42
42
|
const snippet = this.node.build( builder );
|
|
43
43
|
|
|
44
|
+
const title = '--- TSL debug - ' + builder.shaderStage + ' shader ---';
|
|
45
|
+
const border = '-'.repeat( title.length );
|
|
46
|
+
|
|
44
47
|
let code = '';
|
|
45
|
-
code += '//
|
|
48
|
+
code += '// #' + title + '#\n';
|
|
46
49
|
code += builder.flow.code.replace( /^\t/mg, '' ) + '\n';
|
|
47
50
|
code += '/* ... */ ' + snippet + ' /* ... */\n';
|
|
48
|
-
code += '//
|
|
51
|
+
code += '// #' + border + '#\n';
|
|
49
52
|
|
|
50
53
|
if ( callback !== null ) {
|
|
51
54
|
|
|
52
|
-
callback( code );
|
|
55
|
+
callback( builder, code );
|
|
53
56
|
|
|
54
57
|
} else {
|
|
55
58
|
|
|
@@ -65,6 +68,15 @@ class DebugNode extends TempNode {
|
|
|
65
68
|
|
|
66
69
|
export default DebugNode;
|
|
67
70
|
|
|
71
|
+
/**
|
|
72
|
+
* TSL function for creating a debug node.
|
|
73
|
+
*
|
|
74
|
+
* @tsl
|
|
75
|
+
* @function
|
|
76
|
+
* @param {Node} node - The node to debug.
|
|
77
|
+
* @param {?Function} [callback=null] - Optional callback function to handle the debug output.
|
|
78
|
+
* @returns {DebugNode}
|
|
79
|
+
*/
|
|
68
80
|
export const debug = ( node, callback = null ) => nodeObject( new DebugNode( nodeObject( node ), callback ) );
|
|
69
81
|
|
|
70
82
|
addMethodChaining( 'debug', debug );
|
|
@@ -10,7 +10,7 @@ import { addMethodChaining } from '../tsl/TSLCore.js';
|
|
|
10
10
|
* @param {?ConditionalNode} conditional - An optional conditional node. It allows to decide whether the discard should be executed or not.
|
|
11
11
|
* @return {Node} The `discard` expression.
|
|
12
12
|
*/
|
|
13
|
-
export const Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).
|
|
13
|
+
export const Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).toStack();
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Represents a `return` shader operation in TSL.
|
|
@@ -19,6 +19,6 @@ export const Discard = ( conditional ) => ( conditional ? select( conditional, e
|
|
|
19
19
|
* @function
|
|
20
20
|
* @return {ExpressionNode} The `return` expression.
|
|
21
21
|
*/
|
|
22
|
-
export const Return = () => expression( 'return' ).
|
|
22
|
+
export const Return = () => expression( 'return' ).toStack();
|
|
23
23
|
|
|
24
24
|
addMethodChaining( 'discard', Discard );
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
2
|
import { expression } from '../code/ExpressionNode.js';
|
|
3
|
-
import { nodeObject, nodeArray } from '../tsl/TSLBase.js';
|
|
3
|
+
import { nodeObject, nodeArray, Fn } from '../tsl/TSLBase.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* This module offers a variety of ways to implement loops in TSL. In it's basic form it's:
|
|
@@ -101,9 +101,17 @@ class LoopNode extends Node {
|
|
|
101
101
|
|
|
102
102
|
const stack = builder.addStack(); // TODO: cache() it
|
|
103
103
|
|
|
104
|
-
properties.returnsNode = this.params[ this.params.length - 1 ]( inputs,
|
|
104
|
+
properties.returnsNode = this.params[ this.params.length - 1 ]( inputs, builder );
|
|
105
105
|
properties.stackNode = stack;
|
|
106
106
|
|
|
107
|
+
const baseParam = this.params[ 0 ];
|
|
108
|
+
|
|
109
|
+
if ( baseParam.isNode !== true && typeof baseParam.update === 'function' ) {
|
|
110
|
+
|
|
111
|
+
properties.updateNode = Fn( this.params[ 0 ].update )( inputs );
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
107
115
|
builder.removeStack();
|
|
108
116
|
|
|
109
117
|
return properties;
|
|
@@ -222,30 +230,69 @@ class LoopNode extends Node {
|
|
|
222
230
|
const startSnippet = internalParam.start;
|
|
223
231
|
const endSnippet = internalParam.end;
|
|
224
232
|
|
|
225
|
-
let
|
|
226
|
-
|
|
227
|
-
|
|
233
|
+
let updateSnippet;
|
|
234
|
+
|
|
235
|
+
const deltaOperator = () => condition.includes( '<' ) ? '+=' : '-=';
|
|
236
|
+
|
|
237
|
+
if ( update !== undefined && update !== null ) {
|
|
238
|
+
|
|
239
|
+
switch ( typeof update ) {
|
|
240
|
+
|
|
241
|
+
case 'function':
|
|
242
|
+
|
|
243
|
+
const flow = builder.flowStagesNode( properties.updateNode, 'void' );
|
|
244
|
+
const snippet = flow.code.replace( /\t|;/g, '' );
|
|
245
|
+
|
|
246
|
+
updateSnippet = snippet;
|
|
247
|
+
|
|
248
|
+
break;
|
|
249
|
+
|
|
250
|
+
case 'number':
|
|
251
|
+
|
|
252
|
+
updateSnippet = name + ' ' + deltaOperator() + ' ' + builder.generateConst( type, update );
|
|
253
|
+
|
|
254
|
+
break;
|
|
228
255
|
|
|
229
|
-
|
|
256
|
+
case 'string':
|
|
257
|
+
|
|
258
|
+
updateSnippet = name + ' ' + update;
|
|
259
|
+
|
|
260
|
+
break;
|
|
261
|
+
|
|
262
|
+
default:
|
|
263
|
+
|
|
264
|
+
if ( update.isNode ) {
|
|
265
|
+
|
|
266
|
+
updateSnippet = name + ' ' + deltaOperator() + ' ' + update.build( builder );
|
|
267
|
+
|
|
268
|
+
} else {
|
|
269
|
+
|
|
270
|
+
console.error( 'THREE.TSL: \'Loop( { update: ... } )\' is not a function, string or number.' );
|
|
271
|
+
|
|
272
|
+
updateSnippet = 'break /* invalid update */';
|
|
273
|
+
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
} else {
|
|
230
279
|
|
|
231
280
|
if ( type === 'int' || type === 'uint' ) {
|
|
232
281
|
|
|
233
|
-
|
|
234
|
-
else update = '--';
|
|
282
|
+
update = condition.includes( '<' ) ? '++' : '--';
|
|
235
283
|
|
|
236
284
|
} else {
|
|
237
285
|
|
|
238
|
-
|
|
239
|
-
else update = '-= 1.';
|
|
286
|
+
update = deltaOperator() + ' 1.';
|
|
240
287
|
|
|
241
288
|
}
|
|
242
289
|
|
|
243
|
-
|
|
290
|
+
updateSnippet = name + ' ' + update;
|
|
244
291
|
|
|
245
|
-
|
|
292
|
+
}
|
|
246
293
|
|
|
247
|
-
|
|
248
|
-
|
|
294
|
+
const declarationSnippet = builder.getVar( type, name ) + ' = ' + startSnippet;
|
|
295
|
+
const conditionalSnippet = name + ' ' + condition + ' ' + endSnippet;
|
|
249
296
|
|
|
250
297
|
loopSnippet = `for ( ${ declarationSnippet }; ${ conditionalSnippet }; ${ updateSnippet } )`;
|
|
251
298
|
|
|
@@ -285,7 +332,7 @@ export default LoopNode;
|
|
|
285
332
|
* @param {...any} params - A list of parameters.
|
|
286
333
|
* @returns {LoopNode}
|
|
287
334
|
*/
|
|
288
|
-
export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).
|
|
335
|
+
export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).toStack();
|
|
289
336
|
|
|
290
337
|
/**
|
|
291
338
|
* TSL function for creating a `Continue()` expression.
|
|
@@ -294,7 +341,7 @@ export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params
|
|
|
294
341
|
* @function
|
|
295
342
|
* @returns {ExpressionNode}
|
|
296
343
|
*/
|
|
297
|
-
export const Continue = () => expression( 'continue' ).
|
|
344
|
+
export const Continue = () => expression( 'continue' ).toStack();
|
|
298
345
|
|
|
299
346
|
/**
|
|
300
347
|
* TSL function for creating a `Break()` expression.
|
|
@@ -303,7 +350,7 @@ export const Continue = () => expression( 'continue' ).append();
|
|
|
303
350
|
* @function
|
|
304
351
|
* @returns {ExpressionNode}
|
|
305
352
|
*/
|
|
306
|
-
export const Break = () => expression( 'break' ).
|
|
353
|
+
export const Break = () => expression( 'break' ).toStack();
|
|
307
354
|
|
|
308
355
|
// Deprecated
|
|
309
356
|
|
|
@@ -161,6 +161,17 @@ class ReflectorNode extends TextureNode {
|
|
|
161
161
|
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
+
/**
|
|
165
|
+
* Frees internal resources. Should be called when the node is no longer in use.
|
|
166
|
+
*/
|
|
167
|
+
dispose() {
|
|
168
|
+
|
|
169
|
+
super.dispose();
|
|
170
|
+
|
|
171
|
+
this._reflectorBaseNode.dispose();
|
|
172
|
+
|
|
173
|
+
}
|
|
174
|
+
|
|
164
175
|
}
|
|
165
176
|
|
|
166
177
|
/**
|
|
@@ -269,9 +280,9 @@ class ReflectorBaseNode extends Node {
|
|
|
269
280
|
/**
|
|
270
281
|
* Weak map for managing render targets.
|
|
271
282
|
*
|
|
272
|
-
* @type {
|
|
283
|
+
* @type {Map<Camera, RenderTarget>}
|
|
273
284
|
*/
|
|
274
|
-
this.renderTargets = new
|
|
285
|
+
this.renderTargets = new Map();
|
|
275
286
|
|
|
276
287
|
/**
|
|
277
288
|
* Force render even if reflector is facing away from camera.
|
|
@@ -281,6 +292,17 @@ class ReflectorBaseNode extends Node {
|
|
|
281
292
|
*/
|
|
282
293
|
this.forceUpdate = false;
|
|
283
294
|
|
|
295
|
+
/**
|
|
296
|
+
* Whether the reflector has been rendered or not.
|
|
297
|
+
*
|
|
298
|
+
* When the reflector is facing away from the camera,
|
|
299
|
+
* this flag is set to `false` and the texture will be empty(black).
|
|
300
|
+
*
|
|
301
|
+
* @type {boolean}
|
|
302
|
+
* @default {false}
|
|
303
|
+
*/
|
|
304
|
+
this.hasOutput = false;
|
|
305
|
+
|
|
284
306
|
}
|
|
285
307
|
|
|
286
308
|
/**
|
|
@@ -308,6 +330,21 @@ class ReflectorBaseNode extends Node {
|
|
|
308
330
|
|
|
309
331
|
}
|
|
310
332
|
|
|
333
|
+
/**
|
|
334
|
+
* Frees internal resources. Should be called when the node is no longer in use.
|
|
335
|
+
*/
|
|
336
|
+
dispose() {
|
|
337
|
+
|
|
338
|
+
super.dispose();
|
|
339
|
+
|
|
340
|
+
for ( const renderTarget of this.renderTargets.values() ) {
|
|
341
|
+
|
|
342
|
+
renderTarget.dispose();
|
|
343
|
+
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
}
|
|
347
|
+
|
|
311
348
|
/**
|
|
312
349
|
* Returns a virtual camera for the given camera. The virtual camera is used to
|
|
313
350
|
* render the scene from the reflector's view so correct reflections can be produced.
|
|
@@ -398,7 +435,21 @@ class ReflectorBaseNode extends Node {
|
|
|
398
435
|
// Avoid rendering when reflector is facing away unless forcing an update
|
|
399
436
|
const isFacingAway = _view.dot( _normal ) > 0;
|
|
400
437
|
|
|
401
|
-
|
|
438
|
+
let needsClear = false;
|
|
439
|
+
|
|
440
|
+
if ( isFacingAway === true && this.forceUpdate === false ) {
|
|
441
|
+
|
|
442
|
+
if ( this.hasOutput === false ) {
|
|
443
|
+
|
|
444
|
+
_inReflector = false;
|
|
445
|
+
|
|
446
|
+
return;
|
|
447
|
+
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
needsClear = true;
|
|
451
|
+
|
|
452
|
+
}
|
|
402
453
|
|
|
403
454
|
_view.reflect( _normal ).negate();
|
|
404
455
|
_view.add( _reflectorWorldPosition );
|
|
@@ -473,7 +524,19 @@ class ReflectorBaseNode extends Node {
|
|
|
473
524
|
renderer.setRenderTarget( renderTarget );
|
|
474
525
|
renderer.autoClear = true;
|
|
475
526
|
|
|
476
|
-
|
|
527
|
+
if ( needsClear ) {
|
|
528
|
+
|
|
529
|
+
renderer.clear();
|
|
530
|
+
|
|
531
|
+
this.hasOutput = false;
|
|
532
|
+
|
|
533
|
+
} else {
|
|
534
|
+
|
|
535
|
+
renderer.render( scene, virtualCamera );
|
|
536
|
+
|
|
537
|
+
this.hasOutput = true;
|
|
538
|
+
|
|
539
|
+
}
|
|
477
540
|
|
|
478
541
|
renderer.setMRT( currentMRT );
|
|
479
542
|
renderer.setRenderTarget( currentRenderTarget );
|
|
@@ -10,6 +10,7 @@ import { Sphere } from '../math/Sphere.js';
|
|
|
10
10
|
import { Frustum } from '../math/Frustum.js';
|
|
11
11
|
import { Vector3 } from '../math/Vector3.js';
|
|
12
12
|
import { Color } from '../math/Color.js';
|
|
13
|
+
import { FrustumArray } from '../math/FrustumArray.js';
|
|
13
14
|
|
|
14
15
|
function ascIdSort( a, b ) {
|
|
15
16
|
|
|
@@ -79,6 +80,7 @@ class MultiDrawRenderList {
|
|
|
79
80
|
const _matrix = /*@__PURE__*/ new Matrix4();
|
|
80
81
|
const _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );
|
|
81
82
|
const _frustum = /*@__PURE__*/ new Frustum();
|
|
83
|
+
const _frustumArray = /*@__PURE__*/ new FrustumArray();
|
|
82
84
|
const _box = /*@__PURE__*/ new Box3();
|
|
83
85
|
const _sphere = /*@__PURE__*/ new Sphere();
|
|
84
86
|
const _vector = /*@__PURE__*/ new Vector3();
|
|
@@ -1441,15 +1443,24 @@ class BatchedMesh extends Mesh {
|
|
|
1441
1443
|
} ) );
|
|
1442
1444
|
this._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );
|
|
1443
1445
|
|
|
1446
|
+
this._availableInstanceIds = source._availableInstanceIds.slice();
|
|
1447
|
+
this._availableGeometryIds = source._availableGeometryIds.slice();
|
|
1448
|
+
|
|
1449
|
+
this._nextIndexStart = source._nextIndexStart;
|
|
1450
|
+
this._nextVertexStart = source._nextVertexStart;
|
|
1451
|
+
this._geometryCount = source._geometryCount;
|
|
1452
|
+
|
|
1444
1453
|
this._maxInstanceCount = source._maxInstanceCount;
|
|
1445
1454
|
this._maxVertexCount = source._maxVertexCount;
|
|
1446
1455
|
this._maxIndexCount = source._maxIndexCount;
|
|
1447
1456
|
|
|
1448
1457
|
this._geometryInitialized = source._geometryInitialized;
|
|
1449
|
-
this._geometryCount = source._geometryCount;
|
|
1450
1458
|
this._multiDrawCounts = source._multiDrawCounts.slice();
|
|
1451
1459
|
this._multiDrawStarts = source._multiDrawStarts.slice();
|
|
1452
1460
|
|
|
1461
|
+
this._indirectTexture = source._indirectTexture.clone();
|
|
1462
|
+
this._indirectTexture.image.data = this._indirectTexture.image.data.slice();
|
|
1463
|
+
|
|
1453
1464
|
this._matricesTexture = source._matricesTexture.clone();
|
|
1454
1465
|
this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
|
|
1455
1466
|
|
|
@@ -1511,8 +1522,9 @@ class BatchedMesh extends Mesh {
|
|
|
1511
1522
|
const indirectTexture = this._indirectTexture;
|
|
1512
1523
|
const indirectArray = indirectTexture.image.data;
|
|
1513
1524
|
|
|
1525
|
+
const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
|
|
1514
1526
|
// prepare the frustum in the local frame
|
|
1515
|
-
if ( perObjectFrustumCulled ) {
|
|
1527
|
+
if ( perObjectFrustumCulled && ! camera.isArrayCamera ) {
|
|
1516
1528
|
|
|
1517
1529
|
_matrix
|
|
1518
1530
|
.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )
|
|
@@ -1546,7 +1558,7 @@ class BatchedMesh extends Mesh {
|
|
|
1546
1558
|
let culled = false;
|
|
1547
1559
|
if ( perObjectFrustumCulled ) {
|
|
1548
1560
|
|
|
1549
|
-
culled = !
|
|
1561
|
+
culled = ! frustum.intersectsSphere( _sphere, camera );
|
|
1550
1562
|
|
|
1551
1563
|
}
|
|
1552
1564
|
|
|
@@ -1603,7 +1615,7 @@ class BatchedMesh extends Mesh {
|
|
|
1603
1615
|
// get the bounds in world space
|
|
1604
1616
|
this.getMatrixAt( i, _matrix );
|
|
1605
1617
|
this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
|
|
1606
|
-
culled = !
|
|
1618
|
+
culled = ! frustum.intersectsSphere( _sphere, camera );
|
|
1607
1619
|
|
|
1608
1620
|
}
|
|
1609
1621
|
|
package/src/objects/Mesh.js
CHANGED
|
@@ -94,6 +94,15 @@ class Mesh extends Object3D {
|
|
|
94
94
|
*/
|
|
95
95
|
this.morphTargetInfluences = undefined;
|
|
96
96
|
|
|
97
|
+
/**
|
|
98
|
+
* The number of instances of this mesh.
|
|
99
|
+
* Can only be used with {@link WebGPURenderer}.
|
|
100
|
+
*
|
|
101
|
+
* @type {number}
|
|
102
|
+
* @default 1
|
|
103
|
+
*/
|
|
104
|
+
this.count = 1;
|
|
105
|
+
|
|
97
106
|
this.updateMorphTargets();
|
|
98
107
|
|
|
99
108
|
}
|