@unikia/upe-renderer 0.186.110 → 0.187.11
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 +5 -7
- package/UPSTREAM.md +4 -4
- package/build/three.core.js +853 -277
- package/build/three.module.js +1098 -1280
- package/build/three.tsl.js +41938 -686
- package/build/three.webgpu.js +10604 -49055
- package/build/three.webgpu.nodes.js +9249 -5788
- package/examples/jsm/Addons.js +2 -0
- package/examples/jsm/animation/CCDIKSolver.js +17 -5
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +27 -14
- package/examples/jsm/csm/CSMShader.js +74 -3
- package/examples/jsm/curves/CurveExtras.js +4 -4
- package/examples/jsm/curves/NURBSCurve.js +14 -0
- package/examples/jsm/exporters/EXRExporter.js +673 -16
- package/examples/jsm/exporters/GLTFExporter.js +4 -4
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/OBJExporter.js +48 -5
- package/examples/jsm/exporters/PLYExporter.js +22 -11
- package/examples/jsm/generators/CityGenerator.js +3 -2
- package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
- package/examples/jsm/gpgpu/BitonicSort.js +30 -23
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
- package/examples/jsm/inspector/Extension.js +1 -1
- package/examples/jsm/inspector/Inspector.js +6 -46
- package/examples/jsm/inspector/RendererInspector.js +43 -8
- package/examples/jsm/inspector/Storage.js +49 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
- package/examples/jsm/inspector/tabs/Parameters.js +5 -1
- package/examples/jsm/inspector/tabs/Performance.js +22 -7
- package/examples/jsm/inspector/tabs/Settings.js +1 -1
- package/examples/jsm/inspector/tabs/Timeline.js +83 -7
- package/examples/jsm/inspector/tabs/Viewer.js +25 -10
- package/examples/jsm/inspector/ui/Profiler.js +1 -1
- package/examples/jsm/inspector/ui/Style.js +21 -53
- package/examples/jsm/inspector/ui/Values.js +28 -3
- package/examples/jsm/libs/fflate.module.js +83 -56
- package/examples/jsm/libs/mikktspace.README.md +27 -0
- package/examples/jsm/libs/mikktspace.module.js +721 -109
- package/examples/jsm/lighting/ClusteredLighting.js +100 -2
- package/examples/jsm/lighting/LightMapper.js +295 -0
- package/examples/jsm/lighting/LightProbeGrid.js +242 -139
- package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
- package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
- package/examples/jsm/lights/SunLight.js +9 -4
- package/examples/jsm/lights/SunLightNode.js +3 -3
- package/examples/jsm/lines/LineMaterial.js +26 -10
- package/examples/jsm/loaders/3DMLoader.js +10 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +2 -0
- package/examples/jsm/loaders/BVHLoader.js +2 -0
- package/examples/jsm/loaders/ColladaLoader.js +8 -0
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +5 -1
- package/examples/jsm/loaders/EXRLoader.js +120 -104
- package/examples/jsm/loaders/FBXLoader.js +4 -0
- package/examples/jsm/loaders/FontLoader.js +2 -0
- package/examples/jsm/loaders/GCodeLoader.js +5 -9
- package/examples/jsm/loaders/GLTFLoader.js +112 -31
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
- package/examples/jsm/loaders/IESLoader.js +46 -12
- package/examples/jsm/loaders/JXLLoader.js +159 -0
- package/examples/jsm/loaders/KMZLoader.js +6 -0
- package/examples/jsm/loaders/KSPLATLoader.js +2 -0
- package/examples/jsm/loaders/KTX2Loader.js +49 -4
- package/examples/jsm/loaders/KTXLoader.js +5 -3
- package/examples/jsm/loaders/LDrawLoader.js +15 -22
- package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
- package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
- package/examples/jsm/loaders/LUTImageLoader.js +2 -0
- package/examples/jsm/loaders/LWOLoader.js +6 -0
- package/examples/jsm/loaders/MD2Loader.js +2 -0
- package/examples/jsm/loaders/MDDLoader.js +4 -0
- package/examples/jsm/loaders/MTLLoader.js +8 -0
- package/examples/jsm/loaders/MaterialXLoader.js +57 -5
- package/examples/jsm/loaders/NRRDLoader.js +4 -2
- package/examples/jsm/loaders/OBJLoader.js +10 -4
- package/examples/jsm/loaders/PCDLoader.js +6 -2
- package/examples/jsm/loaders/PDBLoader.js +5 -3
- package/examples/jsm/loaders/PLYLoader.js +39 -15
- package/examples/jsm/loaders/PVRLoader.js +2 -2
- package/examples/jsm/loaders/SPLATLoader.js +2 -0
- package/examples/jsm/loaders/SPZLoader.js +2 -0
- package/examples/jsm/loaders/STLLoader.js +3 -1
- package/examples/jsm/loaders/SVGLoader.js +27 -49
- package/examples/jsm/loaders/TDSLoader.js +4 -0
- package/examples/jsm/loaders/TGALoader.js +6 -5
- package/examples/jsm/loaders/TTFLoader.js +2 -0
- package/examples/jsm/loaders/USDLoader.js +14 -0
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
- package/examples/jsm/loaders/VOXLoader.js +3 -0
- package/examples/jsm/loaders/VRMLLoader.js +4 -0
- package/examples/jsm/loaders/VTKLoader.js +2 -0
- package/examples/jsm/loaders/XYZLoader.js +2 -0
- package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
- package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
- package/examples/jsm/loaders/usd/USDAParser.js +56 -47
- package/examples/jsm/loaders/usd/USDComposer.js +25 -30
- package/examples/jsm/math/ColorConverter.js +7 -3
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/OBB.js +3 -3
- package/examples/jsm/math/Octree.js +20 -17
- package/examples/jsm/objects/GaussianSplat.js +5 -4
- package/examples/jsm/objects/Reflector.js +5 -0
- package/examples/jsm/objects/SkyMesh.js +14 -7
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/physics/RapierPhysics.js +2 -2
- package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
- package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
- package/examples/jsm/postprocessing/BokehPass.js +1 -1
- package/examples/jsm/postprocessing/GTAOPass.js +26 -18
- package/examples/jsm/renderers/SVGRenderer.js +3 -2
- package/examples/jsm/shaders/GTAOShader.js +7 -4
- package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
- package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
- package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
- package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
- package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
- package/examples/jsm/tsl/display/FSR1Node.js +3 -3
- package/examples/jsm/tsl/display/FXAANode.js +3 -10
- package/examples/jsm/tsl/display/FilmNode.js +3 -3
- package/examples/jsm/tsl/display/GTAONode.js +33 -25
- package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
- package/examples/jsm/tsl/display/GodraysNode.js +5 -19
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
- package/examples/jsm/tsl/display/LensflareNode.js +3 -3
- package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
- package/examples/jsm/tsl/display/OITPassNode.js +0 -11
- package/examples/jsm/tsl/display/OutlineNode.js +107 -5
- package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
- package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
- package/examples/jsm/tsl/display/SMAANode.js +3 -3
- package/examples/jsm/tsl/display/SSAONode.js +6 -20
- package/examples/jsm/tsl/display/SSGINode.js +36 -29
- package/examples/jsm/tsl/display/SSRNode.js +135 -63
- package/examples/jsm/tsl/display/SSSNode.js +6 -20
- package/examples/jsm/tsl/display/SharpenNode.js +3 -3
- package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
- package/examples/jsm/tsl/display/TAAUNode.js +10 -42
- package/examples/jsm/tsl/display/TRAANode.js +11 -43
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
- package/examples/jsm/tsl/display/TransitionNode.js +3 -3
- package/examples/jsm/tsl/display/lensDirt.js +30 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
- package/examples/jsm/tsl/utils/Raymarching.js +1 -1
- package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
- package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
- package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
- package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
- package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -1
- package/examples/jsm/utils/SceneUtils.js +1 -1
- package/examples/jsm/utils/unwrapUVs.js +865 -0
- package/examples/jsm/webxr/XREstimatedLight.js +11 -4
- package/package.json +3 -3
- package/src/Three.TSL.js +2 -683
- package/src/Three.WebGPU.Nodes.js +2 -1
- package/src/Three.WebGPU.js +2 -1
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationUtils.js +1 -3
- package/src/animation/KeyframeTrack.js +19 -0
- package/src/cameras/ArrayCamera.js +12 -0
- package/src/cameras/CubeCamera.js +3 -3
- package/src/constants.js +1 -9
- package/src/core/BufferAttribute.js +57 -21
- package/src/core/BufferGeometry.js +5 -13
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +28 -18
- package/src/core/InterleavedBufferAttribute.js +54 -20
- package/src/core/Object3D.js +19 -9
- package/src/core/Raycaster.js +2 -0
- package/src/core/RenderTarget.js +11 -5
- package/src/core/UniformsGroup.js +7 -3
- package/src/extras/PMREMGenerator.js +392 -685
- package/src/extras/core/Curve.js +4 -0
- package/src/extras/core/CurvePath.js +13 -0
- package/src/extras/core/ShapePath.js +1 -1
- package/src/geometries/EdgesGeometry.js +12 -10
- package/src/geometries/LatheGeometry.js +2 -0
- package/src/helpers/PolarGridHelper.js +1 -1
- package/src/lights/Light.js +11 -0
- package/src/lights/LightProbe.js +2 -0
- package/src/lights/LightShadow.js +2 -0
- package/src/loaders/AnimationLoader.js +2 -0
- package/src/loaders/AudioLoader.js +2 -0
- package/src/loaders/BufferGeometryLoader.js +2 -0
- package/src/loaders/CompressedTextureLoader.js +2 -0
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/DataTextureLoader.js +2 -0
- package/src/loaders/FileLoader.js +2 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ImageLoader.js +1 -0
- package/src/loaders/Loader.js +47 -0
- package/src/loaders/MaterialLoader.js +2 -0
- package/src/loaders/ObjectLoader.js +27 -8
- package/src/loaders/TextureLoader.js +5 -3
- package/src/loaders/nodes/NodeLoader.js +2 -0
- package/src/materials/Material.js +21 -2
- package/src/materials/MeshDepthMaterial.js +1 -1
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +1 -1
- package/src/materials/MeshMatcapMaterial.js +1 -1
- package/src/materials/MeshNormalMaterial.js +1 -1
- package/src/materials/MeshPhongMaterial.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +90 -11
- package/src/materials/MeshStandardMaterial.js +1 -1
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +32 -10
- package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
- package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
- package/src/materials/nodes/NodeMaterial.js +36 -16
- package/src/materials/nodes/NodeMaterialInstance.js +193 -0
- package/src/materials/nodes/NodeMaterials.js +1 -0
- package/src/materials/nodes/PointsNodeMaterial.js +1 -1
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
- package/src/math/Box3.js +2 -2
- package/src/math/Color.js +8 -8
- package/src/math/ColorManagement.js +2 -21
- package/src/math/FrustumArray.js +12 -0
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +2 -4
- package/src/math/MathUtils.js +33 -46
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +1 -1
- package/src/math/Matrix4.js +1 -1
- package/src/math/Triangle.js +2 -1
- package/src/math/Vector2.js +1 -1
- package/src/math/Vector3.js +1 -1
- package/src/math/Vector4.js +1 -1
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +2 -0
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/Batch.js +29 -23
- package/src/nodes/accessors/BufferAttributeNode.js +21 -1
- package/src/nodes/accessors/BuiltinNode.js +6 -0
- package/src/nodes/accessors/Camera.js +100 -93
- package/src/nodes/accessors/ClippingNode.js +17 -6
- package/src/nodes/accessors/CubeTextureNode.js +12 -24
- package/src/nodes/accessors/Instance.js +198 -160
- package/src/nodes/accessors/Lights.js +19 -6
- package/src/nodes/accessors/MaterialNode.js +33 -4
- package/src/nodes/accessors/Morph.js +81 -22
- package/src/nodes/accessors/Normal.js +0 -42
- package/src/nodes/accessors/Object3DNode.js +6 -0
- package/src/nodes/accessors/PointUVNode.js +6 -0
- package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
- package/src/nodes/accessors/ReferenceNode.js +6 -0
- package/src/nodes/accessors/Skinning.js +57 -52
- package/src/nodes/accessors/StorageBufferNode.js +3 -12
- package/src/nodes/accessors/TextureBicubic.js +30 -27
- package/src/nodes/accessors/TextureNode.js +164 -78
- package/src/nodes/accessors/TextureSizeNode.js +6 -0
- package/src/nodes/accessors/UniformArrayNode.js +8 -15
- package/src/nodes/accessors/VelocityNode.js +13 -8
- package/src/nodes/code/CodeNode.js +6 -0
- package/src/nodes/code/ExpressionNode.js +6 -0
- package/src/nodes/code/FunctionCallNode.js +3 -3
- package/src/nodes/code/FunctionNode.js +15 -13
- package/src/nodes/core/ArrayNode.js +3 -3
- package/src/nodes/core/AssignNode.js +10 -9
- package/src/nodes/core/AttributeNode.js +39 -0
- package/src/nodes/core/BypassNode.js +6 -0
- package/src/nodes/core/ConstNode.js +31 -1
- package/src/nodes/core/ContextNode.js +11 -6
- package/src/nodes/core/IndexNode.js +6 -0
- package/src/nodes/core/InputNode.js +6 -0
- package/src/nodes/core/InspectorNode.js +17 -31
- package/src/nodes/core/IsolateNode.js +8 -0
- package/src/nodes/core/Node.js +367 -67
- package/src/nodes/core/NodeBuilder.js +664 -222
- package/src/nodes/core/NodeUtils.js +25 -0
- package/src/nodes/core/NodeVar.js +10 -1
- package/src/nodes/core/OutputStructNode.js +6 -0
- package/src/nodes/core/OverrideContextNode.js +38 -37
- package/src/nodes/core/PropertyNode.js +14 -0
- package/src/nodes/core/StackNode.js +33 -21
- package/src/nodes/core/StructNode.js +6 -0
- package/src/nodes/core/StructTypeNode.js +6 -0
- package/src/nodes/core/SubBuildNode.js +8 -0
- package/src/nodes/core/TempNode.js +10 -35
- package/src/nodes/core/UniformGroupNode.js +6 -0
- package/src/nodes/core/VarNode.js +43 -135
- package/src/nodes/core/VaryingNode.js +33 -2
- package/src/nodes/display/BlendModes.js +5 -40
- package/src/nodes/display/BumpMapNode.js +17 -7
- package/src/nodes/display/ColorAdjustment.js +22 -10
- package/src/nodes/display/ColorSpaceFunctions.js +2 -14
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +6 -0
- package/src/nodes/display/NormalMapNode.js +3 -3
- package/src/nodes/display/PassNode.js +75 -16
- package/src/nodes/display/RenderOutputNode.js +22 -5
- package/src/nodes/display/ScreenNode.js +6 -0
- package/src/nodes/display/ToneMappingFunctions.js +9 -51
- package/src/nodes/display/ToneMappingNode.js +3 -3
- package/src/nodes/display/ToonOutlinePassNode.js +66 -2
- package/src/nodes/display/ViewportDepthNode.js +34 -4
- package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
- package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
- package/src/nodes/functions/BSDF/D_GGX.js +1 -8
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
- package/src/nodes/functions/BSDF/LTC.js +20 -47
- package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
- package/src/nodes/functions/PhysicalLightingModel.js +84 -51
- package/src/nodes/functions/VolumetricLightingModel.js +1 -1
- package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
- package/src/nodes/functions/material/getRoughness.js +3 -1
- package/src/nodes/geometry/RangeNode.js +52 -69
- package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
- package/src/nodes/gpgpu/BarrierNode.js +6 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
- package/src/nodes/gpgpu/ComputeNode.js +6 -0
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
- package/src/nodes/lighting/AnalyticLightNode.js +7 -14
- package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
- package/src/nodes/lighting/EnvironmentNode.js +58 -8
- package/src/nodes/lighting/IESSpotLightNode.js +19 -4
- package/src/nodes/lighting/LightProbeNode.js +2 -1
- package/src/nodes/lighting/LightUtils.js +2 -2
- package/src/nodes/lighting/LightingNode.js +6 -0
- package/src/nodes/lighting/LightsNode.js +26 -32
- package/src/nodes/lighting/PointShadowNode.js +92 -48
- package/src/nodes/lighting/ProjectorLightNode.js +1 -1
- package/src/nodes/lighting/RectAreaLightNode.js +13 -14
- package/src/nodes/lighting/ShadowBaseNode.js +9 -17
- package/src/nodes/lighting/ShadowFilterNode.js +26 -3
- package/src/nodes/lighting/ShadowNode.js +13 -11
- package/src/nodes/materialx/MaterialXColor.js +2 -14
- package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
- package/src/nodes/materialx/MaterialXNodes.js +8 -11
- package/src/nodes/materialx/MaterialXNoise.js +195 -454
- package/src/nodes/math/BitcastNode.js +5 -5
- package/src/nodes/math/BitcountNode.js +18 -46
- package/src/nodes/math/ConditionalNode.js +92 -22
- package/src/nodes/math/Hash.js +1 -1
- package/src/nodes/math/MathNode.js +86 -64
- package/src/nodes/math/MathUtils.js +2 -2
- package/src/nodes/math/OperatorNode.js +42 -59
- package/src/nodes/math/PackFloatNode.js +9 -9
- package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
- package/src/nodes/math/TriNoise3D.js +3 -23
- package/src/nodes/math/UnpackFloatNode.js +9 -9
- package/src/nodes/pmrem/PMREMNode.js +38 -75
- package/src/nodes/pmrem/PMREMUtils.js +108 -272
- package/src/nodes/procedural/Checker.js +1 -1
- package/src/nodes/tsl/TSLCore.js +199 -74
- package/src/nodes/utils/ArrayElementNode.js +19 -1
- package/src/nodes/utils/CubeMapNode.js +3 -3
- package/src/nodes/utils/DebugNode.js +2 -2
- package/src/nodes/utils/EventNode.js +6 -0
- package/src/nodes/utils/FlipNode.js +3 -3
- package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +14 -9
- package/src/nodes/utils/MemberNode.js +18 -0
- package/src/nodes/utils/PostProcessingUtils.js +20 -25
- package/src/nodes/utils/RTTNode.js +2 -0
- package/src/nodes/utils/ReflectorNode.js +24 -0
- package/src/nodes/utils/RotateNode.js +3 -3
- package/src/nodes/utils/SampleNode.js +6 -0
- package/src/nodes/utils/SetNode.js +3 -3
- package/src/nodes/utils/SplitNode.js +6 -0
- package/src/nodes/utils/UVUtils.js +2 -2
- package/src/objects/BatchedMesh.js +146 -15
- package/src/objects/InstancedMesh.js +12 -4
- package/src/objects/Line.js +20 -0
- package/src/objects/Mesh.js +8 -0
- package/src/objects/Points.js +20 -0
- package/src/objects/Skeleton.js +26 -0
- package/src/objects/SkinnedMesh.js +3 -3
- package/src/objects/Sprite.js +10 -0
- package/src/renderers/WebGLRenderer.js +104 -70
- package/src/renderers/common/Animation.js +5 -1
- package/src/renderers/common/Attributes.js +67 -57
- package/src/renderers/common/Backend.js +78 -3
- package/src/renderers/common/BindGroup.js +11 -0
- package/src/renderers/common/Binding.js +0 -11
- package/src/renderers/common/Bindings.js +116 -10
- package/src/renderers/common/Buffer.js +1 -1
- package/src/renderers/common/ClippingContext.js +12 -1
- package/src/renderers/common/ComputePipeline.js +17 -1
- package/src/renderers/common/DirectRenderPipeline.js +7 -3
- package/src/renderers/common/Geometries.js +170 -132
- package/src/renderers/common/Info.js +1 -1
- package/src/renderers/common/InspectorBase.js +5 -5
- package/src/renderers/common/Lighting.js +59 -0
- package/src/renderers/common/Pipelines.js +26 -12
- package/src/renderers/common/ProgrammableStage.js +1 -17
- package/src/renderers/common/RenderContext.js +21 -0
- package/src/renderers/common/RenderContexts.js +13 -4
- package/src/renderers/common/RenderObject.js +111 -35
- package/src/renderers/common/RenderObjects.js +37 -19
- package/src/renderers/common/Renderer.js +537 -295
- package/src/renderers/common/RendererUtils.js +15 -0
- package/src/renderers/common/StandardDrawingPipeline.js +343 -0
- package/src/renderers/common/Storage3DTexture.js +11 -0
- package/src/renderers/common/StorageArrayTexture.js +10 -0
- package/src/renderers/common/StorageTexture.js +0 -9
- package/src/renderers/common/Textures.js +144 -37
- package/src/renderers/common/UniformsGroup.js +19 -0
- package/src/renderers/common/XRManager.js +10 -91
- package/src/renderers/common/extras/PMREMGenerator.js +298 -576
- package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
- package/src/renderers/common/nodes/NodeLibrary.js +11 -35
- package/src/renderers/common/nodes/NodeManager.js +80 -31
- package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
- package/src/renderers/common/nodes/NodeSampler.js +14 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
- package/src/renderers/shaders/ShaderLib.js +3 -0
- package/src/renderers/shaders/UniformsLib.js +4 -5
- package/src/renderers/webgl/WebGLBackground.js +3 -3
- package/src/renderers/webgl/WebGLBindingStates.js +4 -2
- package/src/renderers/webgl/WebGLCapabilities.js +7 -1
- package/src/renderers/webgl/WebGLEnvironments.js +2 -2
- package/src/renderers/webgl/WebGLGeometries.js +42 -14
- package/src/renderers/webgl/WebGLMaterials.js +15 -2
- package/src/renderers/webgl/WebGLOutput.js +37 -1
- package/src/renderers/webgl/WebGLProgram.js +13 -54
- package/src/renderers/webgl/WebGLPrograms.js +22 -8
- package/src/renderers/webgl/WebGLRenderStates.js +11 -8
- package/src/renderers/webgl/WebGLShadowMap.js +6 -4
- package/src/renderers/webgl/WebGLState.js +10 -6
- package/src/renderers/webgl/WebGLTextures.js +129 -77
- package/src/renderers/webgl/WebGLUniforms.js +44 -6
- package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
- package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
- package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
- package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
- package/src/renderers/webgpu/WebGPUBackend.js +140 -82
- package/src/renderers/webgpu/WebGPURenderer.js +1 -1
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
- package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
- package/src/renderers/webxr/WebXRController.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +5 -90
- package/src/scenes/Scene.js +4 -4
- package/src/textures/CompressedTexture.js +2 -2
- package/src/textures/DepthTexture.js +2 -2
- package/src/textures/FramebufferTexture.js +11 -0
- package/src/textures/Texture.js +29 -1
- package/src/textures/TextureSource.js +1 -1
- package/src/upe.js +1 -1
- package/src/utils.js +4 -4
- package/examples/jsm/libs/surfaceNet.js +0 -201
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
|
|
2
2
|
import Backend from '../common/Backend.js';
|
|
3
3
|
import { getCacheKey } from '../common/RenderContext.js';
|
|
4
|
+
import { AttributeType } from '../common/Constants.js';
|
|
4
5
|
|
|
5
6
|
import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
|
|
7
|
+
import WebGLVertexArrayUtils from './utils/WebGLVertexArrayUtils.js';
|
|
6
8
|
import WebGLState from './utils/WebGLState.js';
|
|
7
9
|
import WebGLUtils from './utils/WebGLUtils.js';
|
|
8
10
|
import WebGLTextureUtils from './utils/WebGLTextureUtils.js';
|
|
@@ -67,6 +69,15 @@ class WebGLBackend extends Backend {
|
|
|
67
69
|
*/
|
|
68
70
|
this.attributeUtils = null;
|
|
69
71
|
|
|
72
|
+
/**
|
|
73
|
+
* A reference to a backend module holding vertex array object-related
|
|
74
|
+
* utility functions.
|
|
75
|
+
*
|
|
76
|
+
* @type {?WebGLVertexArrayUtils}
|
|
77
|
+
* @default null
|
|
78
|
+
*/
|
|
79
|
+
this.vertexArrayUtils = null;
|
|
80
|
+
|
|
70
81
|
/**
|
|
71
82
|
* A reference to a backend module holding extension-related
|
|
72
83
|
* utility functions.
|
|
@@ -129,20 +140,6 @@ class WebGLBackend extends Backend {
|
|
|
129
140
|
*/
|
|
130
141
|
this.utils = null;
|
|
131
142
|
|
|
132
|
-
/**
|
|
133
|
-
* Dictionary for caching VAOs.
|
|
134
|
-
*
|
|
135
|
-
* @type {Object<string,WebGLVertexArrayObject>}
|
|
136
|
-
*/
|
|
137
|
-
this.vaoCache = {};
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Dictionary for caching transform feedback objects.
|
|
141
|
-
*
|
|
142
|
-
* @type {Object<string,WebGLTransformFeedback>}
|
|
143
|
-
*/
|
|
144
|
-
this.transformFeedbackCache = {};
|
|
145
|
-
|
|
146
143
|
/**
|
|
147
144
|
* Controls if `gl.RASTERIZER_DISCARD` should be enabled or not.
|
|
148
145
|
* Only relevant when using compute shaders.
|
|
@@ -253,6 +250,7 @@ class WebGLBackend extends Backend {
|
|
|
253
250
|
this.extensions = new WebGLExtensions( this );
|
|
254
251
|
this.capabilities = new WebGLCapabilities( this );
|
|
255
252
|
this.attributeUtils = new WebGLAttributeUtils( this );
|
|
253
|
+
this.vertexArrayUtils = new WebGLVertexArrayUtils( this );
|
|
256
254
|
this.textureUtils = new WebGLTextureUtils( this );
|
|
257
255
|
this.bufferRenderer = new WebGLBufferRenderer( this );
|
|
258
256
|
|
|
@@ -328,10 +326,10 @@ class WebGLBackend extends Backend {
|
|
|
328
326
|
* new allocation.
|
|
329
327
|
*
|
|
330
328
|
* @async
|
|
331
|
-
* @param {BufferAttribute} attribute - The storage buffer attribute to read
|
|
332
|
-
* @param {ReadbackBuffer|ArrayBuffer} target - The
|
|
333
|
-
* @param {number} offset - The
|
|
334
|
-
* @param {number} count - The
|
|
329
|
+
* @param {BufferAttribute} attribute - The storage buffer attribute to read from.
|
|
330
|
+
* @param {?(ReadbackBuffer|ArrayBuffer)} [target=null] - The readback buffer or array buffer that receives the data. If `null`, a new array buffer is returned.
|
|
331
|
+
* @param {number} [offset=0] - The byte offset to start reading from. Must be a multiple of 4.
|
|
332
|
+
* @param {number} [count=-1] - The number of bytes to read. Must be a multiple of 4, or `-1` to read to the end of the buffer.
|
|
335
333
|
* @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
|
|
336
334
|
*/
|
|
337
335
|
async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
|
|
@@ -381,13 +379,19 @@ class WebGLBackend extends Backend {
|
|
|
381
379
|
|
|
382
380
|
const gl = this.gl;
|
|
383
381
|
|
|
384
|
-
this.set( renderTarget.texture, {
|
|
382
|
+
this.set( renderTarget.texture, {
|
|
383
|
+
textureGPU: colorTexture,
|
|
384
|
+
glTextureType: this.textureUtils.getGLTextureType( renderTarget.texture ),
|
|
385
|
+
glInternalFormat: gl.RGBA8 // see #24698 why RGBA8 and not SRGB8_ALPHA8 is used
|
|
386
|
+
} );
|
|
385
387
|
|
|
386
388
|
if ( depthTexture !== null ) {
|
|
387
389
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
390
|
+
this.set( renderTarget.depthTexture, {
|
|
391
|
+
textureGPU: depthTexture,
|
|
392
|
+
glTextureType: this.textureUtils.getGLTextureType( renderTarget.depthTexture ),
|
|
393
|
+
glInternalFormat: renderTarget.stencilBuffer ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24
|
|
394
|
+
} );
|
|
391
395
|
|
|
392
396
|
// The multisample_render_to_texture extension doesn't work properly if there
|
|
393
397
|
// are midframe flushes and an external depth texture.
|
|
@@ -481,7 +485,7 @@ class WebGLBackend extends Backend {
|
|
|
481
485
|
|
|
482
486
|
} else {
|
|
483
487
|
|
|
484
|
-
const { width, height } =
|
|
488
|
+
const { width, height } = renderContext;
|
|
485
489
|
state.viewport( 0, 0, width, height );
|
|
486
490
|
|
|
487
491
|
}
|
|
@@ -492,11 +496,13 @@ class WebGLBackend extends Backend {
|
|
|
492
496
|
|
|
493
497
|
} else {
|
|
494
498
|
|
|
495
|
-
const { width, height } =
|
|
499
|
+
const { width, height } = renderContext;
|
|
496
500
|
state.scissor( 0, 0, width, height );
|
|
497
501
|
|
|
498
502
|
}
|
|
499
503
|
|
|
504
|
+
state.setScissorTest( renderContext.scissor );
|
|
505
|
+
|
|
500
506
|
//
|
|
501
507
|
|
|
502
508
|
this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
|
|
@@ -508,24 +514,25 @@ class WebGLBackend extends Backend {
|
|
|
508
514
|
this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
|
|
509
515
|
|
|
510
516
|
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
517
|
+
const occlusionData = this.getOcclusionData( renderContext );
|
|
511
518
|
|
|
512
519
|
if ( occlusionQueryCount > 0 ) {
|
|
513
520
|
|
|
514
|
-
// Get a reference to the array of objects with queries. The
|
|
521
|
+
// Get a reference to the array of objects with queries. The occlusionData property
|
|
515
522
|
// can be changed by another render pass before the async reading of all previous queries complete
|
|
516
|
-
|
|
517
|
-
|
|
523
|
+
occlusionData.currentOcclusionQueries = occlusionData.occlusionQueries;
|
|
524
|
+
occlusionData.currentOcclusionQueryObjects = occlusionData.occlusionQueryObjects;
|
|
518
525
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
526
|
+
occlusionData.lastOcclusionObject = null;
|
|
527
|
+
occlusionData.occlusionQueries = new Array( occlusionQueryCount );
|
|
528
|
+
occlusionData.occlusionQueryObjects = new Array( occlusionQueryCount );
|
|
529
|
+
occlusionData.occlusionQueryIndex = 0;
|
|
523
530
|
|
|
524
|
-
} else if (
|
|
531
|
+
} else if ( occlusionData.lastOcclusionObject !== undefined ) {
|
|
525
532
|
|
|
526
533
|
// invalidate if there is a stale query
|
|
527
534
|
|
|
528
|
-
|
|
535
|
+
occlusionData.lastOcclusionObject = undefined;
|
|
529
536
|
|
|
530
537
|
}
|
|
531
538
|
|
|
@@ -549,7 +556,7 @@ class WebGLBackend extends Backend {
|
|
|
549
556
|
|
|
550
557
|
if ( occlusionQueryCount > 0 ) {
|
|
551
558
|
|
|
552
|
-
const lastOcclusionObject =
|
|
559
|
+
const lastOcclusionObject = this.getOcclusionData( renderContext ).lastOcclusionObject;
|
|
553
560
|
|
|
554
561
|
if ( lastOcclusionObject && lastOcclusionObject.occlusionTest === true ) {
|
|
555
562
|
|
|
@@ -569,7 +576,7 @@ class WebGLBackend extends Backend {
|
|
|
569
576
|
|
|
570
577
|
const texture = textures[ i ];
|
|
571
578
|
|
|
572
|
-
if ( texture.generateMipmaps ) {
|
|
579
|
+
if ( texture.generateMipmaps === true && texture.mipmapsAutoUpdate === true ) {
|
|
573
580
|
|
|
574
581
|
this.generateMipmaps( texture );
|
|
575
582
|
|
|
@@ -593,7 +600,7 @@ class WebGLBackend extends Backend {
|
|
|
593
600
|
|
|
594
601
|
} else {
|
|
595
602
|
|
|
596
|
-
const { width, height } =
|
|
603
|
+
const { width, height } = previousContext;
|
|
597
604
|
state.viewport( 0, 0, width, height );
|
|
598
605
|
|
|
599
606
|
}
|
|
@@ -604,11 +611,13 @@ class WebGLBackend extends Backend {
|
|
|
604
611
|
|
|
605
612
|
} else {
|
|
606
613
|
|
|
607
|
-
const { width, height } =
|
|
614
|
+
const { width, height } = previousContext;
|
|
608
615
|
state.scissor( 0, 0, width, height );
|
|
609
616
|
|
|
610
617
|
}
|
|
611
618
|
|
|
619
|
+
state.setScissorTest( previousContext.scissor );
|
|
620
|
+
|
|
612
621
|
}
|
|
613
622
|
|
|
614
623
|
this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
|
|
@@ -617,26 +626,26 @@ class WebGLBackend extends Backend {
|
|
|
617
626
|
|
|
618
627
|
/**
|
|
619
628
|
* This method processes the result of occlusion queries and writes it
|
|
620
|
-
* into render context
|
|
629
|
+
* into the occlusion data of the render context.
|
|
621
630
|
*
|
|
622
631
|
* @async
|
|
623
632
|
* @param {RenderContext} renderContext - The render context.
|
|
624
633
|
*/
|
|
625
634
|
resolveOccludedAsync( renderContext ) {
|
|
626
635
|
|
|
627
|
-
const
|
|
636
|
+
const occlusionData = this.getOcclusionData( renderContext );
|
|
628
637
|
|
|
629
638
|
// handle occlusion query results
|
|
630
639
|
|
|
631
|
-
const { currentOcclusionQueries, currentOcclusionQueryObjects } =
|
|
640
|
+
const { currentOcclusionQueries, currentOcclusionQueryObjects } = occlusionData;
|
|
632
641
|
|
|
633
642
|
if ( currentOcclusionQueries && currentOcclusionQueryObjects ) {
|
|
634
643
|
|
|
635
644
|
const occluded = new WeakSet();
|
|
636
645
|
const { gl } = this;
|
|
637
646
|
|
|
638
|
-
|
|
639
|
-
|
|
647
|
+
occlusionData.currentOcclusionQueryObjects = null;
|
|
648
|
+
occlusionData.currentOcclusionQueries = null;
|
|
640
649
|
|
|
641
650
|
const check = () => {
|
|
642
651
|
|
|
@@ -670,7 +679,7 @@ class WebGLBackend extends Backend {
|
|
|
670
679
|
|
|
671
680
|
} else {
|
|
672
681
|
|
|
673
|
-
|
|
682
|
+
occlusionData.occluded = occluded;
|
|
674
683
|
|
|
675
684
|
}
|
|
676
685
|
|
|
@@ -692,9 +701,9 @@ class WebGLBackend extends Backend {
|
|
|
692
701
|
*/
|
|
693
702
|
isOccluded( renderContext, object ) {
|
|
694
703
|
|
|
695
|
-
const
|
|
704
|
+
const occlusionData = this.getOcclusionData( renderContext );
|
|
696
705
|
|
|
697
|
-
return
|
|
706
|
+
return occlusionData.occluded && occlusionData.occluded.has( object );
|
|
698
707
|
|
|
699
708
|
}
|
|
700
709
|
|
|
@@ -820,6 +829,7 @@ class WebGLBackend extends Backend {
|
|
|
820
829
|
const clearDepth = renderer.getClearDepth();
|
|
821
830
|
const clearStencil = renderer.getClearStencil();
|
|
822
831
|
|
|
832
|
+
if ( color ) this.state.setColorMask( true );
|
|
823
833
|
if ( depth ) this.state.setDepthMask( true );
|
|
824
834
|
if ( stencil ) this.state.setStencilMask( 0xffffffff );
|
|
825
835
|
|
|
@@ -927,29 +937,30 @@ class WebGLBackend extends Backend {
|
|
|
927
937
|
|
|
928
938
|
}
|
|
929
939
|
|
|
930
|
-
const { programGPU,
|
|
940
|
+
const { programGPU, transformAttributes, attributes } = this.get( pipeline );
|
|
931
941
|
|
|
932
|
-
|
|
942
|
+
// the buffers are managed by the renderer's attributes so they are re-created after disposal
|
|
933
943
|
|
|
934
|
-
|
|
944
|
+
for ( let i = 0; i < attributes.length; i ++ ) this._updateComputeAttribute( attributes[ i ] );
|
|
945
|
+
for ( let i = 0; i < transformAttributes.length; i ++ ) this._updateComputeAttribute( transformAttributes[ i ] );
|
|
935
946
|
|
|
936
|
-
|
|
947
|
+
const vaoGPU = this.vertexArrayUtils.getVAO( pipeline, attributes );
|
|
937
948
|
|
|
938
|
-
|
|
949
|
+
state.setVertexState( vaoGPU );
|
|
939
950
|
|
|
940
|
-
|
|
951
|
+
state.useProgram( programGPU );
|
|
941
952
|
|
|
942
|
-
|
|
953
|
+
this._bindUniforms( bindings );
|
|
943
954
|
|
|
944
|
-
|
|
955
|
+
// the buffers are only bound to the default transform feedback object during the dispatch so
|
|
956
|
+
// no transform feedback object keeps the memory of disposed buffers allocated
|
|
945
957
|
|
|
946
|
-
|
|
958
|
+
for ( let i = 0; i < transformAttributes.length; i ++ ) {
|
|
947
959
|
|
|
948
|
-
|
|
960
|
+
gl.bindBufferBase( gl.TRANSFORM_FEEDBACK_BUFFER, i, this.get( transformAttributes[ i ] ).transformBuffer );
|
|
949
961
|
|
|
950
|
-
|
|
962
|
+
}
|
|
951
963
|
|
|
952
|
-
gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
|
|
953
964
|
gl.beginTransformFeedback( gl.POINTS );
|
|
954
965
|
|
|
955
966
|
count = ( count !== null ) ? count : computeNode.count;
|
|
@@ -979,13 +990,18 @@ class WebGLBackend extends Backend {
|
|
|
979
990
|
}
|
|
980
991
|
|
|
981
992
|
gl.endTransformFeedback();
|
|
982
|
-
|
|
993
|
+
|
|
994
|
+
for ( let i = 0; i < transformAttributes.length; i ++ ) {
|
|
995
|
+
|
|
996
|
+
gl.bindBufferBase( gl.TRANSFORM_FEEDBACK_BUFFER, i, null );
|
|
997
|
+
|
|
998
|
+
}
|
|
983
999
|
|
|
984
1000
|
// switch active buffers
|
|
985
1001
|
|
|
986
|
-
for ( let i = 0; i <
|
|
1002
|
+
for ( let i = 0; i < transformAttributes.length; i ++ ) {
|
|
987
1003
|
|
|
988
|
-
const dualAttributeData =
|
|
1004
|
+
const dualAttributeData = this.get( transformAttributes[ i ] );
|
|
989
1005
|
|
|
990
1006
|
if ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {
|
|
991
1007
|
|
|
@@ -1000,6 +1016,22 @@ class WebGLBackend extends Backend {
|
|
|
1000
1016
|
|
|
1001
1017
|
}
|
|
1002
1018
|
|
|
1019
|
+
/**
|
|
1020
|
+
* Creates or updates the GPU buffer of the given compute attribute via the renderer's
|
|
1021
|
+
* attributes so it is tracked like other attributes.
|
|
1022
|
+
*
|
|
1023
|
+
* @private
|
|
1024
|
+
* @param {BufferAttribute|InterleavedBufferAttribute} attribute - The buffer attribute.
|
|
1025
|
+
*/
|
|
1026
|
+
_updateComputeAttribute( attribute ) {
|
|
1027
|
+
|
|
1028
|
+
const bufferAttribute = this.getBufferAttribute( attribute );
|
|
1029
|
+
const attributeType = ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) ? AttributeType.STORAGE : AttributeType.VERTEX;
|
|
1030
|
+
|
|
1031
|
+
this.renderer._attributes.update( bufferAttribute, attributeType );
|
|
1032
|
+
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1003
1035
|
/**
|
|
1004
1036
|
* This method is executed at the end of a compute call and
|
|
1005
1037
|
* finalizes work after compute tasks.
|
|
@@ -1101,8 +1133,6 @@ class WebGLBackend extends Backend {
|
|
|
1101
1133
|
|
|
1102
1134
|
const { gl, state } = this;
|
|
1103
1135
|
|
|
1104
|
-
const contextData = this.get( context );
|
|
1105
|
-
|
|
1106
1136
|
const drawParams = renderObject.getDrawParameters();
|
|
1107
1137
|
|
|
1108
1138
|
if ( drawParams === null ) return;
|
|
@@ -1125,60 +1155,45 @@ class WebGLBackend extends Backend {
|
|
|
1125
1155
|
|
|
1126
1156
|
// vertex state
|
|
1127
1157
|
|
|
1128
|
-
const
|
|
1129
|
-
const attributesData = this.get( attributes );
|
|
1130
|
-
|
|
1131
|
-
let vaoGPU = attributesData.vaoGPU;
|
|
1132
|
-
|
|
1133
|
-
if ( vaoGPU === undefined ) {
|
|
1134
|
-
|
|
1135
|
-
const vaoKey = this._getVaoKey( attributes );
|
|
1136
|
-
|
|
1137
|
-
vaoGPU = this.vaoCache[ vaoKey ];
|
|
1138
|
-
|
|
1139
|
-
if ( vaoGPU === undefined ) {
|
|
1158
|
+
const index = renderObject.getIndex();
|
|
1140
1159
|
|
|
1141
|
-
|
|
1160
|
+
const vaoGPU = this.vertexArrayUtils.getVAO( renderObject, renderObject.getAttributes(), index );
|
|
1142
1161
|
|
|
1143
|
-
|
|
1144
|
-
attributesData.vaoGPU = vaoGPU;
|
|
1162
|
+
state.setVertexState( vaoGPU );
|
|
1145
1163
|
|
|
1146
|
-
|
|
1164
|
+
//
|
|
1147
1165
|
|
|
1148
|
-
|
|
1166
|
+
if ( context.occlusionQueryCount > 0 ) {
|
|
1149
1167
|
|
|
1150
|
-
|
|
1151
|
-
const indexGPU = ( index !== null ) ? this.get( index ).bufferGPU : null;
|
|
1168
|
+
const occlusionData = this.getOcclusionData( context );
|
|
1152
1169
|
|
|
1153
|
-
|
|
1170
|
+
const lastObject = occlusionData.lastOcclusionObject;
|
|
1154
1171
|
|
|
1155
|
-
|
|
1172
|
+
if ( lastObject !== object ) {
|
|
1156
1173
|
|
|
1157
|
-
|
|
1174
|
+
if ( lastObject !== null && lastObject.occlusionTest === true ) {
|
|
1158
1175
|
|
|
1159
|
-
|
|
1176
|
+
gl.endQuery( gl.ANY_SAMPLES_PASSED );
|
|
1160
1177
|
|
|
1161
|
-
|
|
1178
|
+
occlusionData.occlusionQueryIndex ++;
|
|
1162
1179
|
|
|
1163
|
-
|
|
1180
|
+
}
|
|
1164
1181
|
|
|
1165
|
-
|
|
1182
|
+
if ( object.occlusionTest === true ) {
|
|
1166
1183
|
|
|
1167
|
-
|
|
1184
|
+
const query = gl.createQuery();
|
|
1168
1185
|
|
|
1169
|
-
|
|
1186
|
+
gl.beginQuery( gl.ANY_SAMPLES_PASSED, query );
|
|
1170
1187
|
|
|
1171
|
-
|
|
1188
|
+
occlusionData.occlusionQueries[ occlusionData.occlusionQueryIndex ] = query;
|
|
1189
|
+
occlusionData.occlusionQueryObjects[ occlusionData.occlusionQueryIndex ] = object;
|
|
1172
1190
|
|
|
1173
|
-
|
|
1191
|
+
}
|
|
1174
1192
|
|
|
1175
|
-
|
|
1176
|
-
contextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;
|
|
1193
|
+
occlusionData.lastOcclusionObject = object;
|
|
1177
1194
|
|
|
1178
1195
|
}
|
|
1179
1196
|
|
|
1180
|
-
contextData.lastOcclusionObject = object;
|
|
1181
|
-
|
|
1182
1197
|
}
|
|
1183
1198
|
|
|
1184
1199
|
//
|
|
@@ -1276,7 +1291,7 @@ class WebGLBackend extends Backend {
|
|
|
1276
1291
|
if ( isRenderCameraDepthArray ) {
|
|
1277
1292
|
|
|
1278
1293
|
// Clear the depth texture
|
|
1279
|
-
const textureData = this.get(
|
|
1294
|
+
const textureData = this.get( this._currentContext.depthTexture );
|
|
1280
1295
|
|
|
1281
1296
|
if ( textureData.clearedRenderId !== this.renderer._nodes.nodeFrame.renderId ) {
|
|
1282
1297
|
|
|
@@ -1301,11 +1316,13 @@ class WebGLBackend extends Backend {
|
|
|
1301
1316
|
|
|
1302
1317
|
}
|
|
1303
1318
|
|
|
1319
|
+
const frustumArray = context.frustumArray;
|
|
1320
|
+
|
|
1304
1321
|
for ( let i = 0, len = cameras.length; i < len; i ++ ) {
|
|
1305
1322
|
|
|
1306
1323
|
const subCamera = cameras[ i ];
|
|
1307
1324
|
|
|
1308
|
-
if ( object.layers.test( subCamera.layers ) ) {
|
|
1325
|
+
if ( object.layers.test( subCamera.layers ) && ( renderObject.camera.perCameraFrustumCulled === false || object.frustumCulled === false || object.intersectsFrustum( frustumArray.getFrustum( i ) ) ) ) {
|
|
1309
1326
|
|
|
1310
1327
|
if ( isRenderCameraDepthArray ) {
|
|
1311
1328
|
|
|
@@ -1355,7 +1372,20 @@ class WebGLBackend extends Backend {
|
|
|
1355
1372
|
}
|
|
1356
1373
|
|
|
1357
1374
|
/**
|
|
1358
|
-
*
|
|
1375
|
+
* Releases the VAO of the given render object.
|
|
1376
|
+
*
|
|
1377
|
+
* @param {RenderObject} renderObject - The render object.
|
|
1378
|
+
*/
|
|
1379
|
+
deleteVertexState( renderObject ) {
|
|
1380
|
+
|
|
1381
|
+
this.vertexArrayUtils.releaseVAO( renderObject );
|
|
1382
|
+
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
/**
|
|
1386
|
+
* Always returns `false` since WebGL has no pipeline state objects. Render state
|
|
1387
|
+
* like blending, depth/stencil or the vertex layout is set per draw, so a render
|
|
1388
|
+
* pipeline only represents a linked shader program which never needs an update.
|
|
1359
1389
|
*
|
|
1360
1390
|
* @param {RenderObject} renderObject - The render object.
|
|
1361
1391
|
* @return {boolean} Whether the render pipeline requires an update or not.
|
|
@@ -1367,7 +1397,9 @@ class WebGLBackend extends Backend {
|
|
|
1367
1397
|
}
|
|
1368
1398
|
|
|
1369
1399
|
/**
|
|
1370
|
-
*
|
|
1400
|
+
* Returns an empty string since a render pipeline only represents a linked shader
|
|
1401
|
+
* program in WebGL. The program is fully identified by its shader stages, which are
|
|
1402
|
+
* already part of the pipeline cache key.
|
|
1371
1403
|
*
|
|
1372
1404
|
* @param {RenderObject} renderObject - The render object.
|
|
1373
1405
|
* @return {string} The cache key.
|
|
@@ -1514,6 +1546,11 @@ class WebGLBackend extends Backend {
|
|
|
1514
1546
|
*/
|
|
1515
1547
|
destroyProgram( program ) {
|
|
1516
1548
|
|
|
1549
|
+
const gl = this.gl;
|
|
1550
|
+
const data = this.get( program );
|
|
1551
|
+
|
|
1552
|
+
gl.deleteShader( data.shaderGPU );
|
|
1553
|
+
|
|
1517
1554
|
this.delete( program );
|
|
1518
1555
|
|
|
1519
1556
|
}
|
|
@@ -1582,6 +1619,30 @@ class WebGLBackend extends Backend {
|
|
|
1582
1619
|
|
|
1583
1620
|
}
|
|
1584
1621
|
|
|
1622
|
+
/**
|
|
1623
|
+
* Destroys the given pipeline.
|
|
1624
|
+
*
|
|
1625
|
+
* @param {Pipeline} pipeline - The pipeline.
|
|
1626
|
+
*/
|
|
1627
|
+
destroyPipeline( pipeline ) {
|
|
1628
|
+
|
|
1629
|
+
const gl = this.gl;
|
|
1630
|
+
const data = this.get( pipeline );
|
|
1631
|
+
|
|
1632
|
+
if ( pipeline.isComputePipeline === true ) {
|
|
1633
|
+
|
|
1634
|
+
// Compute pipeline manage their own VAOs (without render objects)
|
|
1635
|
+
|
|
1636
|
+
this.vertexArrayUtils.releaseVAO( pipeline );
|
|
1637
|
+
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
gl.deleteProgram( data.programGPU );
|
|
1641
|
+
|
|
1642
|
+
this.delete( pipeline );
|
|
1643
|
+
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1585
1646
|
/**
|
|
1586
1647
|
* Formats the source code of error messages.
|
|
1587
1648
|
*
|
|
@@ -1754,7 +1815,7 @@ class WebGLBackend extends Backend {
|
|
|
1754
1815
|
const fragmentShader = this.get( fragmentProgram ).shaderGPU;
|
|
1755
1816
|
const vertexShader = this.get( computeProgram ).shaderGPU;
|
|
1756
1817
|
|
|
1757
|
-
const transforms =
|
|
1818
|
+
const transforms = computePipeline.transforms;
|
|
1758
1819
|
|
|
1759
1820
|
const transformVaryingNames = [];
|
|
1760
1821
|
const transformAttributeNodes = [];
|
|
@@ -1779,29 +1840,21 @@ class WebGLBackend extends Backend {
|
|
|
1779
1840
|
|
|
1780
1841
|
gl.linkProgram( programGPU );
|
|
1781
1842
|
|
|
1782
|
-
|
|
1843
|
+
// only the attributes are stored since their buffers are re-created when they are disposed (see compute())
|
|
1844
|
+
|
|
1845
|
+
const attributeNodes = computePipeline.attributes;
|
|
1783
1846
|
const attributes = [];
|
|
1784
|
-
const
|
|
1847
|
+
const transformAttributes = [];
|
|
1785
1848
|
|
|
1786
1849
|
for ( let i = 0; i < attributeNodes.length; i ++ ) {
|
|
1787
1850
|
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
attributes.push( attribute );
|
|
1791
|
-
|
|
1792
|
-
if ( ! this.has( attribute ) ) this.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );
|
|
1851
|
+
attributes.push( attributeNodes[ i ].node.attribute );
|
|
1793
1852
|
|
|
1794
1853
|
}
|
|
1795
1854
|
|
|
1796
1855
|
for ( let i = 0; i < transformAttributeNodes.length; i ++ ) {
|
|
1797
1856
|
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
if ( ! this.has( attribute ) ) this.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );
|
|
1801
|
-
|
|
1802
|
-
const attributeData = this.get( attribute );
|
|
1803
|
-
|
|
1804
|
-
transformBuffers.push( attributeData );
|
|
1857
|
+
transformAttributes.push( transformAttributeNodes[ i ].attribute );
|
|
1805
1858
|
|
|
1806
1859
|
}
|
|
1807
1860
|
|
|
@@ -1811,7 +1864,7 @@ class WebGLBackend extends Backend {
|
|
|
1811
1864
|
programGPU,
|
|
1812
1865
|
fragmentShader,
|
|
1813
1866
|
vertexShader,
|
|
1814
|
-
|
|
1867
|
+
transformAttributes,
|
|
1815
1868
|
attributes
|
|
1816
1869
|
} );
|
|
1817
1870
|
|
|
@@ -2149,6 +2202,10 @@ class WebGLBackend extends Backend {
|
|
|
2149
2202
|
*/
|
|
2150
2203
|
destroyAttribute( attribute ) {
|
|
2151
2204
|
|
|
2205
|
+
// VAOs keep the memory of attached buffers allocated
|
|
2206
|
+
|
|
2207
|
+
this.vertexArrayUtils.releaseBuffer( this.get( this.getBufferAttribute( attribute ) ) );
|
|
2208
|
+
|
|
2152
2209
|
this.attributeUtils.destroyAttribute( attribute );
|
|
2153
2210
|
|
|
2154
2211
|
}
|
|
@@ -2252,8 +2309,6 @@ class WebGLBackend extends Backend {
|
|
|
2252
2309
|
const { depthBuffer, stencilBuffer } = renderTarget;
|
|
2253
2310
|
|
|
2254
2311
|
const isCube = renderTarget.isCubeRenderTarget === true;
|
|
2255
|
-
const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
|
|
2256
|
-
const isRenderTargetArray = renderTarget.depth > 1;
|
|
2257
2312
|
const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
|
|
2258
2313
|
const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
|
|
2259
2314
|
|
|
@@ -2313,8 +2368,8 @@ class WebGLBackend extends Backend {
|
|
|
2313
2368
|
|
|
2314
2369
|
const { textureGPU } = this.get( textures[ 0 ] );
|
|
2315
2370
|
|
|
2316
|
-
const cubeFace =
|
|
2317
|
-
const mipLevel =
|
|
2371
|
+
const cubeFace = descriptor.activeCubeFace;
|
|
2372
|
+
const mipLevel = descriptor.activeMipmapLevel;
|
|
2318
2373
|
|
|
2319
2374
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
|
|
2320
2375
|
|
|
@@ -2326,8 +2381,6 @@ class WebGLBackend extends Backend {
|
|
|
2326
2381
|
|
|
2327
2382
|
const texture = textures[ i ];
|
|
2328
2383
|
const textureData = this.get( texture );
|
|
2329
|
-
textureData.renderTarget = descriptor.renderTarget;
|
|
2330
|
-
textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
|
|
2331
2384
|
|
|
2332
2385
|
const attachment = gl.COLOR_ATTACHMENT0 + i;
|
|
2333
2386
|
|
|
@@ -2335,10 +2388,10 @@ class WebGLBackend extends Backend {
|
|
|
2335
2388
|
|
|
2336
2389
|
multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, samples, 0, 2 );
|
|
2337
2390
|
|
|
2338
|
-
} else if (
|
|
2391
|
+
} else if ( textureData.glTextureType === gl.TEXTURE_2D_ARRAY || textureData.glTextureType === gl.TEXTURE_3D ) {
|
|
2339
2392
|
|
|
2340
|
-
const layer =
|
|
2341
|
-
const mipLevel =
|
|
2393
|
+
const layer = descriptor.activeCubeFace;
|
|
2394
|
+
const mipLevel = descriptor.activeMipmapLevel;
|
|
2342
2395
|
|
|
2343
2396
|
gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
|
|
2344
2397
|
|
|
@@ -2350,7 +2403,7 @@ class WebGLBackend extends Backend {
|
|
|
2350
2403
|
|
|
2351
2404
|
} else {
|
|
2352
2405
|
|
|
2353
|
-
const mipLevel =
|
|
2406
|
+
const mipLevel = descriptor.activeMipmapLevel;
|
|
2354
2407
|
|
|
2355
2408
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
|
|
2356
2409
|
|
|
@@ -2382,8 +2435,6 @@ class WebGLBackend extends Backend {
|
|
|
2382
2435
|
depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
|
|
2383
2436
|
|
|
2384
2437
|
const textureData = this.get( descriptor.depthTexture );
|
|
2385
|
-
textureData.renderTarget = descriptor.renderTarget;
|
|
2386
|
-
textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
|
|
2387
2438
|
|
|
2388
2439
|
if ( renderTarget.multiview ) {
|
|
2389
2440
|
|
|
@@ -2397,13 +2448,13 @@ class WebGLBackend extends Backend {
|
|
|
2397
2448
|
|
|
2398
2449
|
if ( descriptor.depthTexture.isArrayTexture ) {
|
|
2399
2450
|
|
|
2400
|
-
const layer =
|
|
2451
|
+
const layer = descriptor.activeCubeFace;
|
|
2401
2452
|
|
|
2402
2453
|
gl.framebufferTextureLayer( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, layer );
|
|
2403
2454
|
|
|
2404
2455
|
} else if ( descriptor.depthTexture.isCubeTexture ) {
|
|
2405
2456
|
|
|
2406
|
-
const cubeFace =
|
|
2457
|
+
const cubeFace = descriptor.activeCubeFace;
|
|
2407
2458
|
|
|
2408
2459
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureData.textureGPU, 0 );
|
|
2409
2460
|
|
|
@@ -2430,7 +2481,7 @@ class WebGLBackend extends Backend {
|
|
|
2430
2481
|
|
|
2431
2482
|
state.bindFramebuffer( gl.FRAMEBUFFER, fb );
|
|
2432
2483
|
|
|
2433
|
-
const layer =
|
|
2484
|
+
const layer = descriptor.activeCubeFace;
|
|
2434
2485
|
|
|
2435
2486
|
const depthData = this.get( descriptor.depthTexture );
|
|
2436
2487
|
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
@@ -2452,19 +2503,23 @@ class WebGLBackend extends Backend {
|
|
|
2452
2503
|
|
|
2453
2504
|
// rebind color
|
|
2454
2505
|
|
|
2455
|
-
|
|
2506
|
+
if ( descriptor.textures.length > 0 ) {
|
|
2507
|
+
|
|
2508
|
+
const textureData = this.get( descriptor.textures[ 0 ] );
|
|
2456
2509
|
|
|
2457
|
-
|
|
2510
|
+
if ( renderTarget.multiview ) {
|
|
2458
2511
|
|
|
2459
|
-
|
|
2512
|
+
multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureData.textureGPU, 0, samples, 0, 2 );
|
|
2460
2513
|
|
|
2461
|
-
|
|
2514
|
+
} else if ( useMultisampledRTT ) {
|
|
2462
2515
|
|
|
2463
|
-
|
|
2516
|
+
multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
|
|
2464
2517
|
|
|
2465
|
-
|
|
2518
|
+
} else {
|
|
2519
|
+
|
|
2520
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0 );
|
|
2466
2521
|
|
|
2467
|
-
|
|
2522
|
+
}
|
|
2468
2523
|
|
|
2469
2524
|
}
|
|
2470
2525
|
|
|
@@ -2561,141 +2616,6 @@ class WebGLBackend extends Backend {
|
|
|
2561
2616
|
|
|
2562
2617
|
}
|
|
2563
2618
|
|
|
2564
|
-
/**
|
|
2565
|
-
* Computes the VAO key for the given index and attributes.
|
|
2566
|
-
*
|
|
2567
|
-
* @private
|
|
2568
|
-
* @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
|
|
2569
|
-
* @return {string} The VAO key.
|
|
2570
|
-
*/
|
|
2571
|
-
_getVaoKey( attributes ) {
|
|
2572
|
-
|
|
2573
|
-
let key = '';
|
|
2574
|
-
|
|
2575
|
-
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
2576
|
-
|
|
2577
|
-
const attributeData = this.get( attributes[ i ] );
|
|
2578
|
-
|
|
2579
|
-
key += ':' + attributeData.id;
|
|
2580
|
-
|
|
2581
|
-
}
|
|
2582
|
-
|
|
2583
|
-
return key;
|
|
2584
|
-
|
|
2585
|
-
}
|
|
2586
|
-
|
|
2587
|
-
/**
|
|
2588
|
-
* Creates a VAO from the index and attributes.
|
|
2589
|
-
*
|
|
2590
|
-
* @private
|
|
2591
|
-
* @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
|
|
2592
|
-
* @return {Object} The VAO data.
|
|
2593
|
-
*/
|
|
2594
|
-
_createVao( attributes ) {
|
|
2595
|
-
|
|
2596
|
-
const { gl } = this;
|
|
2597
|
-
|
|
2598
|
-
const vaoGPU = gl.createVertexArray();
|
|
2599
|
-
|
|
2600
|
-
gl.bindVertexArray( vaoGPU );
|
|
2601
|
-
|
|
2602
|
-
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
2603
|
-
|
|
2604
|
-
const attribute = attributes[ i ];
|
|
2605
|
-
const attributeData = this.get( attribute );
|
|
2606
|
-
|
|
2607
|
-
gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
|
|
2608
|
-
gl.enableVertexAttribArray( i );
|
|
2609
|
-
|
|
2610
|
-
let stride, offset;
|
|
2611
|
-
|
|
2612
|
-
if ( attribute.isInterleavedBufferAttribute === true ) {
|
|
2613
|
-
|
|
2614
|
-
stride = attribute.data.stride * attributeData.bytesPerElement;
|
|
2615
|
-
offset = attribute.offset * attributeData.bytesPerElement;
|
|
2616
|
-
|
|
2617
|
-
} else {
|
|
2618
|
-
|
|
2619
|
-
stride = 0;
|
|
2620
|
-
offset = 0;
|
|
2621
|
-
|
|
2622
|
-
}
|
|
2623
|
-
|
|
2624
|
-
if ( attributeData.isInteger ) {
|
|
2625
|
-
|
|
2626
|
-
gl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );
|
|
2627
|
-
|
|
2628
|
-
} else {
|
|
2629
|
-
|
|
2630
|
-
gl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );
|
|
2631
|
-
|
|
2632
|
-
}
|
|
2633
|
-
|
|
2634
|
-
if ( attribute.isInstancedBufferAttribute && ! attribute.isInterleavedBufferAttribute ) {
|
|
2635
|
-
|
|
2636
|
-
gl.vertexAttribDivisor( i, attribute.meshPerAttribute );
|
|
2637
|
-
|
|
2638
|
-
} else if ( attribute.isInterleavedBufferAttribute && attribute.data.isInstancedInterleavedBuffer ) {
|
|
2639
|
-
|
|
2640
|
-
gl.vertexAttribDivisor( i, attribute.data.meshPerAttribute );
|
|
2641
|
-
|
|
2642
|
-
}
|
|
2643
|
-
|
|
2644
|
-
}
|
|
2645
|
-
|
|
2646
|
-
gl.bindBuffer( gl.ARRAY_BUFFER, null );
|
|
2647
|
-
|
|
2648
|
-
return vaoGPU;
|
|
2649
|
-
|
|
2650
|
-
}
|
|
2651
|
-
|
|
2652
|
-
/**
|
|
2653
|
-
* Creates a transform feedback from the given transform buffers.
|
|
2654
|
-
*
|
|
2655
|
-
* @private
|
|
2656
|
-
* @param {Array<DualAttributeData>} transformBuffers - The transform buffers.
|
|
2657
|
-
* @return {WebGLTransformFeedback} The transform feedback.
|
|
2658
|
-
*/
|
|
2659
|
-
_getTransformFeedback( transformBuffers ) {
|
|
2660
|
-
|
|
2661
|
-
let key = '';
|
|
2662
|
-
|
|
2663
|
-
for ( let i = 0; i < transformBuffers.length; i ++ ) {
|
|
2664
|
-
|
|
2665
|
-
key += ':' + transformBuffers[ i ].id;
|
|
2666
|
-
|
|
2667
|
-
}
|
|
2668
|
-
|
|
2669
|
-
let transformFeedbackGPU = this.transformFeedbackCache[ key ];
|
|
2670
|
-
|
|
2671
|
-
if ( transformFeedbackGPU !== undefined ) {
|
|
2672
|
-
|
|
2673
|
-
return transformFeedbackGPU;
|
|
2674
|
-
|
|
2675
|
-
}
|
|
2676
|
-
|
|
2677
|
-
const { gl } = this;
|
|
2678
|
-
|
|
2679
|
-
transformFeedbackGPU = gl.createTransformFeedback();
|
|
2680
|
-
|
|
2681
|
-
gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
|
|
2682
|
-
|
|
2683
|
-
for ( let i = 0; i < transformBuffers.length; i ++ ) {
|
|
2684
|
-
|
|
2685
|
-
const attributeData = transformBuffers[ i ];
|
|
2686
|
-
|
|
2687
|
-
gl.bindBufferBase( gl.TRANSFORM_FEEDBACK_BUFFER, i, attributeData.transformBuffer );
|
|
2688
|
-
|
|
2689
|
-
}
|
|
2690
|
-
|
|
2691
|
-
gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, null );
|
|
2692
|
-
|
|
2693
|
-
this.transformFeedbackCache[ key ] = transformFeedbackGPU;
|
|
2694
|
-
|
|
2695
|
-
return transformFeedbackGPU;
|
|
2696
|
-
|
|
2697
|
-
}
|
|
2698
|
-
|
|
2699
2619
|
/**
|
|
2700
2620
|
* Setups the given bindings.
|
|
2701
2621
|
*
|
|
@@ -2791,8 +2711,9 @@ class WebGLBackend extends Backend {
|
|
|
2791
2711
|
if ( renderTarget.samples > 0 && renderTargetContextData.msaaFrameBuffer !== undefined && this._useMultisampledExtension( renderTarget ) === false ) {
|
|
2792
2712
|
|
|
2793
2713
|
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
2714
|
+
const textures = renderContext.textures;
|
|
2794
2715
|
|
|
2795
|
-
let mask = renderTarget.resolveColorBuffer === false ? 0 : gl.COLOR_BUFFER_BIT;
|
|
2716
|
+
let mask = renderTarget.resolveColorBuffer === false || textures.length === 0 ? 0 : gl.COLOR_BUFFER_BIT;
|
|
2796
2717
|
|
|
2797
2718
|
if ( renderTarget.resolveDepthBuffer ) {
|
|
2798
2719
|
|
|
@@ -2804,9 +2725,11 @@ class WebGLBackend extends Backend {
|
|
|
2804
2725
|
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
2805
2726
|
const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
|
|
2806
2727
|
|
|
2807
|
-
const textures = renderContext.textures;
|
|
2808
2728
|
const isMRT = textures.length > 1;
|
|
2809
2729
|
|
|
2730
|
+
// Depth-only render targets have no color attachment but still resolve their depth.
|
|
2731
|
+
const blitCount = Math.max( textures.length, 1 );
|
|
2732
|
+
|
|
2810
2733
|
state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
|
|
2811
2734
|
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
2812
2735
|
|
|
@@ -2824,7 +2747,7 @@ class WebGLBackend extends Backend {
|
|
|
2824
2747
|
|
|
2825
2748
|
}
|
|
2826
2749
|
|
|
2827
|
-
for ( let i = 0; i <
|
|
2750
|
+
for ( let i = 0; i < blitCount; i ++ ) {
|
|
2828
2751
|
|
|
2829
2752
|
if ( isMRT ) {
|
|
2830
2753
|
|
|
@@ -2936,10 +2859,15 @@ class WebGLBackend extends Backend {
|
|
|
2936
2859
|
|
|
2937
2860
|
await super.dispose();
|
|
2938
2861
|
|
|
2862
|
+
if ( this.vertexArrayUtils !== null ) this.vertexArrayUtils.dispose();
|
|
2939
2863
|
if ( this.textureUtils !== null ) this.textureUtils.dispose();
|
|
2940
2864
|
|
|
2941
|
-
|
|
2942
|
-
|
|
2865
|
+
if ( this.parameters.canvas === undefined ) {
|
|
2866
|
+
|
|
2867
|
+
const extension = this.extensions.get( 'WEBGL_lose_context' );
|
|
2868
|
+
if ( extension ) extension.loseContext();
|
|
2869
|
+
|
|
2870
|
+
}
|
|
2943
2871
|
|
|
2944
2872
|
this.renderer.domElement.removeEventListener( 'webglcontextlost', this._onContextLost );
|
|
2945
2873
|
|