super-three 0.176.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
|
@@ -31,6 +31,7 @@ class WebGPUBackend extends Backend {
|
|
|
31
31
|
* @typedef {Object} WebGPUBackend~Options
|
|
32
32
|
* @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
|
|
33
33
|
* @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
|
|
34
|
+
* @property {boolean} [compatibilityMode=false] - Whether the backend should be in compatibility mode or not.
|
|
34
35
|
* @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
|
|
35
36
|
* @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
|
|
36
37
|
* @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
|
|
@@ -63,9 +64,17 @@ class WebGPUBackend extends Backend {
|
|
|
63
64
|
|
|
64
65
|
// some parameters require default values other than "undefined"
|
|
65
66
|
this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;
|
|
67
|
+
this.parameters.compatibilityMode = ( parameters.compatibilityMode === undefined ) ? false : parameters.compatibilityMode;
|
|
66
68
|
|
|
67
69
|
this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
|
|
68
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Indicates whether the backend is in compatibility mode or not.
|
|
73
|
+
* @type {boolean}
|
|
74
|
+
* @default false
|
|
75
|
+
*/
|
|
76
|
+
this.compatibilityMode = this.parameters.compatibilityMode;
|
|
77
|
+
|
|
69
78
|
/**
|
|
70
79
|
* A reference to the device.
|
|
71
80
|
*
|
|
@@ -168,7 +177,8 @@ class WebGPUBackend extends Backend {
|
|
|
168
177
|
if ( parameters.device === undefined ) {
|
|
169
178
|
|
|
170
179
|
const adapterOptions = {
|
|
171
|
-
powerPreference: parameters.powerPreference
|
|
180
|
+
powerPreference: parameters.powerPreference,
|
|
181
|
+
featureLevel: parameters.compatibilityMode ? 'compatibility' : undefined
|
|
172
182
|
};
|
|
173
183
|
|
|
174
184
|
const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null;
|
|
@@ -342,6 +352,20 @@ class WebGPUBackend extends Backend {
|
|
|
342
352
|
|
|
343
353
|
}
|
|
344
354
|
|
|
355
|
+
/**
|
|
356
|
+
* Internal to determine if the current render target is a render target array with depth 2D array texture.
|
|
357
|
+
*
|
|
358
|
+
* @param {RenderContext} renderContext - The render context.
|
|
359
|
+
* @return {boolean} Whether the render target is a render target array with depth 2D array texture.
|
|
360
|
+
*
|
|
361
|
+
* @private
|
|
362
|
+
*/
|
|
363
|
+
_isRenderCameraDepthArray( renderContext ) {
|
|
364
|
+
|
|
365
|
+
return renderContext.depthTexture && renderContext.depthTexture.image.depth > 1 && renderContext.camera.isArrayCamera;
|
|
366
|
+
|
|
367
|
+
}
|
|
368
|
+
|
|
345
369
|
/**
|
|
346
370
|
* Returns the render pass descriptor for the given render context.
|
|
347
371
|
*
|
|
@@ -397,6 +421,8 @@ class WebGPUBackend extends Backend {
|
|
|
397
421
|
|
|
398
422
|
let sliceIndex;
|
|
399
423
|
|
|
424
|
+
const isRenderCameraDepthArray = this._isRenderCameraDepthArray( renderContext );
|
|
425
|
+
|
|
400
426
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
401
427
|
|
|
402
428
|
const textureData = this.get( textures[ i ] );
|
|
@@ -418,34 +444,62 @@ class WebGPUBackend extends Backend {
|
|
|
418
444
|
viewDescriptor.dimension = GPUTextureViewDimension.ThreeD;
|
|
419
445
|
viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;
|
|
420
446
|
|
|
421
|
-
} else if ( renderTarget.
|
|
447
|
+
} else if ( renderTarget.isRenderTarget && textures[ i ].image.depth > 1 ) {
|
|
422
448
|
|
|
423
|
-
|
|
424
|
-
|
|
449
|
+
if ( isRenderCameraDepthArray === true ) {
|
|
450
|
+
|
|
451
|
+
const cameras = renderContext.camera.cameras;
|
|
452
|
+
for ( let layer = 0; layer < cameras.length; layer ++ ) {
|
|
453
|
+
|
|
454
|
+
const layerViewDescriptor = {
|
|
455
|
+
...viewDescriptor,
|
|
456
|
+
baseArrayLayer: layer,
|
|
457
|
+
arrayLayerCount: 1,
|
|
458
|
+
dimension: GPUTextureViewDimension.TwoD
|
|
459
|
+
};
|
|
460
|
+
const textureView = textureData.texture.createView( layerViewDescriptor );
|
|
461
|
+
textureViews.push( {
|
|
462
|
+
view: textureView,
|
|
463
|
+
resolveTarget: undefined,
|
|
464
|
+
depthSlice: undefined
|
|
465
|
+
} );
|
|
466
|
+
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
} else {
|
|
470
|
+
|
|
471
|
+
viewDescriptor.dimension = GPUTextureViewDimension.TwoDArray;
|
|
472
|
+
viewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;
|
|
473
|
+
|
|
474
|
+
}
|
|
425
475
|
|
|
426
476
|
}
|
|
427
477
|
|
|
428
|
-
|
|
478
|
+
if ( isRenderCameraDepthArray !== true ) {
|
|
429
479
|
|
|
430
|
-
|
|
480
|
+
const textureView = textureData.texture.createView( viewDescriptor );
|
|
431
481
|
|
|
432
|
-
|
|
482
|
+
let view, resolveTarget;
|
|
433
483
|
|
|
434
|
-
|
|
435
|
-
resolveTarget = textureView;
|
|
484
|
+
if ( textureData.msaaTexture !== undefined ) {
|
|
436
485
|
|
|
437
|
-
|
|
486
|
+
view = textureData.msaaTexture.createView();
|
|
487
|
+
resolveTarget = textureView;
|
|
438
488
|
|
|
439
|
-
|
|
440
|
-
resolveTarget = undefined;
|
|
489
|
+
} else {
|
|
441
490
|
|
|
442
|
-
|
|
491
|
+
view = textureView;
|
|
492
|
+
resolveTarget = undefined;
|
|
493
|
+
|
|
494
|
+
}
|
|
443
495
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
496
|
+
textureViews.push( {
|
|
497
|
+
view,
|
|
498
|
+
resolveTarget,
|
|
499
|
+
depthSlice: sliceIndex
|
|
500
|
+
} );
|
|
501
|
+
|
|
502
|
+
}
|
|
449
503
|
|
|
450
504
|
}
|
|
451
505
|
|
|
@@ -454,7 +508,16 @@ class WebGPUBackend extends Backend {
|
|
|
454
508
|
if ( renderContext.depth ) {
|
|
455
509
|
|
|
456
510
|
const depthTextureData = this.get( renderContext.depthTexture );
|
|
457
|
-
|
|
511
|
+
const options = {};
|
|
512
|
+
if ( renderContext.depthTexture.isArrayTexture ) {
|
|
513
|
+
|
|
514
|
+
options.dimension = GPUTextureViewDimension.TwoD;
|
|
515
|
+
options.arrayLayerCount = 1;
|
|
516
|
+
options.baseArrayLayer = renderContext.activeCubeFace;
|
|
517
|
+
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
descriptorBase.depthStencilView = depthTextureData.texture.createView( options );
|
|
458
521
|
|
|
459
522
|
}
|
|
460
523
|
|
|
@@ -576,15 +639,15 @@ class WebGPUBackend extends Backend {
|
|
|
576
639
|
|
|
577
640
|
colorAttachment.clearValue = i === 0 ? renderContext.clearColorValue : { r: 0, g: 0, b: 0, a: 1 };
|
|
578
641
|
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
579
|
-
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
580
642
|
|
|
581
643
|
} else {
|
|
582
644
|
|
|
583
645
|
colorAttachment.loadOp = GPULoadOp.Load;
|
|
584
|
-
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
585
646
|
|
|
586
647
|
}
|
|
587
648
|
|
|
649
|
+
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
650
|
+
|
|
588
651
|
}
|
|
589
652
|
|
|
590
653
|
} else {
|
|
@@ -595,15 +658,15 @@ class WebGPUBackend extends Backend {
|
|
|
595
658
|
|
|
596
659
|
colorAttachment.clearValue = renderContext.clearColorValue;
|
|
597
660
|
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
598
|
-
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
599
661
|
|
|
600
662
|
} else {
|
|
601
663
|
|
|
602
664
|
colorAttachment.loadOp = GPULoadOp.Load;
|
|
603
|
-
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
604
665
|
|
|
605
666
|
}
|
|
606
667
|
|
|
668
|
+
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
669
|
+
|
|
607
670
|
}
|
|
608
671
|
|
|
609
672
|
//
|
|
@@ -614,60 +677,235 @@ class WebGPUBackend extends Backend {
|
|
|
614
677
|
|
|
615
678
|
depthStencilAttachment.depthClearValue = renderContext.clearDepthValue;
|
|
616
679
|
depthStencilAttachment.depthLoadOp = GPULoadOp.Clear;
|
|
617
|
-
depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
|
|
618
680
|
|
|
619
681
|
} else {
|
|
620
682
|
|
|
621
683
|
depthStencilAttachment.depthLoadOp = GPULoadOp.Load;
|
|
622
|
-
depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
|
|
623
684
|
|
|
624
685
|
}
|
|
625
686
|
|
|
687
|
+
depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;
|
|
688
|
+
|
|
626
689
|
}
|
|
627
690
|
|
|
628
691
|
if ( renderContext.stencil ) {
|
|
629
692
|
|
|
630
|
-
|
|
693
|
+
if ( renderContext.clearStencil ) {
|
|
631
694
|
|
|
632
695
|
depthStencilAttachment.stencilClearValue = renderContext.clearStencilValue;
|
|
633
696
|
depthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;
|
|
634
|
-
depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
|
|
635
697
|
|
|
636
698
|
} else {
|
|
637
699
|
|
|
638
700
|
depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;
|
|
639
|
-
depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
|
|
640
701
|
|
|
641
702
|
}
|
|
642
703
|
|
|
704
|
+
depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;
|
|
705
|
+
|
|
643
706
|
}
|
|
644
707
|
|
|
645
708
|
//
|
|
646
709
|
|
|
647
710
|
const encoder = device.createCommandEncoder( { label: 'renderContext_' + renderContext.id } );
|
|
648
|
-
|
|
711
|
+
|
|
712
|
+
// shadow arrays - prepare bundle encoders for each camera in an array camera
|
|
713
|
+
|
|
714
|
+
if ( this._isRenderCameraDepthArray( renderContext ) === true ) {
|
|
715
|
+
|
|
716
|
+
const cameras = renderContext.camera.cameras;
|
|
717
|
+
|
|
718
|
+
if ( ! renderContextData.layerDescriptors || renderContextData.layerDescriptors.length !== cameras.length ) {
|
|
719
|
+
|
|
720
|
+
this._createDepthLayerDescriptors( renderContext, renderContextData, descriptor, cameras );
|
|
721
|
+
|
|
722
|
+
} else {
|
|
723
|
+
|
|
724
|
+
this._updateDepthLayerDescriptors( renderContext, renderContextData, cameras );
|
|
725
|
+
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
// Create bundle encoders for each layer
|
|
729
|
+
renderContextData.bundleEncoders = [];
|
|
730
|
+
renderContextData.bundleSets = [];
|
|
731
|
+
|
|
732
|
+
// Create separate bundle encoders for each camera in the array
|
|
733
|
+
for ( let i = 0; i < cameras.length; i ++ ) {
|
|
734
|
+
|
|
735
|
+
const bundleEncoder = this.pipelineUtils.createBundleEncoder(
|
|
736
|
+
renderContext,
|
|
737
|
+
'renderBundleArrayCamera_' + i
|
|
738
|
+
);
|
|
739
|
+
|
|
740
|
+
// Initialize state tracking for this bundle
|
|
741
|
+
const bundleSets = {
|
|
742
|
+
attributes: {},
|
|
743
|
+
bindingGroups: [],
|
|
744
|
+
pipeline: null,
|
|
745
|
+
index: null
|
|
746
|
+
};
|
|
747
|
+
|
|
748
|
+
renderContextData.bundleEncoders.push( bundleEncoder );
|
|
749
|
+
renderContextData.bundleSets.push( bundleSets );
|
|
750
|
+
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
// We'll complete the bundles in finishRender
|
|
754
|
+
renderContextData.currentPass = null;
|
|
755
|
+
|
|
756
|
+
} else {
|
|
757
|
+
|
|
758
|
+
const currentPass = encoder.beginRenderPass( descriptor );
|
|
759
|
+
renderContextData.currentPass = currentPass;
|
|
760
|
+
|
|
761
|
+
if ( renderContext.viewport ) {
|
|
762
|
+
|
|
763
|
+
this.updateViewport( renderContext );
|
|
764
|
+
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
if ( renderContext.scissor ) {
|
|
768
|
+
|
|
769
|
+
const { x, y, width, height } = renderContext.scissorValue;
|
|
770
|
+
currentPass.setScissorRect( x, y, width, height );
|
|
771
|
+
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
}
|
|
649
775
|
|
|
650
776
|
//
|
|
651
777
|
|
|
652
778
|
renderContextData.descriptor = descriptor;
|
|
653
779
|
renderContextData.encoder = encoder;
|
|
654
|
-
renderContextData.currentPass = currentPass;
|
|
655
780
|
renderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };
|
|
656
781
|
renderContextData.renderBundles = [];
|
|
657
782
|
|
|
658
|
-
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
/**
|
|
786
|
+
* This method creates layer descriptors for each camera in an array camera
|
|
787
|
+
* to prepare for rendering to a depth array texture.
|
|
788
|
+
*
|
|
789
|
+
* @param {RenderContext} renderContext - The render context.
|
|
790
|
+
* @param {Object} renderContextData - The render context data.
|
|
791
|
+
* @param {Object} descriptor - The render pass descriptor.
|
|
792
|
+
* @param {ArrayCamera} cameras - The array camera.
|
|
793
|
+
*
|
|
794
|
+
* @private
|
|
795
|
+
*/
|
|
796
|
+
_createDepthLayerDescriptors( renderContext, renderContextData, descriptor, cameras ) {
|
|
797
|
+
|
|
798
|
+
const depthStencilAttachment = descriptor.depthStencilAttachment;
|
|
799
|
+
renderContextData.layerDescriptors = [];
|
|
800
|
+
|
|
801
|
+
const depthTextureData = this.get( renderContext.depthTexture );
|
|
802
|
+
if ( ! depthTextureData.viewCache ) {
|
|
803
|
+
|
|
804
|
+
depthTextureData.viewCache = [];
|
|
805
|
+
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
for ( let i = 0; i < cameras.length; i ++ ) {
|
|
809
|
+
|
|
810
|
+
const layerDescriptor = {
|
|
811
|
+
...descriptor,
|
|
812
|
+
colorAttachments: [ {
|
|
813
|
+
...descriptor.colorAttachments[ 0 ],
|
|
814
|
+
view: descriptor.colorAttachments[ i ].view
|
|
815
|
+
} ]
|
|
816
|
+
};
|
|
817
|
+
|
|
818
|
+
if ( descriptor.depthStencilAttachment ) {
|
|
819
|
+
|
|
820
|
+
const layerIndex = i;
|
|
821
|
+
|
|
822
|
+
if ( ! depthTextureData.viewCache[ layerIndex ] ) {
|
|
823
|
+
|
|
824
|
+
depthTextureData.viewCache[ layerIndex ] = depthTextureData.texture.createView( {
|
|
825
|
+
dimension: GPUTextureViewDimension.TwoD,
|
|
826
|
+
baseArrayLayer: i,
|
|
827
|
+
arrayLayerCount: 1
|
|
828
|
+
} );
|
|
829
|
+
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
layerDescriptor.depthStencilAttachment = {
|
|
833
|
+
view: depthTextureData.viewCache[ layerIndex ],
|
|
834
|
+
depthLoadOp: depthStencilAttachment.depthLoadOp || GPULoadOp.Clear,
|
|
835
|
+
depthStoreOp: depthStencilAttachment.depthStoreOp || GPUStoreOp.Store,
|
|
836
|
+
depthClearValue: depthStencilAttachment.depthClearValue || 1.0
|
|
837
|
+
};
|
|
838
|
+
|
|
839
|
+
if ( renderContext.stencil ) {
|
|
840
|
+
|
|
841
|
+
layerDescriptor.depthStencilAttachment.stencilLoadOp = depthStencilAttachment.stencilLoadOp;
|
|
842
|
+
layerDescriptor.depthStencilAttachment.stencilStoreOp = depthStencilAttachment.stencilStoreOp;
|
|
843
|
+
layerDescriptor.depthStencilAttachment.stencilClearValue = depthStencilAttachment.stencilClearValue;
|
|
844
|
+
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
} else {
|
|
848
|
+
|
|
849
|
+
layerDescriptor.depthStencilAttachment = { ...depthStencilAttachment };
|
|
659
850
|
|
|
660
|
-
|
|
851
|
+
}
|
|
661
852
|
|
|
662
|
-
|
|
853
|
+
renderContextData.layerDescriptors.push( layerDescriptor );
|
|
663
854
|
|
|
664
855
|
}
|
|
665
856
|
|
|
666
|
-
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
/**
|
|
860
|
+
* This method updates the layer descriptors for each camera in an array camera
|
|
861
|
+
* to prepare for rendering to a depth array texture.
|
|
862
|
+
*
|
|
863
|
+
* @param {RenderContext} renderContext - The render context.
|
|
864
|
+
* @param {Object} renderContextData - The render context data.
|
|
865
|
+
* @param {ArrayCamera} cameras - The array camera.
|
|
866
|
+
*
|
|
867
|
+
*/
|
|
868
|
+
_updateDepthLayerDescriptors( renderContext, renderContextData, cameras ) {
|
|
869
|
+
|
|
870
|
+
for ( let i = 0; i < cameras.length; i ++ ) {
|
|
871
|
+
|
|
872
|
+
const layerDescriptor = renderContextData.layerDescriptors[ i ];
|
|
873
|
+
|
|
874
|
+
if ( layerDescriptor.depthStencilAttachment ) {
|
|
875
|
+
|
|
876
|
+
const depthAttachment = layerDescriptor.depthStencilAttachment;
|
|
667
877
|
|
|
668
|
-
|
|
878
|
+
if ( renderContext.depth ) {
|
|
669
879
|
|
|
670
|
-
|
|
880
|
+
if ( renderContext.clearDepth ) {
|
|
881
|
+
|
|
882
|
+
depthAttachment.depthClearValue = renderContext.clearDepthValue;
|
|
883
|
+
depthAttachment.depthLoadOp = GPULoadOp.Clear;
|
|
884
|
+
|
|
885
|
+
} else {
|
|
886
|
+
|
|
887
|
+
depthAttachment.depthLoadOp = GPULoadOp.Load;
|
|
888
|
+
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
if ( renderContext.stencil ) {
|
|
894
|
+
|
|
895
|
+
if ( renderContext.clearStencil ) {
|
|
896
|
+
|
|
897
|
+
depthAttachment.stencilClearValue = renderContext.clearStencilValue;
|
|
898
|
+
depthAttachment.stencilLoadOp = GPULoadOp.Clear;
|
|
899
|
+
|
|
900
|
+
} else {
|
|
901
|
+
|
|
902
|
+
depthAttachment.stencilLoadOp = GPULoadOp.Load;
|
|
903
|
+
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
}
|
|
671
909
|
|
|
672
910
|
}
|
|
673
911
|
|
|
@@ -696,7 +934,55 @@ class WebGPUBackend extends Backend {
|
|
|
696
934
|
|
|
697
935
|
}
|
|
698
936
|
|
|
699
|
-
|
|
937
|
+
// shadow arrays - Execute bundles for each layer
|
|
938
|
+
|
|
939
|
+
const encoder = renderContextData.encoder;
|
|
940
|
+
|
|
941
|
+
if ( this._isRenderCameraDepthArray( renderContext ) === true ) {
|
|
942
|
+
|
|
943
|
+
const bundles = [];
|
|
944
|
+
|
|
945
|
+
for ( let i = 0; i < renderContextData.bundleEncoders.length; i ++ ) {
|
|
946
|
+
|
|
947
|
+
const bundleEncoder = renderContextData.bundleEncoders[ i ];
|
|
948
|
+
bundles.push( bundleEncoder.finish() );
|
|
949
|
+
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
for ( let i = 0; i < renderContextData.layerDescriptors.length; i ++ ) {
|
|
953
|
+
|
|
954
|
+
if ( i < bundles.length ) {
|
|
955
|
+
|
|
956
|
+
const layerDescriptor = renderContextData.layerDescriptors[ i ];
|
|
957
|
+
const renderPass = encoder.beginRenderPass( layerDescriptor );
|
|
958
|
+
|
|
959
|
+
if ( renderContext.viewport ) {
|
|
960
|
+
|
|
961
|
+
const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
|
|
962
|
+
renderPass.setViewport( x, y, width, height, minDepth, maxDepth );
|
|
963
|
+
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
if ( renderContext.scissor ) {
|
|
967
|
+
|
|
968
|
+
const { x, y, width, height } = renderContext.scissorValue;
|
|
969
|
+
renderPass.setScissorRect( x, y, width, height );
|
|
970
|
+
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
renderPass.executeBundles( [ bundles[ i ] ] );
|
|
974
|
+
|
|
975
|
+
renderPass.end();
|
|
976
|
+
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
} else if ( renderContextData.currentPass ) {
|
|
982
|
+
|
|
983
|
+
renderContextData.currentPass.end();
|
|
984
|
+
|
|
985
|
+
}
|
|
700
986
|
|
|
701
987
|
if ( occlusionQueryCount > 0 ) {
|
|
702
988
|
|
|
@@ -1040,7 +1326,8 @@ class WebGPUBackend extends Backend {
|
|
|
1040
1326
|
// pipeline
|
|
1041
1327
|
|
|
1042
1328
|
const pipelineGPU = this.get( pipeline ).pipeline;
|
|
1043
|
-
|
|
1329
|
+
|
|
1330
|
+
this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
|
|
1044
1331
|
|
|
1045
1332
|
// bind groups
|
|
1046
1333
|
|
|
@@ -1123,123 +1410,89 @@ class WebGPUBackend extends Backend {
|
|
|
1123
1410
|
const bindings = renderObject.getBindings();
|
|
1124
1411
|
const renderContextData = this.get( context );
|
|
1125
1412
|
const pipelineGPU = this.get( pipeline ).pipeline;
|
|
1126
|
-
const currentSets = renderContextData.currentSets;
|
|
1127
|
-
const passEncoderGPU = renderContextData.currentPass;
|
|
1128
1413
|
|
|
1129
|
-
const
|
|
1414
|
+
const index = renderObject.getIndex();
|
|
1415
|
+
const hasIndex = ( index !== null );
|
|
1416
|
+
|
|
1130
1417
|
|
|
1418
|
+
const drawParams = renderObject.getDrawParameters();
|
|
1131
1419
|
if ( drawParams === null ) return;
|
|
1132
1420
|
|
|
1133
1421
|
// pipeline
|
|
1134
1422
|
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
passEncoderGPU.setPipeline( pipelineGPU );
|
|
1423
|
+
const setPipelineAndBindings = ( passEncoderGPU, currentSets ) => {
|
|
1138
1424
|
|
|
1425
|
+
// pipeline
|
|
1426
|
+
this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
|
|
1139
1427
|
currentSets.pipeline = pipelineGPU;
|
|
1140
1428
|
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
const currentBindingGroups = currentSets.bindingGroups;
|
|
1146
|
-
|
|
1147
|
-
for ( let i = 0, l = bindings.length; i < l; i ++ ) {
|
|
1429
|
+
// bind groups
|
|
1430
|
+
const currentBindingGroups = currentSets.bindingGroups;
|
|
1431
|
+
for ( let i = 0, l = bindings.length; i < l; i ++ ) {
|
|
1148
1432
|
|
|
1149
|
-
|
|
1150
|
-
|
|
1433
|
+
const bindGroup = bindings[ i ];
|
|
1434
|
+
const bindingsData = this.get( bindGroup );
|
|
1435
|
+
if ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) {
|
|
1151
1436
|
|
|
1152
|
-
|
|
1437
|
+
passEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );
|
|
1438
|
+
currentBindingGroups[ bindGroup.index ] = bindGroup.id;
|
|
1153
1439
|
|
|
1154
|
-
|
|
1155
|
-
currentBindingGroups[ bindGroup.index ] = bindGroup.id;
|
|
1156
|
-
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
}
|
|
1160
|
-
|
|
1161
|
-
// attributes
|
|
1162
|
-
|
|
1163
|
-
const index = renderObject.getIndex();
|
|
1164
|
-
|
|
1165
|
-
const hasIndex = ( index !== null );
|
|
1166
|
-
|
|
1167
|
-
// index
|
|
1168
|
-
|
|
1169
|
-
if ( hasIndex === true ) {
|
|
1170
|
-
|
|
1171
|
-
if ( currentSets.index !== index ) {
|
|
1172
|
-
|
|
1173
|
-
const buffer = this.get( index ).buffer;
|
|
1174
|
-
const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
|
|
1175
|
-
|
|
1176
|
-
passEncoderGPU.setIndexBuffer( buffer, indexFormat );
|
|
1177
|
-
|
|
1178
|
-
currentSets.index = index;
|
|
1440
|
+
}
|
|
1179
1441
|
|
|
1180
1442
|
}
|
|
1181
1443
|
|
|
1182
|
-
|
|
1444
|
+
// attributes
|
|
1183
1445
|
|
|
1184
|
-
|
|
1446
|
+
// index
|
|
1185
1447
|
|
|
1186
|
-
|
|
1448
|
+
if ( hasIndex === true ) {
|
|
1187
1449
|
|
|
1188
|
-
|
|
1450
|
+
if ( currentSets.index !== index ) {
|
|
1189
1451
|
|
|
1190
|
-
|
|
1452
|
+
const buffer = this.get( index ).buffer;
|
|
1453
|
+
const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
|
|
1191
1454
|
|
|
1192
|
-
|
|
1455
|
+
passEncoderGPU.setIndexBuffer( buffer, indexFormat );
|
|
1193
1456
|
|
|
1194
|
-
|
|
1195
|
-
passEncoderGPU.setVertexBuffer( i, buffer );
|
|
1457
|
+
currentSets.index = index;
|
|
1196
1458
|
|
|
1197
|
-
|
|
1459
|
+
}
|
|
1198
1460
|
|
|
1199
1461
|
}
|
|
1462
|
+
// vertex buffers
|
|
1200
1463
|
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
// occlusion queries - handle multiple consecutive draw calls for an object
|
|
1204
|
-
|
|
1205
|
-
if ( renderContextData.occlusionQuerySet !== undefined ) {
|
|
1206
|
-
|
|
1207
|
-
const lastObject = renderContextData.lastOcclusionObject;
|
|
1464
|
+
const vertexBuffers = renderObject.getVertexBuffers();
|
|
1208
1465
|
|
|
1209
|
-
|
|
1466
|
+
for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
|
|
1210
1467
|
|
|
1211
|
-
|
|
1468
|
+
const vertexBuffer = vertexBuffers[ i ];
|
|
1212
1469
|
|
|
1213
|
-
|
|
1214
|
-
renderContextData.occlusionQueryIndex ++;
|
|
1470
|
+
if ( currentSets.attributes[ i ] !== vertexBuffer ) {
|
|
1215
1471
|
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
if ( object.occlusionTest === true ) {
|
|
1472
|
+
const buffer = this.get( vertexBuffer ).buffer;
|
|
1473
|
+
passEncoderGPU.setVertexBuffer( i, buffer );
|
|
1219
1474
|
|
|
1220
|
-
|
|
1221
|
-
renderContextData.occlusionQueryObjects[ renderContextData.occlusionQueryIndex ] = object;
|
|
1475
|
+
currentSets.attributes[ i ] = vertexBuffer;
|
|
1222
1476
|
|
|
1223
1477
|
}
|
|
1224
1478
|
|
|
1225
|
-
renderContextData.lastOcclusionObject = object;
|
|
1226
|
-
|
|
1227
1479
|
}
|
|
1480
|
+
// stencil
|
|
1228
1481
|
|
|
1229
|
-
|
|
1482
|
+
if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
|
|
1230
1483
|
|
|
1231
|
-
|
|
1484
|
+
passEncoderGPU.setStencilReference( material.stencilRef );
|
|
1485
|
+
renderContextData.currentStencilRef = material.stencilRef;
|
|
1232
1486
|
|
|
1233
|
-
|
|
1487
|
+
}
|
|
1234
1488
|
|
|
1235
|
-
passEncoderGPU.setStencilReference( material.stencilRef );
|
|
1236
|
-
renderContextData.currentStencilRef = material.stencilRef;
|
|
1237
1489
|
|
|
1238
|
-
}
|
|
1490
|
+
};
|
|
1239
1491
|
|
|
1240
|
-
// draw
|
|
1492
|
+
// Define draw function
|
|
1493
|
+
const draw = ( passEncoderGPU, currentSets ) => {
|
|
1241
1494
|
|
|
1242
|
-
|
|
1495
|
+
setPipelineAndBindings( passEncoderGPU, currentSets );
|
|
1243
1496
|
|
|
1244
1497
|
if ( object.isBatchedMesh === true ) {
|
|
1245
1498
|
|
|
@@ -1355,18 +1608,45 @@ class WebGPUBackend extends Backend {
|
|
|
1355
1608
|
|
|
1356
1609
|
const vp = subCamera.viewport;
|
|
1357
1610
|
|
|
1358
|
-
passEncoderGPU.setViewport(
|
|
1359
|
-
Math.floor( vp.x * pixelRatio ),
|
|
1360
|
-
Math.floor( vp.y * pixelRatio ),
|
|
1361
|
-
Math.floor( vp.width * pixelRatio ),
|
|
1362
|
-
Math.floor( vp.height * pixelRatio ),
|
|
1363
|
-
context.viewportValue.minDepth,
|
|
1364
|
-
context.viewportValue.maxDepth
|
|
1365
|
-
);
|
|
1366
1611
|
|
|
1367
|
-
passEncoderGPU.setBindGroup( cameraIndex.index, cameraData.indexesGPU[ i ] );
|
|
1368
1612
|
|
|
1369
|
-
|
|
1613
|
+
let pass = renderContextData.currentPass;
|
|
1614
|
+
let sets = renderContextData.currentSets;
|
|
1615
|
+
if ( renderContextData.bundleEncoders ) {
|
|
1616
|
+
|
|
1617
|
+
const bundleEncoder = renderContextData.bundleEncoders[ i ];
|
|
1618
|
+
const bundleSets = renderContextData.bundleSets[ i ];
|
|
1619
|
+
pass = bundleEncoder;
|
|
1620
|
+
sets = bundleSets;
|
|
1621
|
+
|
|
1622
|
+
}
|
|
1623
|
+
|
|
1624
|
+
|
|
1625
|
+
|
|
1626
|
+
if ( vp ) {
|
|
1627
|
+
|
|
1628
|
+
pass.setViewport(
|
|
1629
|
+
Math.floor( vp.x * pixelRatio ),
|
|
1630
|
+
Math.floor( vp.y * pixelRatio ),
|
|
1631
|
+
Math.floor( vp.width * pixelRatio ),
|
|
1632
|
+
Math.floor( vp.height * pixelRatio ),
|
|
1633
|
+
context.viewportValue.minDepth,
|
|
1634
|
+
context.viewportValue.maxDepth
|
|
1635
|
+
);
|
|
1636
|
+
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
|
|
1640
|
+
// Set camera index binding for this layer
|
|
1641
|
+
if ( cameraIndex && cameraData.indexesGPU ) {
|
|
1642
|
+
|
|
1643
|
+
pass.setBindGroup( cameraIndex.index, cameraData.indexesGPU[ i ] );
|
|
1644
|
+
sets.bindingGroups[ cameraIndex.index ] = cameraIndex.id;
|
|
1645
|
+
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
draw( pass, sets );
|
|
1649
|
+
|
|
1370
1650
|
|
|
1371
1651
|
}
|
|
1372
1652
|
|
|
@@ -1374,7 +1654,38 @@ class WebGPUBackend extends Backend {
|
|
|
1374
1654
|
|
|
1375
1655
|
} else {
|
|
1376
1656
|
|
|
1377
|
-
|
|
1657
|
+
// Regular single camera rendering
|
|
1658
|
+
if ( renderContextData.currentPass ) {
|
|
1659
|
+
|
|
1660
|
+
// Handle occlusion queries
|
|
1661
|
+
if ( renderContextData.occlusionQuerySet !== undefined ) {
|
|
1662
|
+
|
|
1663
|
+
const lastObject = renderContextData.lastOcclusionObject;
|
|
1664
|
+
if ( lastObject !== object ) {
|
|
1665
|
+
|
|
1666
|
+
if ( lastObject !== null && lastObject.occlusionTest === true ) {
|
|
1667
|
+
|
|
1668
|
+
renderContextData.currentPass.endOcclusionQuery();
|
|
1669
|
+
renderContextData.occlusionQueryIndex ++;
|
|
1670
|
+
|
|
1671
|
+
}
|
|
1672
|
+
|
|
1673
|
+
if ( object.occlusionTest === true ) {
|
|
1674
|
+
|
|
1675
|
+
renderContextData.currentPass.beginOcclusionQuery( renderContextData.occlusionQueryIndex );
|
|
1676
|
+
renderContextData.occlusionQueryObjects[ renderContextData.occlusionQueryIndex ] = object;
|
|
1677
|
+
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
renderContextData.lastOcclusionObject = object;
|
|
1681
|
+
|
|
1682
|
+
}
|
|
1683
|
+
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
draw( renderContextData.currentPass, renderContextData.currentSets );
|
|
1687
|
+
|
|
1688
|
+
}
|
|
1378
1689
|
|
|
1379
1690
|
}
|
|
1380
1691
|
|
|
@@ -2045,8 +2356,6 @@ class WebGPUBackend extends Backend {
|
|
|
2045
2356
|
]
|
|
2046
2357
|
);
|
|
2047
2358
|
|
|
2048
|
-
if ( texture.generateMipmaps ) this.textureUtils.generateMipmaps( texture );
|
|
2049
|
-
|
|
2050
2359
|
if ( renderContextData.currentPass ) {
|
|
2051
2360
|
|
|
2052
2361
|
const { descriptor } = renderContextData;
|
|
@@ -2083,6 +2392,12 @@ class WebGPUBackend extends Backend {
|
|
|
2083
2392
|
|
|
2084
2393
|
}
|
|
2085
2394
|
|
|
2395
|
+
if ( texture.generateMipmaps ) {
|
|
2396
|
+
|
|
2397
|
+
this.textureUtils.generateMipmaps( texture );
|
|
2398
|
+
|
|
2399
|
+
}
|
|
2400
|
+
|
|
2086
2401
|
}
|
|
2087
2402
|
|
|
2088
2403
|
}
|