super-three 0.177.0 → 0.181.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/three.cjs +1994 -749
- package/build/three.core.js +1358 -506
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +631 -247
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +113 -33
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +9571 -3424
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +9397 -3426
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +2 -3
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/capabilities/WebGL.js +0 -27
- package/examples/jsm/capabilities/WebGPU.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +9 -9
- package/examples/jsm/controls/DragControls.js +7 -57
- package/examples/jsm/controls/FirstPersonControls.js +3 -3
- package/examples/jsm/controls/FlyControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +1 -1
- package/examples/jsm/controls/TransformControls.js +62 -15
- package/examples/jsm/csm/CSMShadowNode.js +4 -4
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/environments/RoomEnvironment.js +8 -3
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +33 -25
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +683 -299
- package/examples/jsm/geometries/DecalGeometry.js +2 -2
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +3 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/ViewHelper.js +43 -5
- package/examples/jsm/inspector/Inspector.js +427 -0
- package/examples/jsm/inspector/RendererInspector.js +415 -0
- package/examples/jsm/inspector/tabs/Console.js +204 -0
- package/examples/jsm/inspector/tabs/Parameters.js +332 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Viewer.js +166 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +170 -0
- package/examples/jsm/inspector/ui/Style.js +654 -0
- package/examples/jsm/inspector/ui/Tab.js +46 -0
- package/examples/jsm/inspector/ui/Values.js +423 -0
- package/examples/jsm/inspector/ui/utils.js +56 -0
- package/examples/jsm/interactive/HTMLMesh.js +11 -13
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
- package/examples/jsm/lights/LightProbeGenerator.js +14 -3
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +4 -4
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +210 -22
- package/examples/jsm/loaders/FBXLoader.js +4 -4
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GLTFLoader.js +14 -8
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +486 -0
- package/examples/jsm/loaders/KTX2Loader.js +136 -49
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +2 -2
- package/examples/jsm/loaders/MaterialXLoader.js +233 -34
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TTFLoader.js +13 -1
- package/examples/jsm/loaders/USDLoader.js +219 -0
- package/examples/jsm/loaders/USDZLoader.js +4 -892
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/loaders/usd/USDAParser.js +741 -0
- package/examples/jsm/loaders/usd/USDCParser.js +17 -0
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +3 -3
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +3 -3
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/SkyMesh.js +3 -3
- package/examples/jsm/objects/Water.js +3 -3
- package/examples/jsm/objects/WaterMesh.js +6 -6
- package/examples/jsm/physics/RapierPhysics.js +95 -16
- package/examples/jsm/postprocessing/GTAOPass.js +10 -9
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +17 -17
- package/examples/jsm/postprocessing/SSAOPass.js +10 -9
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
- package/examples/jsm/renderers/SVGRenderer.js +1 -1
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +2 -2
- package/examples/jsm/shaders/GodRaysShader.js +1 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
- package/examples/jsm/shaders/SSRShader.js +1 -1
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +381 -30
- package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
- package/examples/jsm/transpiler/Linker.js +327 -0
- package/examples/jsm/transpiler/TSLEncoder.js +196 -92
- package/examples/jsm/transpiler/Transpiler.js +17 -1
- package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
- package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
- package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
- package/examples/jsm/tsl/display/BloomNode.js +11 -6
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- package/examples/jsm/tsl/display/GTAONode.js +53 -5
- package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
- package/examples/jsm/tsl/display/OutlineNode.js +13 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +654 -0
- package/examples/jsm/tsl/display/SSRNode.js +182 -65
- package/examples/jsm/tsl/display/SSSNode.js +488 -0
- package/examples/jsm/tsl/display/TRAANode.js +578 -0
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/hashBlur.js +18 -20
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
- package/package.json +5 -10
- package/src/Three.Core.js +5 -2
- package/src/Three.TSL.js +112 -32
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +4 -0
- package/src/animation/AnimationClip.js +20 -4
- package/src/animation/AnimationMixer.js +3 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/KeyframeTrack.js +8 -7
- package/src/animation/PropertyBinding.js +12 -11
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +10 -9
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/Camera.js +14 -0
- package/src/cameras/OrthographicCamera.js +2 -2
- package/src/cameras/PerspectiveCamera.js +2 -2
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +13 -5
- package/src/core/BufferAttribute.js +3 -3
- package/src/core/BufferGeometry.js +10 -10
- package/src/core/Clock.js +2 -8
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/GLBufferAttribute.js +13 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +4 -3
- package/src/core/Raycaster.js +2 -1
- package/src/core/RenderTarget.js +10 -1
- package/{examples/jsm/misc → src/core}/Timer.js +4 -42
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +279 -55
- package/src/extras/TextureUtils.js +2 -1
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/Path.js +22 -22
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/lib/earcut.js +8 -8
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +8 -6
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +1 -0
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +42 -12
- package/src/helpers/SkeletonHelper.js +35 -6
- package/src/lights/LightShadow.js +21 -8
- package/src/lights/PointLightShadow.js +1 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +2 -1
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +2 -2
- package/src/loaders/DataTextureLoader.js +1 -1
- package/src/loaders/FileLoader.js +29 -5
- package/src/loaders/ImageBitmapLoader.js +32 -8
- package/src/loaders/ImageLoader.js +56 -9
- package/src/loaders/Loader.js +17 -3
- package/src/loaders/LoadingManager.js +45 -0
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +13 -13
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +3 -2
- package/src/materials/Material.js +16 -3
- package/src/materials/MeshBasicMaterial.js +2 -1
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +2 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +2 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +1 -0
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +2 -2
- package/src/materials/nodes/Line2NodeMaterial.js +2 -10
- package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
- package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
- package/src/materials/nodes/NodeMaterial.js +90 -27
- package/src/materials/nodes/PointsNodeMaterial.js +86 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +9 -3
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/Frustum.js +25 -9
- package/src/math/FrustumArray.js +10 -5
- package/src/math/Line3.js +129 -2
- package/src/math/MathUtils.js +13 -11
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +2 -2
- package/src/math/Matrix4.js +55 -34
- package/src/math/Plane.js +1 -1
- package/src/math/Quaternion.js +69 -67
- package/src/math/Spherical.js +3 -3
- package/src/nodes/Nodes.js +6 -4
- package/src/nodes/TSL.js +9 -4
- package/src/nodes/accessors/AccessorsUtils.js +7 -8
- package/src/nodes/accessors/Bitangent.js +31 -25
- package/src/nodes/accessors/BufferNode.js +1 -1
- package/src/nodes/accessors/Camera.js +142 -16
- package/src/nodes/accessors/ClippingNode.js +6 -5
- package/src/nodes/accessors/CubeTextureNode.js +5 -4
- package/src/nodes/accessors/InstanceNode.js +25 -5
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/Normal.js +97 -30
- package/src/nodes/accessors/Object3DNode.js +2 -2
- package/src/nodes/accessors/Position.js +25 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +20 -4
- package/src/nodes/accessors/ReflectVector.js +3 -3
- package/src/nodes/accessors/SceneNode.js +3 -2
- package/src/nodes/accessors/StorageBufferNode.js +2 -1
- package/src/nodes/accessors/StorageTextureNode.js +23 -1
- package/src/nodes/accessors/Tangent.js +25 -17
- package/src/nodes/accessors/TangentUtils.js +46 -0
- package/src/nodes/accessors/Texture3DNode.js +14 -1
- package/src/nodes/accessors/TextureBicubic.js +21 -3
- package/src/nodes/accessors/TextureNode.js +142 -44
- package/src/nodes/accessors/UniformArrayNode.js +0 -16
- package/src/nodes/code/FunctionCallNode.js +24 -4
- package/src/nodes/code/FunctionNode.js +23 -0
- package/src/nodes/core/ArrayNode.js +13 -0
- package/src/nodes/core/AssignNode.js +6 -2
- package/src/nodes/core/AttributeNode.js +2 -1
- package/src/nodes/core/ContextNode.js +48 -10
- package/src/nodes/core/IndexNode.js +2 -2
- package/src/nodes/core/InputNode.js +2 -1
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
- package/src/nodes/core/Node.js +167 -34
- package/src/nodes/core/NodeBuilder.js +404 -120
- package/src/nodes/core/NodeFrame.js +21 -21
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +17 -88
- package/src/nodes/core/ParameterNode.js +31 -0
- package/src/nodes/core/PropertyNode.js +7 -0
- package/src/nodes/core/StackNode.js +77 -30
- package/src/nodes/core/StructNode.js +5 -5
- package/src/nodes/core/StructTypeNode.js +1 -0
- package/src/nodes/core/SubBuildNode.js +89 -0
- package/src/nodes/core/UniformNode.js +80 -14
- package/src/nodes/core/VarNode.js +142 -16
- package/src/nodes/core/VaryingNode.js +9 -6
- package/src/nodes/display/BlendModes.js +7 -6
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/FrontFacingNode.js +35 -7
- package/src/nodes/display/NormalMapNode.js +20 -50
- package/src/nodes/display/PassNode.js +206 -17
- package/src/nodes/display/RenderOutputNode.js +28 -2
- package/src/nodes/display/ScreenNode.js +44 -40
- package/src/nodes/display/ToneMappingNode.js +31 -4
- package/src/nodes/display/ToonOutlinePassNode.js +8 -0
- package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +94 -4
- package/src/nodes/fog/Fog.js +3 -2
- package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
- package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhongLightingModel.js +3 -3
- package/src/nodes/functions/PhysicalLightingModel.js +19 -18
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/src/nodes/geometry/RangeNode.js +40 -4
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
- package/src/nodes/gpgpu/ComputeNode.js +81 -25
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
- package/src/nodes/lighting/EnvironmentNode.js +11 -11
- package/src/nodes/lighting/LightsNode.js +7 -8
- package/src/nodes/lighting/PointShadowNode.js +6 -0
- package/src/nodes/lighting/ProjectorLightNode.js +19 -6
- package/src/nodes/lighting/ShadowFilterNode.js +3 -1
- package/src/nodes/lighting/ShadowNode.js +77 -10
- package/src/nodes/materialx/MaterialXNodes.js +131 -2
- package/src/nodes/materialx/lib/mx_noise.js +165 -1
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/ConditionalNode.js +25 -27
- package/src/nodes/math/MathNode.js +106 -65
- package/src/nodes/math/OperatorNode.js +28 -43
- package/src/nodes/pmrem/PMREMUtils.js +117 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +6 -2
- package/src/nodes/tsl/TSLCore.js +546 -186
- package/src/nodes/utils/DebugNode.js +3 -2
- package/src/nodes/utils/EquirectUV.js +27 -0
- package/src/nodes/utils/EventNode.js +119 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +6 -3
- package/src/nodes/utils/LoopNode.js +20 -41
- package/src/nodes/utils/MatcapUV.js +22 -0
- package/src/nodes/utils/MemberNode.js +59 -7
- package/src/nodes/utils/PostProcessingUtils.js +28 -1
- package/src/nodes/utils/RTTNode.js +33 -6
- package/src/nodes/utils/ReflectorNode.js +68 -10
- package/src/nodes/utils/SampleNode.js +91 -0
- package/src/nodes/utils/SplitNode.js +11 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/nodes/utils/TriplanarTextures.js +65 -0
- package/src/objects/BatchedMesh.js +6 -4
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +2 -1
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Skeleton.js +3 -2
- package/src/objects/SkinnedMesh.js +3 -1
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +77 -66
- package/src/renderers/common/Animation.js +13 -1
- package/src/renderers/common/Attributes.js +1 -1
- package/src/renderers/common/Backend.js +108 -27
- package/src/renderers/common/Background.js +4 -3
- package/src/renderers/common/Bindings.js +76 -19
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +1 -1
- package/src/renderers/common/Color4.js +2 -2
- package/src/renderers/common/CubeRenderTarget.js +1 -1
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +26 -0
- package/src/renderers/common/Info.js +4 -2
- package/src/renderers/common/InspectorBase.js +146 -0
- package/src/renderers/common/Pipelines.js +1 -1
- package/src/renderers/common/PostProcessing.js +61 -25
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/RenderContext.js +2 -2
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderObject.js +84 -5
- package/src/renderers/common/RenderObjects.js +1 -1
- package/src/renderers/common/Renderer.js +486 -255
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +8 -68
- package/src/renderers/common/Sampler.js +117 -0
- package/src/renderers/common/Storage3DTexture.js +100 -0
- package/src/renderers/common/StorageArrayTexture.js +84 -0
- package/src/renderers/common/StorageTexture.js +27 -0
- package/src/renderers/common/Textures.js +138 -46
- package/src/renderers/common/TimestampQueryPool.js +65 -3
- package/src/renderers/common/UniformsGroup.js +2 -1
- package/src/renderers/common/XRManager.js +63 -24
- package/src/renderers/common/XRRenderTarget.js +21 -4
- package/src/renderers/common/extras/PMREMGenerator.js +161 -66
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/Nodes.js +38 -16
- package/src/renderers/shaders/DFGLUTData.js +64 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +25 -4
- package/src/renderers/webgl/WebGLAttributes.js +4 -0
- package/src/renderers/webgl/WebGLCapabilities.js +4 -3
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLProgram.js +25 -18
- package/src/renderers/webgl/WebGLPrograms.js +9 -6
- package/src/renderers/webgl/WebGLShadowMap.js +13 -2
- package/src/renderers/webgl/WebGLState.js +17 -16
- package/src/renderers/webgl/WebGLTextures.js +38 -21
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl/WebGLUtils.js +3 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
- package/src/renderers/webgpu/WebGPUBackend.js +205 -128
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +3 -2
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
- package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
- package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
- package/src/renderers/webxr/WebXRManager.js +89 -13
- package/src/textures/ExternalTexture.js +56 -0
- package/src/textures/FramebufferTexture.js +2 -2
- package/src/textures/Source.js +14 -3
- package/src/textures/Texture.js +3 -2
- package/src/textures/VideoTexture.js +29 -2
- package/src/utils.js +67 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
- package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
- package/src/nodes/utils/EquirectUVNode.js +0 -65
- package/src/nodes/utils/MatcapUVNode.js +0 -49
- package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
|
@@ -11,13 +11,10 @@ import WebGLCapabilities from './utils/WebGLCapabilities.js';
|
|
|
11
11
|
import { GLFeatureName } from './utils/WebGLConstants.js';
|
|
12
12
|
import { WebGLBufferRenderer } from './WebGLBufferRenderer.js';
|
|
13
13
|
|
|
14
|
-
import { warnOnce } from '../../utils.js';
|
|
15
|
-
import { WebGLCoordinateSystem } from '../../constants.js';
|
|
16
|
-
import { Vector2 } from '../../math/Vector2.js';
|
|
14
|
+
import { warnOnce, warn, error } from '../../utils.js';
|
|
15
|
+
import { WebGLCoordinateSystem, TimestampQuery } from '../../constants.js';
|
|
17
16
|
import WebGLTimestampQueryPool from './utils/WebGLTimestampQueryPool.js';
|
|
18
17
|
|
|
19
|
-
const _drawingBufferSize = /*@__PURE__*/ new Vector2();
|
|
20
|
-
|
|
21
18
|
/**
|
|
22
19
|
* A backend implementation targeting WebGL 2.
|
|
23
20
|
*
|
|
@@ -183,7 +180,7 @@ class WebGLBackend extends Backend {
|
|
|
183
180
|
* A unique collection of bindings.
|
|
184
181
|
*
|
|
185
182
|
* @private
|
|
186
|
-
* @type {WeakSet}
|
|
183
|
+
* @type {WeakSet<Array<BindGroup>>}
|
|
187
184
|
*/
|
|
188
185
|
this._knownBindings = new WeakSet();
|
|
189
186
|
|
|
@@ -201,7 +198,7 @@ class WebGLBackend extends Backend {
|
|
|
201
198
|
* the WebXR device API.
|
|
202
199
|
*
|
|
203
200
|
* @private
|
|
204
|
-
* @type {WebGLFramebuffer}
|
|
201
|
+
* @type {?WebGLFramebuffer}
|
|
205
202
|
* @default null
|
|
206
203
|
*/
|
|
207
204
|
this._xrFramebuffer = null;
|
|
@@ -222,7 +219,7 @@ class WebGLBackend extends Backend {
|
|
|
222
219
|
const parameters = this.parameters;
|
|
223
220
|
|
|
224
221
|
const contextAttributes = {
|
|
225
|
-
antialias: renderer.
|
|
222
|
+
antialias: renderer.currentSamples > 0,
|
|
226
223
|
alpha: true, // always true for performance reasons
|
|
227
224
|
depth: renderer.depth,
|
|
228
225
|
stencil: renderer.stencil
|
|
@@ -300,19 +297,6 @@ class WebGLBackend extends Backend {
|
|
|
300
297
|
|
|
301
298
|
}
|
|
302
299
|
|
|
303
|
-
/**
|
|
304
|
-
* Can be used to synchronize CPU operations with GPU tasks. So when this method is called,
|
|
305
|
-
* the CPU waits for the GPU to complete its operation (e.g. a compute task).
|
|
306
|
-
*
|
|
307
|
-
* @async
|
|
308
|
-
* @return {Promise} A Promise that resolves when synchronization has been finished.
|
|
309
|
-
*/
|
|
310
|
-
async waitForGPU() {
|
|
311
|
-
|
|
312
|
-
await this.utils._clientWaitAsync();
|
|
313
|
-
|
|
314
|
-
}
|
|
315
|
-
|
|
316
300
|
/**
|
|
317
301
|
* Ensures the backend is XR compatible.
|
|
318
302
|
*
|
|
@@ -364,13 +348,13 @@ class WebGLBackend extends Backend {
|
|
|
364
348
|
|
|
365
349
|
// The multisample_render_to_texture extension doesn't work properly if there
|
|
366
350
|
// are midframe flushes and an external depth texture.
|
|
367
|
-
if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget.
|
|
351
|
+
if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
|
|
368
352
|
|
|
369
|
-
|
|
353
|
+
warn( 'WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
|
|
370
354
|
|
|
371
355
|
}
|
|
372
356
|
|
|
373
|
-
renderTarget.
|
|
357
|
+
renderTarget._autoAllocateDepthBuffer = false;
|
|
374
358
|
|
|
375
359
|
}
|
|
376
360
|
|
|
@@ -379,14 +363,13 @@ class WebGLBackend extends Backend {
|
|
|
379
363
|
/**
|
|
380
364
|
* Inits a time stamp query for the given render context.
|
|
381
365
|
*
|
|
382
|
-
* @param {
|
|
366
|
+
* @param {string} type - The type of the timestamp query.
|
|
367
|
+
* @param {string} uid - A unique identifier for the timestamp query.
|
|
383
368
|
*/
|
|
384
|
-
initTimestampQuery(
|
|
369
|
+
initTimestampQuery( type, uid ) {
|
|
385
370
|
|
|
386
371
|
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
387
372
|
|
|
388
|
-
const type = renderContext.isComputeNode ? 'compute' : 'render';
|
|
389
|
-
|
|
390
373
|
if ( ! this.timestampQueryPool[ type ] ) {
|
|
391
374
|
|
|
392
375
|
// TODO: Variable maxQueries?
|
|
@@ -396,11 +379,11 @@ class WebGLBackend extends Backend {
|
|
|
396
379
|
|
|
397
380
|
const timestampQueryPool = this.timestampQueryPool[ type ];
|
|
398
381
|
|
|
399
|
-
const baseOffset = timestampQueryPool.allocateQueriesForContext(
|
|
382
|
+
const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
|
|
400
383
|
|
|
401
384
|
if ( baseOffset !== null ) {
|
|
402
385
|
|
|
403
|
-
timestampQueryPool.beginQuery(
|
|
386
|
+
timestampQueryPool.beginQuery( uid );
|
|
404
387
|
|
|
405
388
|
}
|
|
406
389
|
|
|
@@ -411,16 +394,16 @@ class WebGLBackend extends Backend {
|
|
|
411
394
|
/**
|
|
412
395
|
* Prepares the timestamp buffer.
|
|
413
396
|
*
|
|
414
|
-
* @param {
|
|
397
|
+
* @param {string} type - The type of the timestamp query.
|
|
398
|
+
* @param {string} uid - A unique identifier for the timestamp query.
|
|
415
399
|
*/
|
|
416
|
-
prepareTimestampBuffer(
|
|
400
|
+
prepareTimestampBuffer( type, uid ) {
|
|
417
401
|
|
|
418
402
|
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
419
403
|
|
|
420
|
-
const type = renderContext.isComputeNode ? 'compute' : 'render';
|
|
421
404
|
const timestampQueryPool = this.timestampQueryPool[ type ];
|
|
422
405
|
|
|
423
|
-
timestampQueryPool.endQuery(
|
|
406
|
+
timestampQueryPool.endQuery( uid );
|
|
424
407
|
|
|
425
408
|
}
|
|
426
409
|
|
|
@@ -455,7 +438,7 @@ class WebGLBackend extends Backend {
|
|
|
455
438
|
|
|
456
439
|
} else {
|
|
457
440
|
|
|
458
|
-
const { width, height } = this.getDrawingBufferSize(
|
|
441
|
+
const { width, height } = this.getDrawingBufferSize();
|
|
459
442
|
state.viewport( 0, 0, width, height );
|
|
460
443
|
|
|
461
444
|
}
|
|
@@ -470,7 +453,7 @@ class WebGLBackend extends Backend {
|
|
|
470
453
|
|
|
471
454
|
//
|
|
472
455
|
|
|
473
|
-
this.initTimestampQuery( renderContext );
|
|
456
|
+
this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
|
|
474
457
|
|
|
475
458
|
renderContextData.previousContext = this._currentContext;
|
|
476
459
|
this._currentContext = renderContext;
|
|
@@ -544,66 +527,7 @@ class WebGLBackend extends Backend {
|
|
|
544
527
|
|
|
545
528
|
this._currentContext = previousContext;
|
|
546
529
|
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
const renderTargetContextData = this.get( renderContext.renderTarget );
|
|
550
|
-
|
|
551
|
-
const { resolveDepthBuffer, samples } = renderContext.renderTarget;
|
|
552
|
-
|
|
553
|
-
if ( samples > 0 && this._useMultisampledExtension( renderContext.renderTarget ) === false ) {
|
|
554
|
-
|
|
555
|
-
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
556
|
-
|
|
557
|
-
const mask = gl.COLOR_BUFFER_BIT;
|
|
558
|
-
|
|
559
|
-
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
560
|
-
|
|
561
|
-
const textures = renderContext.textures;
|
|
562
|
-
|
|
563
|
-
state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
|
|
564
|
-
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
565
|
-
|
|
566
|
-
for ( let i = 0; i < textures.length; i ++ ) {
|
|
567
|
-
|
|
568
|
-
// TODO Add support for MRT
|
|
569
|
-
|
|
570
|
-
if ( renderContext.scissor ) {
|
|
571
|
-
|
|
572
|
-
const { x, y, width, height } = renderContext.scissorValue;
|
|
573
|
-
|
|
574
|
-
const viewY = renderContext.height - height - y;
|
|
575
|
-
|
|
576
|
-
gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
|
|
577
|
-
|
|
578
|
-
if ( this._supportsInvalidateFramebuffer === true ) {
|
|
579
|
-
|
|
580
|
-
gl.invalidateSubFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray, x, viewY, width, height );
|
|
581
|
-
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
} else {
|
|
585
|
-
|
|
586
|
-
gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
|
|
587
|
-
|
|
588
|
-
if ( this._supportsInvalidateFramebuffer === true ) {
|
|
589
|
-
|
|
590
|
-
gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
|
|
591
|
-
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
} else if ( resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
|
|
599
|
-
|
|
600
|
-
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
601
|
-
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
602
|
-
gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
|
|
603
|
-
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
}
|
|
530
|
+
this._resolveRenderTarget( renderContext );
|
|
607
531
|
|
|
608
532
|
if ( previousContext !== null ) {
|
|
609
533
|
|
|
@@ -615,14 +539,14 @@ class WebGLBackend extends Backend {
|
|
|
615
539
|
|
|
616
540
|
} else {
|
|
617
541
|
|
|
618
|
-
const { width, height } = this.getDrawingBufferSize(
|
|
542
|
+
const { width, height } = this.getDrawingBufferSize();
|
|
619
543
|
state.viewport( 0, 0, width, height );
|
|
620
544
|
|
|
621
545
|
}
|
|
622
546
|
|
|
623
547
|
}
|
|
624
548
|
|
|
625
|
-
this.prepareTimestampBuffer( renderContext );
|
|
549
|
+
this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
|
|
626
550
|
|
|
627
551
|
}
|
|
628
552
|
|
|
@@ -762,9 +686,11 @@ class WebGLBackend extends Backend {
|
|
|
762
686
|
* @param {boolean} depth - Whether the depth buffer should be cleared or not.
|
|
763
687
|
* @param {boolean} stencil - Whether the stencil buffer should be cleared or not.
|
|
764
688
|
* @param {?Object} [descriptor=null] - The render context of the current set render target.
|
|
765
|
-
* @param {boolean} [setFrameBuffer=true] -
|
|
689
|
+
* @param {boolean} [setFrameBuffer=true] - Controls whether the intermediate framebuffer should be set or not.
|
|
690
|
+
* @param {boolean} [resolveRenderTarget=true] - Controls whether an active render target should be resolved
|
|
691
|
+
* or not. Only relevant for explicit clears.
|
|
766
692
|
*/
|
|
767
|
-
clear( color, depth, stencil, descriptor = null, setFrameBuffer = true ) {
|
|
693
|
+
clear( color, depth, stencil, descriptor = null, setFrameBuffer = true, resolveRenderTarget = true ) {
|
|
768
694
|
|
|
769
695
|
const { gl, renderer } = this;
|
|
770
696
|
|
|
@@ -847,6 +773,8 @@ class WebGLBackend extends Backend {
|
|
|
847
773
|
|
|
848
774
|
}
|
|
849
775
|
|
|
776
|
+
if ( setFrameBuffer && resolveRenderTarget ) this._resolveRenderTarget( descriptor );
|
|
777
|
+
|
|
850
778
|
}
|
|
851
779
|
|
|
852
780
|
}
|
|
@@ -863,8 +791,10 @@ class WebGLBackend extends Backend {
|
|
|
863
791
|
|
|
864
792
|
const { state, gl } = this;
|
|
865
793
|
|
|
794
|
+
//
|
|
795
|
+
|
|
866
796
|
state.bindFramebuffer( gl.FRAMEBUFFER, null );
|
|
867
|
-
this.initTimestampQuery( computeGroup );
|
|
797
|
+
this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
|
|
868
798
|
|
|
869
799
|
}
|
|
870
800
|
|
|
@@ -875,8 +805,9 @@ class WebGLBackend extends Backend {
|
|
|
875
805
|
* @param {Node} computeNode - The compute node.
|
|
876
806
|
* @param {Array<BindGroup>} bindings - The bindings.
|
|
877
807
|
* @param {ComputePipeline} pipeline - The compute pipeline.
|
|
808
|
+
* @param {?number} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
|
|
878
809
|
*/
|
|
879
|
-
compute( computeGroup, computeNode, bindings, pipeline ) {
|
|
810
|
+
compute( computeGroup, computeNode, bindings, pipeline, count = null ) {
|
|
880
811
|
|
|
881
812
|
const { state, gl } = this;
|
|
882
813
|
|
|
@@ -896,7 +827,7 @@ class WebGLBackend extends Backend {
|
|
|
896
827
|
|
|
897
828
|
if ( vaoGPU === undefined ) {
|
|
898
829
|
|
|
899
|
-
this._createVao( attributes );
|
|
830
|
+
this.vaoCache[ vaoKey ] = this._createVao( attributes );
|
|
900
831
|
|
|
901
832
|
} else {
|
|
902
833
|
|
|
@@ -913,13 +844,29 @@ class WebGLBackend extends Backend {
|
|
|
913
844
|
gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
|
|
914
845
|
gl.beginTransformFeedback( gl.POINTS );
|
|
915
846
|
|
|
847
|
+
count = ( count !== null ) ? count : computeNode.count;
|
|
848
|
+
|
|
849
|
+
if ( Array.isArray( count ) ) {
|
|
850
|
+
|
|
851
|
+
warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not an array.' );
|
|
852
|
+
|
|
853
|
+
count = count[ 0 ];
|
|
854
|
+
|
|
855
|
+
} else if ( count && typeof count === 'object' && count.isIndirectStorageBufferAttribute ) {
|
|
856
|
+
|
|
857
|
+
warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not IndirectStorageBufferAttribute' );
|
|
858
|
+
|
|
859
|
+
count = computeNode.count;
|
|
860
|
+
|
|
861
|
+
}
|
|
862
|
+
|
|
916
863
|
if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
|
|
917
864
|
|
|
918
|
-
gl.drawArraysInstanced( gl.POINTS, 0, 1,
|
|
865
|
+
gl.drawArraysInstanced( gl.POINTS, 0, 1, count );
|
|
919
866
|
|
|
920
867
|
} else {
|
|
921
868
|
|
|
922
|
-
gl.drawArrays( gl.POINTS, 0,
|
|
869
|
+
gl.drawArrays( gl.POINTS, 0, count );
|
|
923
870
|
|
|
924
871
|
}
|
|
925
872
|
|
|
@@ -932,7 +879,7 @@ class WebGLBackend extends Backend {
|
|
|
932
879
|
|
|
933
880
|
const dualAttributeData = transformBuffers[ i ];
|
|
934
881
|
|
|
935
|
-
if ( dualAttributeData.pbo ) {
|
|
882
|
+
if ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {
|
|
936
883
|
|
|
937
884
|
this.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );
|
|
938
885
|
|
|
@@ -959,7 +906,7 @@ class WebGLBackend extends Backend {
|
|
|
959
906
|
|
|
960
907
|
gl.disable( gl.RASTERIZER_DISCARD );
|
|
961
908
|
|
|
962
|
-
this.prepareTimestampBuffer( computeGroup );
|
|
909
|
+
this.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
|
|
963
910
|
|
|
964
911
|
if ( this._currentContext ) {
|
|
965
912
|
|
|
@@ -1014,28 +961,23 @@ class WebGLBackend extends Backend {
|
|
|
1014
961
|
|
|
1015
962
|
// vertex state
|
|
1016
963
|
|
|
1017
|
-
const
|
|
964
|
+
const attributes = renderObject.getAttributes();
|
|
965
|
+
const attributesData = this.get( attributes );
|
|
1018
966
|
|
|
1019
|
-
let vaoGPU =
|
|
967
|
+
let vaoGPU = attributesData.vaoGPU;
|
|
1020
968
|
|
|
1021
|
-
if ( vaoGPU === undefined
|
|
969
|
+
if ( vaoGPU === undefined ) {
|
|
1022
970
|
|
|
1023
|
-
const vaoKey = this._getVaoKey(
|
|
971
|
+
const vaoKey = this._getVaoKey( attributes );
|
|
1024
972
|
|
|
1025
973
|
vaoGPU = this.vaoCache[ vaoKey ];
|
|
1026
974
|
|
|
1027
975
|
if ( vaoGPU === undefined ) {
|
|
1028
976
|
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
( { vaoGPU, staticVao } = this._createVao( renderObject.getAttributes() ) );
|
|
1032
|
-
|
|
1033
|
-
if ( staticVao ) {
|
|
977
|
+
vaoGPU = this._createVao( attributes );
|
|
1034
978
|
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
}
|
|
979
|
+
this.vaoCache[ vaoKey ] = vaoGPU;
|
|
980
|
+
attributesData.vaoGPU = vaoGPU;
|
|
1039
981
|
|
|
1040
982
|
}
|
|
1041
983
|
|
|
@@ -1126,12 +1068,12 @@ class WebGLBackend extends Backend {
|
|
|
1126
1068
|
if ( object._multiDrawInstances !== null ) {
|
|
1127
1069
|
|
|
1128
1070
|
// @deprecated, r174
|
|
1129
|
-
warnOnce( '
|
|
1071
|
+
warnOnce( 'WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
|
|
1130
1072
|
renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
|
|
1131
1073
|
|
|
1132
1074
|
} else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) {
|
|
1133
1075
|
|
|
1134
|
-
warnOnce( '
|
|
1076
|
+
warnOnce( 'WebGLBackend: WEBGL_multi_draw not supported.' );
|
|
1135
1077
|
|
|
1136
1078
|
} else {
|
|
1137
1079
|
|
|
@@ -1203,7 +1145,7 @@ class WebGLBackend extends Backend {
|
|
|
1203
1145
|
this._currentContext.activeCubeFace = i;
|
|
1204
1146
|
|
|
1205
1147
|
this._setFramebuffer( this._currentContext );
|
|
1206
|
-
this.clear( false, true, stencilBuffer, this._currentContext, false );
|
|
1148
|
+
this.clear( false, true, stencilBuffer, this._currentContext, false, false );
|
|
1207
1149
|
|
|
1208
1150
|
}
|
|
1209
1151
|
|
|
@@ -1344,10 +1286,11 @@ class WebGLBackend extends Backend {
|
|
|
1344
1286
|
* Destroys the GPU data for the given texture object.
|
|
1345
1287
|
*
|
|
1346
1288
|
* @param {Texture} texture - The texture.
|
|
1289
|
+
* @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
|
|
1347
1290
|
*/
|
|
1348
|
-
destroyTexture( texture ) {
|
|
1291
|
+
destroyTexture( texture, isDefaultTexture = false ) {
|
|
1349
1292
|
|
|
1350
|
-
this.textureUtils.destroyTexture( texture );
|
|
1293
|
+
this.textureUtils.destroyTexture( texture, isDefaultTexture );
|
|
1351
1294
|
|
|
1352
1295
|
}
|
|
1353
1296
|
|
|
@@ -1372,21 +1315,15 @@ class WebGLBackend extends Backend {
|
|
|
1372
1315
|
/**
|
|
1373
1316
|
* This method does nothing since WebGL 2 has no concept of samplers.
|
|
1374
1317
|
*
|
|
1375
|
-
* @param {Texture} texture - The texture to
|
|
1318
|
+
* @param {Texture} texture - The texture to update the sampler for.
|
|
1319
|
+
* @return {string} The current sampler key.
|
|
1376
1320
|
*/
|
|
1377
|
-
|
|
1321
|
+
updateSampler( /*texture*/ ) {
|
|
1378
1322
|
|
|
1379
|
-
|
|
1323
|
+
return '';
|
|
1380
1324
|
|
|
1381
1325
|
}
|
|
1382
1326
|
|
|
1383
|
-
/**
|
|
1384
|
-
* This method does nothing since WebGL 2 has no concept of samplers.
|
|
1385
|
-
*
|
|
1386
|
-
* @param {Texture} texture - The texture to destroy the sampler for.
|
|
1387
|
-
*/
|
|
1388
|
-
destroySampler( /*texture*/ ) {}
|
|
1389
|
-
|
|
1390
1327
|
// node builder
|
|
1391
1328
|
|
|
1392
1329
|
/**
|
|
@@ -1539,7 +1476,9 @@ class WebGLBackend extends Backend {
|
|
|
1539
1476
|
_getShaderErrors( gl, shader, type ) {
|
|
1540
1477
|
|
|
1541
1478
|
const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
|
|
1542
|
-
|
|
1479
|
+
|
|
1480
|
+
const shaderInfoLog = gl.getShaderInfoLog( shader ) || '';
|
|
1481
|
+
const errors = shaderInfoLog.trim();
|
|
1543
1482
|
|
|
1544
1483
|
if ( status && errors === '' ) return '';
|
|
1545
1484
|
|
|
@@ -1571,11 +1510,11 @@ class WebGLBackend extends Backend {
|
|
|
1571
1510
|
|
|
1572
1511
|
const gl = this.gl;
|
|
1573
1512
|
|
|
1574
|
-
const
|
|
1513
|
+
const programInfoLog = gl.getProgramInfoLog( programGPU ) || '';
|
|
1514
|
+
const programLog = programInfoLog.trim();
|
|
1575
1515
|
|
|
1576
1516
|
if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
|
|
1577
1517
|
|
|
1578
|
-
|
|
1579
1518
|
if ( typeof this.renderer.debug.onShaderError === 'function' ) {
|
|
1580
1519
|
|
|
1581
1520
|
this.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );
|
|
@@ -1587,7 +1526,7 @@ class WebGLBackend extends Backend {
|
|
|
1587
1526
|
const vertexErrors = this._getShaderErrors( gl, glVertexShader, 'vertex' );
|
|
1588
1527
|
const fragmentErrors = this._getShaderErrors( gl, glFragmentShader, 'fragment' );
|
|
1589
1528
|
|
|
1590
|
-
|
|
1529
|
+
error(
|
|
1591
1530
|
'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
|
|
1592
1531
|
'VALIDATE_STATUS ' + gl.getProgramParameter( programGPU, gl.VALIDATE_STATUS ) + '\n\n' +
|
|
1593
1532
|
'Program Info Log: ' + programLog + '\n' +
|
|
@@ -1599,7 +1538,7 @@ class WebGLBackend extends Backend {
|
|
|
1599
1538
|
|
|
1600
1539
|
} else if ( programLog !== '' ) {
|
|
1601
1540
|
|
|
1602
|
-
|
|
1541
|
+
warn( 'WebGLProgram: Program Info Log:', programLog );
|
|
1603
1542
|
|
|
1604
1543
|
}
|
|
1605
1544
|
|
|
@@ -1800,28 +1739,46 @@ class WebGLBackend extends Backend {
|
|
|
1800
1739
|
|
|
1801
1740
|
for ( const binding of bindGroup.bindings ) {
|
|
1802
1741
|
|
|
1742
|
+
const map = this.get( binding );
|
|
1743
|
+
|
|
1803
1744
|
if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
|
|
1804
1745
|
|
|
1805
1746
|
const data = binding.buffer;
|
|
1806
|
-
|
|
1747
|
+
let { bufferGPU } = this.get( data );
|
|
1807
1748
|
|
|
1808
|
-
|
|
1809
|
-
gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
|
|
1749
|
+
if ( bufferGPU === undefined ) {
|
|
1810
1750
|
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
bufferGPU
|
|
1814
|
-
|
|
1751
|
+
// create
|
|
1752
|
+
|
|
1753
|
+
bufferGPU = gl.createBuffer();
|
|
1754
|
+
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1755
|
+
gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
|
|
1756
|
+
|
|
1757
|
+
this.set( data, { bufferGPU } );
|
|
1758
|
+
|
|
1759
|
+
} else {
|
|
1760
|
+
|
|
1761
|
+
// update
|
|
1762
|
+
|
|
1763
|
+
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1764
|
+
gl.bufferSubData( gl.UNIFORM_BUFFER, 0, data );
|
|
1765
|
+
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1768
|
+
map.index = i ++;
|
|
1769
|
+
map.bufferGPU = bufferGPU;
|
|
1770
|
+
|
|
1771
|
+
this.set( binding, map );
|
|
1815
1772
|
|
|
1816
1773
|
} else if ( binding.isSampledTexture ) {
|
|
1817
1774
|
|
|
1818
1775
|
const { textureGPU, glTextureType } = this.get( binding.texture );
|
|
1819
1776
|
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1777
|
+
map.index = t ++;
|
|
1778
|
+
map.textureGPU = textureGPU;
|
|
1779
|
+
map.glTextureType = glTextureType;
|
|
1780
|
+
|
|
1781
|
+
this.set( binding, map );
|
|
1825
1782
|
|
|
1826
1783
|
}
|
|
1827
1784
|
|
|
@@ -2002,7 +1959,7 @@ class WebGLBackend extends Backend {
|
|
|
2002
1959
|
const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
|
|
2003
1960
|
const isRenderTargetArray = renderTarget.depth > 1;
|
|
2004
1961
|
const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
|
|
2005
|
-
const
|
|
1962
|
+
const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
|
|
2006
1963
|
|
|
2007
1964
|
let msaaFb = renderTargetContextData.msaaFrameBuffer;
|
|
2008
1965
|
let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
|
|
@@ -2019,7 +1976,7 @@ class WebGLBackend extends Backend {
|
|
|
2019
1976
|
|
|
2020
1977
|
fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
|
|
2021
1978
|
|
|
2022
|
-
} else if ( isXRRenderTarget &&
|
|
1979
|
+
} else if ( isXRRenderTarget && _hasExternalTextures === false ) {
|
|
2023
1980
|
|
|
2024
1981
|
fb = this._xrFramebuffer;
|
|
2025
1982
|
|
|
@@ -2047,8 +2004,9 @@ class WebGLBackend extends Backend {
|
|
|
2047
2004
|
const { textureGPU } = this.get( textures[ 0 ] );
|
|
2048
2005
|
|
|
2049
2006
|
const cubeFace = this.renderer._activeCubeFace;
|
|
2007
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
2050
2008
|
|
|
2051
|
-
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU,
|
|
2009
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
|
|
2052
2010
|
|
|
2053
2011
|
} else {
|
|
2054
2012
|
|
|
@@ -2070,8 +2028,9 @@ class WebGLBackend extends Backend {
|
|
|
2070
2028
|
} else if ( isRenderTarget3D || isRenderTargetArray ) {
|
|
2071
2029
|
|
|
2072
2030
|
const layer = this.renderer._activeCubeFace;
|
|
2031
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
2073
2032
|
|
|
2074
|
-
gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU,
|
|
2033
|
+
gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
|
|
2075
2034
|
|
|
2076
2035
|
} else {
|
|
2077
2036
|
|
|
@@ -2081,7 +2040,9 @@ class WebGLBackend extends Backend {
|
|
|
2081
2040
|
|
|
2082
2041
|
} else {
|
|
2083
2042
|
|
|
2084
|
-
|
|
2043
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
2044
|
+
|
|
2045
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
|
|
2085
2046
|
|
|
2086
2047
|
}
|
|
2087
2048
|
|
|
@@ -2089,13 +2050,11 @@ class WebGLBackend extends Backend {
|
|
|
2089
2050
|
|
|
2090
2051
|
}
|
|
2091
2052
|
|
|
2092
|
-
state.drawBuffers( descriptor, fb );
|
|
2093
|
-
|
|
2094
2053
|
}
|
|
2095
2054
|
|
|
2096
2055
|
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
2097
2056
|
|
|
2098
|
-
if ( renderTarget.
|
|
2057
|
+
if ( renderTarget._autoAllocateDepthBuffer === true ) {
|
|
2099
2058
|
|
|
2100
2059
|
const renderbuffer = gl.createRenderbuffer();
|
|
2101
2060
|
this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
|
|
@@ -2120,7 +2079,7 @@ class WebGLBackend extends Backend {
|
|
|
2120
2079
|
|
|
2121
2080
|
multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
|
|
2122
2081
|
|
|
2123
|
-
} else if (
|
|
2082
|
+
} else if ( _hasExternalTextures && useMultisampledRTT ) {
|
|
2124
2083
|
|
|
2125
2084
|
multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
|
|
2126
2085
|
|
|
@@ -2171,7 +2130,7 @@ class WebGLBackend extends Backend {
|
|
|
2171
2130
|
|
|
2172
2131
|
// rebind external XR textures
|
|
2173
2132
|
|
|
2174
|
-
if ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) {
|
|
2133
|
+
if ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {
|
|
2175
2134
|
|
|
2176
2135
|
state.bindFramebuffer( gl.FRAMEBUFFER, fb );
|
|
2177
2136
|
|
|
@@ -2197,7 +2156,7 @@ class WebGLBackend extends Backend {
|
|
|
2197
2156
|
|
|
2198
2157
|
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
2199
2158
|
|
|
2200
|
-
if ( renderTarget.
|
|
2159
|
+
if ( renderTarget._autoAllocateDepthBuffer === true ) {
|
|
2201
2160
|
|
|
2202
2161
|
const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
|
|
2203
2162
|
gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
|
|
@@ -2249,13 +2208,6 @@ class WebGLBackend extends Backend {
|
|
|
2249
2208
|
|
|
2250
2209
|
invalidationArray.push( gl.COLOR_ATTACHMENT0 + i );
|
|
2251
2210
|
|
|
2252
|
-
if ( depthBuffer ) {
|
|
2253
|
-
|
|
2254
|
-
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
2255
|
-
invalidationArray.push( depthStyle );
|
|
2256
|
-
|
|
2257
|
-
}
|
|
2258
|
-
|
|
2259
2211
|
const texture = descriptor.textures[ i ];
|
|
2260
2212
|
const textureData = this.get( texture );
|
|
2261
2213
|
|
|
@@ -2265,10 +2217,12 @@ class WebGLBackend extends Backend {
|
|
|
2265
2217
|
|
|
2266
2218
|
}
|
|
2267
2219
|
|
|
2220
|
+
gl.bindRenderbuffer( gl.RENDERBUFFER, null );
|
|
2221
|
+
|
|
2268
2222
|
renderTargetContextData.msaaFrameBuffer = msaaFb;
|
|
2269
2223
|
renderTargetContextData.msaaRenderbuffers = msaaRenderbuffers;
|
|
2270
2224
|
|
|
2271
|
-
if ( depthRenderbuffer === undefined ) {
|
|
2225
|
+
if ( depthBuffer && depthRenderbuffer === undefined ) {
|
|
2272
2226
|
|
|
2273
2227
|
depthRenderbuffer = gl.createRenderbuffer();
|
|
2274
2228
|
this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor, samples );
|
|
@@ -2292,6 +2246,8 @@ class WebGLBackend extends Backend {
|
|
|
2292
2246
|
|
|
2293
2247
|
}
|
|
2294
2248
|
|
|
2249
|
+
state.drawBuffers( descriptor, fb );
|
|
2250
|
+
|
|
2295
2251
|
}
|
|
2296
2252
|
|
|
2297
2253
|
state.bindFramebuffer( gl.FRAMEBUFFER, currentFrameBuffer );
|
|
@@ -2333,9 +2289,6 @@ class WebGLBackend extends Backend {
|
|
|
2333
2289
|
const { gl } = this;
|
|
2334
2290
|
|
|
2335
2291
|
const vaoGPU = gl.createVertexArray();
|
|
2336
|
-
let key = '';
|
|
2337
|
-
|
|
2338
|
-
let staticVao = true;
|
|
2339
2292
|
|
|
2340
2293
|
gl.bindVertexArray( vaoGPU );
|
|
2341
2294
|
|
|
@@ -2344,13 +2297,9 @@ class WebGLBackend extends Backend {
|
|
|
2344
2297
|
const attribute = attributes[ i ];
|
|
2345
2298
|
const attributeData = this.get( attribute );
|
|
2346
2299
|
|
|
2347
|
-
key += ':' + attributeData.id;
|
|
2348
|
-
|
|
2349
2300
|
gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
|
|
2350
2301
|
gl.enableVertexAttribArray( i );
|
|
2351
2302
|
|
|
2352
|
-
if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) staticVao = false;
|
|
2353
|
-
|
|
2354
2303
|
let stride, offset;
|
|
2355
2304
|
|
|
2356
2305
|
if ( attribute.isInterleavedBufferAttribute === true ) {
|
|
@@ -2389,9 +2338,7 @@ class WebGLBackend extends Backend {
|
|
|
2389
2338
|
|
|
2390
2339
|
gl.bindBuffer( gl.ARRAY_BUFFER, null );
|
|
2391
2340
|
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
return { vaoGPU, staticVao };
|
|
2341
|
+
return vaoGPU;
|
|
2395
2342
|
|
|
2396
2343
|
}
|
|
2397
2344
|
|
|
@@ -2512,6 +2459,120 @@ class WebGLBackend extends Backend {
|
|
|
2512
2459
|
|
|
2513
2460
|
}
|
|
2514
2461
|
|
|
2462
|
+
/**
|
|
2463
|
+
* The method ensures multisampled render targets are resolved.
|
|
2464
|
+
*
|
|
2465
|
+
* @private
|
|
2466
|
+
* @param {RenderContext} renderContext - The render context.
|
|
2467
|
+
*/
|
|
2468
|
+
_resolveRenderTarget( renderContext ) {
|
|
2469
|
+
|
|
2470
|
+
const { gl, state } = this;
|
|
2471
|
+
|
|
2472
|
+
const renderTarget = renderContext.renderTarget;
|
|
2473
|
+
|
|
2474
|
+
if ( renderContext.textures !== null && renderTarget ) {
|
|
2475
|
+
|
|
2476
|
+
const renderTargetContextData = this.get( renderTarget );
|
|
2477
|
+
|
|
2478
|
+
if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
|
|
2479
|
+
|
|
2480
|
+
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
2481
|
+
|
|
2482
|
+
let mask = gl.COLOR_BUFFER_BIT;
|
|
2483
|
+
|
|
2484
|
+
if ( renderTarget.resolveDepthBuffer ) {
|
|
2485
|
+
|
|
2486
|
+
if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
|
|
2487
|
+
if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
|
|
2488
|
+
|
|
2489
|
+
}
|
|
2490
|
+
|
|
2491
|
+
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
2492
|
+
const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
|
|
2493
|
+
|
|
2494
|
+
const textures = renderContext.textures;
|
|
2495
|
+
const isMRT = textures.length > 1;
|
|
2496
|
+
|
|
2497
|
+
state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
|
|
2498
|
+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
2499
|
+
|
|
2500
|
+
if ( isMRT ) {
|
|
2501
|
+
|
|
2502
|
+
// blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
|
|
2503
|
+
// the engine temporarily removes all attachments and then configures each attachment for the resolve.
|
|
2504
|
+
|
|
2505
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2506
|
+
|
|
2507
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
|
|
2508
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
|
|
2509
|
+
|
|
2510
|
+
}
|
|
2511
|
+
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2515
|
+
|
|
2516
|
+
if ( isMRT ) {
|
|
2517
|
+
|
|
2518
|
+
// configure attachment for resolve
|
|
2519
|
+
|
|
2520
|
+
const { textureGPU } = this.get( textures[ i ] );
|
|
2521
|
+
|
|
2522
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
2523
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
|
|
2524
|
+
|
|
2525
|
+
}
|
|
2526
|
+
|
|
2527
|
+
if ( renderContext.scissor ) {
|
|
2528
|
+
|
|
2529
|
+
const { x, y, width, height } = renderContext.scissorValue;
|
|
2530
|
+
|
|
2531
|
+
const viewY = renderContext.height - height - y;
|
|
2532
|
+
|
|
2533
|
+
gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
|
|
2534
|
+
|
|
2535
|
+
} else {
|
|
2536
|
+
|
|
2537
|
+
gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
|
|
2538
|
+
|
|
2539
|
+
}
|
|
2540
|
+
|
|
2541
|
+
}
|
|
2542
|
+
|
|
2543
|
+
if ( isMRT ) {
|
|
2544
|
+
|
|
2545
|
+
// restore attachments
|
|
2546
|
+
|
|
2547
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2548
|
+
|
|
2549
|
+
const { textureGPU } = this.get( textures[ i ] );
|
|
2550
|
+
|
|
2551
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
2552
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
|
|
2553
|
+
|
|
2554
|
+
}
|
|
2555
|
+
|
|
2556
|
+
}
|
|
2557
|
+
|
|
2558
|
+
if ( this._supportsInvalidateFramebuffer === true ) {
|
|
2559
|
+
|
|
2560
|
+
gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
|
|
2561
|
+
|
|
2562
|
+
}
|
|
2563
|
+
|
|
2564
|
+
} else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
|
|
2565
|
+
|
|
2566
|
+
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
2567
|
+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
2568
|
+
gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
|
|
2569
|
+
|
|
2570
|
+
}
|
|
2571
|
+
|
|
2572
|
+
}
|
|
2573
|
+
|
|
2574
|
+
}
|
|
2575
|
+
|
|
2515
2576
|
/**
|
|
2516
2577
|
* Returns `true` if the `WEBGL_multisampled_render_to_texture` extension
|
|
2517
2578
|
* should be used when MSAA is enabled.
|
|
@@ -2528,7 +2589,7 @@ class WebGLBackend extends Backend {
|
|
|
2528
2589
|
|
|
2529
2590
|
}
|
|
2530
2591
|
|
|
2531
|
-
return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget.
|
|
2592
|
+
return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;
|
|
2532
2593
|
|
|
2533
2594
|
}
|
|
2534
2595
|
|
|
@@ -2537,6 +2598,8 @@ class WebGLBackend extends Backend {
|
|
|
2537
2598
|
*/
|
|
2538
2599
|
dispose() {
|
|
2539
2600
|
|
|
2601
|
+
if ( this.textureUtils !== null ) this.textureUtils.dispose();
|
|
2602
|
+
|
|
2540
2603
|
const extension = this.extensions.get( 'WEBGL_lose_context' );
|
|
2541
2604
|
if ( extension ) extension.loseContext();
|
|
2542
2605
|
|