@needle-tools/three 0.169.20-experimental.0 → 0.183.2-canary.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/LICENSE +1 -1
- package/README.md +5 -6
- package/build/three.cjs +54184 -56703
- package/build/three.core.js +59506 -0
- package/build/three.core.min.js +6 -0
- package/build/three.module.js +11645 -73000
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +648 -0
- package/build/three.tsl.min.js +6 -0
- package/build/three.webgpu.js +53912 -51652
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +53888 -51806
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +5 -15
- package/examples/jsm/animation/AnimationClipCreator.js +58 -6
- package/examples/jsm/animation/CCDIKSolver.js +152 -45
- package/examples/jsm/capabilities/WebGL.js +28 -29
- package/examples/jsm/capabilities/WebGPU.js +19 -17
- package/examples/jsm/controls/ArcballControls.js +474 -178
- package/examples/jsm/controls/DragControls.js +100 -58
- package/examples/jsm/controls/FirstPersonControls.js +116 -6
- package/examples/jsm/controls/FlyControls.js +50 -2
- package/examples/jsm/controls/MapControls.js +96 -8
- package/examples/jsm/controls/OrbitControls.js +496 -57
- package/examples/jsm/controls/PointerLockControls.js +115 -22
- package/examples/jsm/controls/TrackballControls.js +166 -14
- package/examples/jsm/controls/TransformControls.js +336 -26
- package/examples/jsm/csm/CSM.js +232 -18
- package/examples/jsm/csm/CSMFrustum.js +61 -4
- package/examples/jsm/csm/CSMHelper.js +50 -0
- package/examples/jsm/csm/CSMShader.js +13 -1
- package/examples/jsm/csm/CSMShadowNode.js +599 -0
- package/examples/jsm/curves/CurveExtras.js +303 -31
- package/examples/jsm/curves/NURBSCurve.js +91 -16
- package/examples/jsm/curves/NURBSSurface.js +52 -6
- package/examples/jsm/curves/NURBSUtils.js +102 -112
- package/examples/jsm/curves/NURBSVolume.js +24 -4
- package/examples/jsm/effects/AnaglyphEffect.js +134 -7
- package/examples/jsm/effects/AsciiEffect.js +69 -22
- package/examples/jsm/effects/OutlineEffect.js +61 -111
- package/examples/jsm/effects/ParallaxBarrierEffect.js +30 -0
- package/examples/jsm/effects/StereoEffect.js +31 -0
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/DebugEnvironment.js +50 -0
- package/examples/jsm/environments/RoomEnvironment.js +83 -42
- package/examples/jsm/exporters/DRACOExporter.js +56 -14
- package/examples/jsm/exporters/EXRExporter.js +40 -9
- package/examples/jsm/exporters/GLTFExporter.js +502 -169
- package/examples/jsm/exporters/OBJExporter.js +21 -1
- package/examples/jsm/exporters/PLYExporter.js +44 -12
- package/examples/jsm/exporters/STLExporter.js +27 -5
- package/examples/jsm/exporters/USDZExporter.js +781 -291
- package/examples/jsm/geometries/BoxLineGeometry.js +23 -0
- package/examples/jsm/geometries/ConvexGeometry.js +19 -0
- package/examples/jsm/geometries/DecalGeometry.js +91 -30
- package/examples/jsm/geometries/ParametricFunctions.js +100 -0
- package/examples/jsm/geometries/ParametricGeometry.js +38 -5
- package/examples/jsm/geometries/RoundedBoxGeometry.js +68 -7
- package/examples/jsm/geometries/TeapotGeometry.js +23 -38
- package/examples/jsm/geometries/TextGeometry.js +48 -29
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeHelper.js +36 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +38 -1
- package/examples/jsm/helpers/OctreeHelper.js +36 -0
- package/examples/jsm/helpers/PositionalAudioHelper.js +60 -0
- package/examples/jsm/helpers/RapierHelper.js +59 -0
- package/examples/jsm/helpers/RectAreaLightHelper.js +36 -3
- package/examples/jsm/helpers/TextureHelper.js +28 -0
- package/examples/jsm/helpers/TextureHelperGPU.js +214 -0
- package/examples/jsm/helpers/VertexNormalsHelper.js +61 -2
- package/examples/jsm/helpers/VertexTangentsHelper.js +47 -2
- package/examples/jsm/helpers/ViewHelper.js +181 -9
- package/examples/jsm/inspector/Inspector.js +487 -0
- package/examples/jsm/inspector/RendererInspector.js +425 -0
- package/examples/jsm/inspector/tabs/Console.js +238 -0
- package/examples/jsm/inspector/tabs/Parameters.js +348 -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 +1975 -0
- package/examples/jsm/inspector/ui/Style.js +1613 -0
- package/examples/jsm/inspector/ui/Tab.js +233 -0
- package/examples/jsm/inspector/ui/Values.js +439 -0
- package/examples/jsm/inspector/ui/utils.js +56 -0
- package/examples/jsm/interactive/HTMLMesh.js +43 -12
- package/examples/jsm/interactive/InteractiveGroup.js +170 -52
- package/examples/jsm/interactive/SelectionBox.js +106 -9
- package/examples/jsm/interactive/SelectionHelper.js +76 -30
- package/examples/jsm/libs/demuxer_mp4.js +109 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +76 -58
- package/examples/jsm/libs/motion-controllers.module.js +1 -1
- package/examples/jsm/lighting/TiledLighting.js +42 -0
- package/examples/jsm/lights/LightProbeGenerator.js +44 -7
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +50 -14
- package/examples/jsm/lights/RectAreaLightUniformsLib.js +16 -0
- package/examples/jsm/lines/Line2.js +41 -4
- package/examples/jsm/lines/LineGeometry.js +80 -2
- package/examples/jsm/lines/LineMaterial.js +105 -5
- package/examples/jsm/lines/LineSegments2.js +54 -4
- package/examples/jsm/lines/LineSegmentsGeometry.js +65 -8
- package/examples/jsm/lines/Wireframe.js +41 -4
- package/examples/jsm/lines/WireframeGeometry2.js +27 -2
- package/examples/jsm/lines/webgpu/Line2.js +28 -2
- package/examples/jsm/lines/webgpu/LineSegments2.js +59 -24
- package/examples/jsm/lines/webgpu/Wireframe.js +86 -0
- package/examples/jsm/loaders/3DMLoader.js +78 -6
- package/examples/jsm/loaders/3MFLoader.js +148 -7
- package/examples/jsm/loaders/AMFLoader.js +34 -14
- package/examples/jsm/loaders/BVHLoader.js +59 -12
- package/examples/jsm/loaders/ColladaLoader.js +61 -4027
- package/examples/jsm/loaders/DDSLoader.js +68 -1
- package/examples/jsm/loaders/DRACOLoader.js +146 -22
- package/examples/jsm/loaders/EXRLoader.js +255 -34
- package/examples/jsm/loaders/FBXLoader.js +80 -42
- package/examples/jsm/loaders/FontLoader.js +83 -6
- package/examples/jsm/loaders/GCodeLoader.js +71 -14
- package/examples/jsm/loaders/GLTFLoader.js +381 -263
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +52 -3
- package/examples/jsm/loaders/HDRLoader.js +485 -0
- package/examples/jsm/loaders/IESLoader.js +42 -0
- package/examples/jsm/loaders/KMZLoader.js +39 -6
- package/examples/jsm/loaders/KTX2Loader.js +124 -48
- package/examples/jsm/loaders/KTXLoader.js +31 -10
- package/examples/jsm/loaders/LDrawLoader.js +192 -145
- package/examples/jsm/loaders/LUT3dlLoader.js +47 -10
- package/examples/jsm/loaders/LUTCubeLoader.js +46 -9
- package/examples/jsm/loaders/LUTImageLoader.js +79 -38
- package/examples/jsm/loaders/LWOLoader.js +54 -59
- package/examples/jsm/loaders/LottieLoader.js +54 -1
- package/examples/jsm/loaders/MD2Loader.js +37 -1
- package/examples/jsm/loaders/MDDLoader.js +57 -12
- package/examples/jsm/loaders/MTLLoader.js +60 -35
- package/examples/jsm/loaders/MaterialXLoader.js +268 -34
- package/examples/jsm/loaders/NRRDLoader.js +40 -8
- package/examples/jsm/loaders/OBJLoader.js +51 -2
- package/examples/jsm/loaders/PCDLoader.js +173 -21
- package/examples/jsm/loaders/PDBLoader.js +41 -2
- package/examples/jsm/loaders/PLYLoader.js +70 -39
- package/examples/jsm/loaders/PVRLoader.js +25 -6
- package/examples/jsm/loaders/RGBELoader.js +6 -438
- package/examples/jsm/loaders/STLLoader.js +48 -38
- package/examples/jsm/loaders/SVGLoader.js +119 -25
- package/examples/jsm/loaders/TDSLoader.js +92 -74
- package/examples/jsm/loaders/TGALoader.js +23 -2
- package/examples/jsm/loaders/TIFFLoader.js +23 -0
- package/examples/jsm/loaders/TTFLoader.js +50 -3
- package/examples/jsm/loaders/USDLoader.js +279 -0
- package/examples/jsm/loaders/USDZLoader.js +4 -858
- package/examples/jsm/loaders/UltraHDRLoader.js +338 -166
- package/examples/jsm/loaders/VOXLoader.js +688 -87
- package/examples/jsm/loaders/VRMLLoader.js +121 -12
- package/examples/jsm/loaders/VTKLoader.js +77 -25
- package/examples/jsm/loaders/XYZLoader.js +36 -0
- package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
- package/examples/jsm/loaders/lwo/IFFParser.js +77 -77
- package/examples/jsm/loaders/usd/USDAParser.js +822 -0
- package/examples/jsm/loaders/usd/USDCParser.js +1852 -0
- package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
- package/examples/jsm/materials/LDrawConditionalLineMaterial.js +183 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +154 -0
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/Capsule.js +91 -14
- package/examples/jsm/math/ColorConverter.js +22 -0
- package/examples/jsm/math/ColorSpaces.js +74 -2
- package/examples/jsm/math/ConvexHull.js +517 -93
- package/examples/jsm/math/ImprovedNoise.js +32 -15
- package/examples/jsm/math/Lut.js +113 -0
- package/examples/jsm/math/MeshSurfaceSampler.js +78 -13
- package/examples/jsm/math/OBB.js +141 -29
- package/examples/jsm/math/Octree.js +283 -7
- package/examples/jsm/math/SimplexNoise.js +68 -42
- package/examples/jsm/misc/ConvexObjectBreaker.js +45 -25
- package/examples/jsm/misc/GPUComputationRenderer.js +96 -20
- package/examples/jsm/misc/Gyroscope.js +12 -0
- package/examples/jsm/misc/MD2Character.js +117 -2
- package/examples/jsm/misc/MD2CharacterComplex.js +175 -11
- package/examples/jsm/misc/MorphAnimMesh.js +44 -0
- package/examples/jsm/misc/MorphBlendMesh.js +103 -0
- package/examples/jsm/misc/ProgressiveLightMap.js +100 -54
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +322 -0
- package/examples/jsm/misc/RollerCoaster.js +57 -0
- package/examples/jsm/misc/TubePainter.js +437 -40
- package/examples/jsm/misc/Volume.js +123 -76
- package/examples/jsm/misc/VolumeSlice.js +95 -49
- package/examples/jsm/modifiers/CurveModifier.js +66 -38
- package/examples/jsm/modifiers/CurveModifierGPU.js +42 -19
- package/examples/jsm/modifiers/EdgeSplitModifier.js +20 -0
- package/examples/jsm/modifiers/SimplifyModifier.js +24 -10
- package/examples/jsm/modifiers/TessellateModifier.js +35 -2
- package/examples/jsm/objects/GroundedSkybox.js +25 -6
- package/examples/jsm/objects/Lensflare.js +94 -2
- package/examples/jsm/objects/LensflareMesh.js +64 -10
- package/examples/jsm/objects/MarchingCubes.js +90 -5
- package/examples/jsm/objects/Reflector.js +76 -2
- package/examples/jsm/objects/ReflectorForSSRPass.js +41 -0
- package/examples/jsm/objects/Refractor.js +62 -0
- package/examples/jsm/objects/ShadowMesh.js +54 -4
- package/examples/jsm/objects/Sky.js +106 -16
- package/examples/jsm/objects/SkyMesh.js +211 -38
- package/examples/jsm/objects/Water.js +49 -8
- package/examples/jsm/objects/Water2.js +49 -7
- package/examples/jsm/objects/Water2Mesh.js +50 -9
- package/examples/jsm/objects/WaterMesh.js +136 -43
- package/examples/jsm/physics/AmmoPhysics.js +60 -7
- package/examples/jsm/physics/JoltPhysics.js +65 -12
- package/examples/jsm/physics/RapierPhysics.js +217 -21
- package/examples/jsm/postprocessing/AfterimagePass.js +110 -29
- package/examples/jsm/postprocessing/BloomPass.js +128 -26
- package/examples/jsm/postprocessing/BokehPass.js +99 -22
- package/examples/jsm/postprocessing/ClearPass.js +54 -3
- package/examples/jsm/postprocessing/CubeTexturePass.js +82 -21
- package/examples/jsm/postprocessing/DotScreenPass.js +59 -10
- package/examples/jsm/postprocessing/EffectComposer.js +140 -6
- package/examples/jsm/postprocessing/FXAAPass.js +40 -0
- package/examples/jsm/postprocessing/FilmPass.js +54 -5
- package/examples/jsm/postprocessing/GTAOPass.js +202 -57
- package/examples/jsm/postprocessing/GlitchPass.js +86 -34
- package/examples/jsm/postprocessing/HalftonePass.js +65 -10
- package/examples/jsm/postprocessing/LUTPass.js +38 -8
- package/examples/jsm/postprocessing/MaskPass.js +91 -0
- package/examples/jsm/postprocessing/OutlinePass.js +272 -135
- package/examples/jsm/postprocessing/OutputPass.js +65 -14
- package/examples/jsm/postprocessing/Pass.js +100 -4
- package/examples/jsm/postprocessing/RenderPass.js +94 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +124 -45
- package/examples/jsm/postprocessing/RenderTransitionPass.js +120 -21
- package/examples/jsm/postprocessing/SAOPass.js +128 -55
- package/examples/jsm/postprocessing/SMAAPass.js +106 -75
- package/examples/jsm/postprocessing/SSAARenderPass.js +118 -35
- package/examples/jsm/postprocessing/SSAOPass.js +173 -60
- package/examples/jsm/postprocessing/SSRPass.js +268 -53
- package/examples/jsm/postprocessing/SavePass.js +69 -16
- package/examples/jsm/postprocessing/ShaderPass.js +65 -7
- package/examples/jsm/postprocessing/TAARenderPass.js +79 -24
- package/examples/jsm/postprocessing/TexturePass.js +72 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +168 -59
- package/examples/jsm/renderers/CSS2DRenderer.js +98 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +111 -7
- package/examples/jsm/renderers/Projector.js +288 -32
- package/examples/jsm/renderers/SVGRenderer.js +323 -61
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +3 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +5 -1
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +12 -5
- package/examples/jsm/shaders/AfterimageShader.js +8 -3
- package/examples/jsm/shaders/BasicShader.js +8 -1
- package/examples/jsm/shaders/BleachBypassShader.js +10 -3
- package/examples/jsm/shaders/BlendShader.js +8 -1
- package/examples/jsm/shaders/BokehShader.js +9 -3
- package/examples/jsm/shaders/BokehShader2.js +11 -4
- package/examples/jsm/shaders/BrightnessContrastShader.js +10 -4
- package/examples/jsm/shaders/ColorCorrectionShader.js +8 -1
- package/examples/jsm/shaders/ColorifyShader.js +8 -1
- package/examples/jsm/shaders/ConvolutionShader.js +9 -38
- package/examples/jsm/shaders/CopyShader.js +8 -1
- package/examples/jsm/shaders/DOFMipMapShader.js +10 -3
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +10 -1
- package/examples/jsm/shaders/DigitalGlitch.js +10 -7
- package/examples/jsm/shaders/DotScreenShader.js +8 -3
- package/examples/jsm/shaders/ExposureShader.js +8 -1
- package/examples/jsm/shaders/FXAAShader.js +233 -221
- package/examples/jsm/shaders/FilmShader.js +13 -0
- package/examples/jsm/shaders/FocusShader.js +8 -3
- package/examples/jsm/shaders/FreiChenShader.js +10 -3
- package/examples/jsm/shaders/GTAOShader.js +55 -45
- package/examples/jsm/shaders/GammaCorrectionShader.js +11 -2
- package/examples/jsm/shaders/HalftoneShader.js +24 -4
- package/examples/jsm/shaders/HorizontalBlurShader.js +12 -3
- package/examples/jsm/shaders/HorizontalTiltShiftShader.js +9 -2
- package/examples/jsm/shaders/HueSaturationShader.js +10 -3
- package/examples/jsm/shaders/KaleidoShader.js +11 -4
- package/examples/jsm/shaders/LuminosityHighPassShader.js +8 -4
- package/examples/jsm/shaders/LuminosityShader.js +8 -2
- package/examples/jsm/shaders/MirrorShader.js +10 -4
- package/examples/jsm/shaders/NormalMapShader.js +7 -2
- package/examples/jsm/shaders/OutputShader.js +19 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +30 -17
- package/examples/jsm/shaders/RGBShiftShader.js +8 -1
- package/examples/jsm/shaders/SAOShader.js +27 -5
- package/examples/jsm/shaders/SMAAShader.js +24 -1
- package/examples/jsm/shaders/SSAOShader.js +37 -6
- package/examples/jsm/shaders/SSRShader.js +32 -6
- package/examples/jsm/shaders/SepiaShader.js +8 -3
- package/examples/jsm/shaders/SobelOperatorShader.js +9 -3
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +13 -8
- package/examples/jsm/shaders/TechnicolorShader.js +10 -4
- package/examples/jsm/shaders/ToonShader.js +29 -6
- package/examples/jsm/shaders/TriangleBlurShader.js +9 -4
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +19 -6
- package/examples/jsm/shaders/VelocityShader.js +8 -1
- package/examples/jsm/shaders/VerticalBlurShader.js +9 -2
- package/examples/jsm/shaders/VerticalTiltShiftShader.js +8 -1
- package/examples/jsm/shaders/VignetteShader.js +8 -3
- package/examples/jsm/shaders/VolumeShader.js +11 -2
- package/examples/jsm/shaders/WaterRefractionShader.js +11 -0
- package/examples/jsm/textures/FlakesTexture.js +14 -0
- package/examples/jsm/transpiler/AST.js +436 -31
- package/examples/jsm/transpiler/GLSLDecoder.js +380 -135
- package/examples/jsm/transpiler/Linker.js +327 -0
- package/examples/jsm/transpiler/ShaderToyDecoder.js +3 -1
- package/examples/jsm/transpiler/TSLEncoder.js +363 -97
- package/examples/jsm/transpiler/Transpiler.js +50 -1
- package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
- package/examples/jsm/transpiler/WGSLEncoder.js +839 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +244 -0
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +549 -0
- package/examples/jsm/tsl/display/AnamorphicNode.js +282 -0
- package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
- package/{src/nodes → examples/jsm/tsl}/display/BleachBypass.js +11 -4
- package/examples/jsm/tsl/display/BloomNode.js +534 -0
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +334 -0
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +554 -0
- package/examples/jsm/tsl/display/DotScreenNode.js +104 -0
- package/examples/jsm/tsl/display/FXAANode.js +365 -0
- package/examples/jsm/tsl/display/FilmNode.js +101 -0
- package/examples/jsm/tsl/display/GTAONode.js +571 -0
- package/examples/jsm/tsl/display/GaussianBlurNode.js +389 -0
- package/examples/jsm/tsl/display/GodraysNode.js +624 -0
- package/examples/jsm/tsl/display/LensflareNode.js +279 -0
- package/examples/jsm/tsl/display/Lut3DNode.js +109 -0
- package/examples/jsm/tsl/display/MotionBlur.js +33 -0
- package/examples/jsm/tsl/display/OutlineNode.js +762 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +89 -0
- package/examples/jsm/tsl/display/PixelationPassNode.js +335 -0
- package/examples/jsm/tsl/display/RGBShiftNode.js +96 -0
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +768 -0
- package/{src/nodes → examples/jsm/tsl}/display/SSAAPassNode.js +120 -49
- package/examples/jsm/tsl/display/SSGINode.js +642 -0
- package/examples/jsm/tsl/display/SSRNode.js +656 -0
- package/examples/jsm/tsl/display/SSSNode.js +490 -0
- package/{src/nodes → examples/jsm/tsl}/display/Sepia.js +9 -2
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/{src/nodes → examples/jsm/tsl}/display/SobelOperatorNode.js +61 -19
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +192 -0
- package/{src/nodes → examples/jsm/tsl}/display/StereoPassNode.js +48 -12
- package/examples/jsm/tsl/display/TRAANode.js +726 -0
- package/examples/jsm/tsl/display/TransitionNode.js +141 -0
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/hashBlur.js +54 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +442 -0
- package/examples/jsm/tsl/math/Bayer.js +73 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
- package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
- package/examples/jsm/tsl/utils/Raymarching.js +70 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +91 -29
- package/examples/jsm/utils/CameraUtils.js +15 -6
- package/examples/jsm/utils/GeometryCompressionUtils.js +23 -30
- package/examples/jsm/utils/GeometryUtils.js +32 -27
- package/examples/jsm/utils/LDrawUtils.js +14 -5
- package/examples/jsm/utils/SceneOptimizer.js +458 -0
- package/examples/jsm/utils/SceneUtils.js +53 -3
- package/examples/jsm/utils/ShadowMapViewer.js +72 -33
- package/examples/jsm/utils/ShadowMapViewerGPU.js +61 -29
- package/examples/jsm/utils/SkeletonUtils.js +48 -0
- package/examples/jsm/utils/SortUtils.js +17 -5
- package/examples/jsm/utils/UVsDebug.js +12 -4
- package/examples/jsm/utils/{TextureUtils.js → WebGLTextureUtils.js} +16 -0
- package/examples/jsm/utils/{TextureUtilsGPU.js → WebGPUTextureUtils.js} +20 -2
- package/examples/jsm/utils/WorkerPool.js +67 -2
- package/examples/jsm/webxr/ARButton.js +19 -0
- package/examples/jsm/webxr/OculusHandModel.js +84 -0
- package/examples/jsm/webxr/OculusHandPointerModel.js +148 -22
- package/examples/jsm/webxr/Text2D.js +20 -6
- package/examples/jsm/webxr/VRButton.js +31 -0
- package/examples/jsm/webxr/XRButton.js +23 -0
- package/examples/jsm/webxr/XRControllerModelFactory.js +94 -3
- package/examples/jsm/webxr/XREstimatedLight.js +35 -4
- package/examples/jsm/webxr/XRHandMeshModel.js +37 -0
- package/examples/jsm/webxr/XRHandModelFactory.js +96 -6
- package/examples/jsm/webxr/XRHandPrimitiveModel.js +44 -0
- package/examples/jsm/webxr/XRPlanes.js +18 -0
- package/package.json +29 -37
- package/src/Three.Core.js +198 -0
- package/src/Three.Legacy.js +0 -21
- package/src/Three.TSL.js +641 -0
- package/src/Three.WebGPU.Nodes.js +14 -186
- package/src/Three.WebGPU.js +16 -186
- package/src/Three.js +2 -197
- package/src/animation/AnimationAction.js +263 -31
- package/src/animation/AnimationClip.js +162 -7
- package/src/animation/AnimationMixer.js +105 -15
- package/src/animation/AnimationObjectGroup.js +45 -21
- package/src/animation/AnimationUtils.js +163 -24
- package/src/animation/KeyframeTrack.js +191 -17
- package/src/animation/PropertyBinding.js +91 -16
- package/src/animation/PropertyMixer.js +72 -5
- package/src/animation/tracks/BooleanKeyframeTrack.js +33 -6
- package/src/animation/tracks/ColorKeyframeTrack.js +26 -5
- package/src/animation/tracks/NumberKeyframeTrack.js +26 -2
- package/src/animation/tracks/QuaternionKeyframeTrack.js +30 -1
- package/src/animation/tracks/StringKeyframeTrack.js +33 -2
- package/src/animation/tracks/VectorKeyframeTrack.js +26 -2
- package/src/audio/Audio.js +386 -8
- package/src/audio/AudioAnalyser.js +58 -1
- package/src/audio/AudioContext.js +15 -0
- package/src/audio/AudioListener.js +94 -13
- package/src/audio/PositionalAudio.js +107 -0
- package/src/cameras/ArrayCamera.js +37 -0
- package/src/cameras/Camera.js +61 -0
- package/src/cameras/CubeCamera.js +86 -0
- package/src/cameras/OrthographicCamera.js +110 -1
- package/src/cameras/PerspectiveCamera.js +174 -35
- package/src/cameras/StereoCamera.js +48 -2
- package/src/constants.js +1546 -11
- package/src/core/BufferAttribute.js +417 -3
- package/src/core/BufferGeometry.js +407 -22
- package/src/core/Clock.js +69 -8
- package/src/core/EventDispatcher.js +52 -8
- package/src/core/GLBufferAttribute.js +113 -2
- package/src/core/InstancedBufferAttribute.js +29 -0
- package/src/core/InstancedBufferGeometry.js +20 -0
- package/src/core/InstancedInterleavedBuffer.js +26 -0
- package/src/core/InterleavedBuffer.js +141 -7
- package/src/core/InterleavedBufferAttribute.js +200 -2
- package/src/core/Layers.js +71 -10
- package/src/core/Object3D.js +673 -26
- package/src/core/Raycaster.js +136 -2
- package/src/core/RenderTarget.js +256 -27
- package/src/core/RenderTarget3D.js +48 -0
- package/src/core/Timer.js +184 -0
- package/src/core/Uniform.js +29 -0
- package/src/core/UniformsGroup.js +84 -2
- package/src/extras/Controls.js +89 -1
- package/src/extras/DataUtils.js +50 -9
- package/src/extras/Earcut.js +18 -779
- package/src/extras/ImageUtils.js +22 -14
- package/src/extras/PMREMGenerator.js +316 -67
- package/src/extras/ShapeUtils.js +24 -2
- package/src/extras/TextureUtils.js +101 -15
- package/src/extras/core/Curve.js +156 -55
- package/src/extras/core/CurvePath.js +63 -22
- package/src/extras/core/Interpolations.js +34 -2
- package/src/extras/core/Path.js +134 -1
- package/src/extras/core/Shape.js +66 -3
- package/src/extras/core/ShapePath.js +80 -4
- package/src/extras/curves/ArcCurve.js +22 -0
- package/src/extras/curves/CatmullRomCurve3.js +89 -18
- package/src/extras/curves/CubicBezierCurve.js +67 -0
- package/src/extras/curves/CubicBezierCurve3.js +50 -0
- package/src/extras/curves/EllipseCurve.js +102 -0
- package/src/extras/curves/LineCurve.js +36 -0
- package/src/extras/curves/LineCurve3.js +36 -0
- package/src/extras/curves/QuadraticBezierCurve.js +59 -0
- package/src/extras/curves/QuadraticBezierCurve3.js +43 -0
- package/src/extras/curves/SplineCurve.js +48 -0
- package/src/extras/lib/earcut.js +685 -0
- package/src/geometries/BoxGeometry.js +39 -0
- package/src/geometries/CapsuleGeometry.js +196 -11
- package/src/geometries/CircleGeometry.js +41 -0
- package/src/geometries/ConeGeometry.js +39 -0
- package/src/geometries/CylinderGeometry.js +42 -2
- package/src/geometries/DodecahedronGeometry.js +33 -0
- package/src/geometries/EdgesGeometry.js +30 -2
- package/src/geometries/ExtrudeGeometry.js +148 -52
- package/src/geometries/IcosahedronGeometry.js +33 -0
- package/src/geometries/LatheGeometry.js +44 -3
- package/src/geometries/OctahedronGeometry.js +33 -0
- package/src/geometries/PlaneGeometry.js +35 -0
- package/src/geometries/PolyhedronGeometry.js +30 -1
- package/src/geometries/RingGeometry.js +37 -0
- package/src/geometries/ShapeGeometry.js +38 -0
- package/src/geometries/SphereGeometry.js +38 -0
- package/src/geometries/TetrahedronGeometry.js +33 -0
- package/src/geometries/TorusGeometry.js +44 -3
- package/src/geometries/TorusKnotGeometry.js +39 -0
- package/src/geometries/TubeGeometry.js +50 -0
- package/src/geometries/WireframeGeometry.js +32 -0
- package/src/helpers/ArrowHelper.js +62 -5
- package/src/helpers/AxesHelper.js +28 -0
- package/src/helpers/Box3Helper.js +28 -0
- package/src/helpers/BoxHelper.js +43 -7
- package/src/helpers/CameraHelper.js +103 -27
- package/src/helpers/DirectionalLightHelper.js +55 -0
- package/src/helpers/GridHelper.js +26 -0
- package/src/helpers/HemisphereLightHelper.js +42 -0
- package/src/helpers/PlaneHelper.js +33 -0
- package/src/helpers/PointLightHelper.js +43 -24
- package/src/helpers/PolarGridHelper.js +30 -0
- package/src/helpers/SkeletonHelper.js +73 -7
- package/src/helpers/SpotLightHelper.js +43 -0
- package/src/lights/AmbientLight.js +25 -0
- package/src/lights/DirectionalLight.js +70 -0
- package/src/lights/DirectionalLightShadow.js +15 -0
- package/src/lights/HemisphereLight.js +42 -0
- package/src/lights/Light.js +37 -11
- package/src/lights/LightProbe.js +37 -9
- package/src/lights/LightShadow.js +202 -7
- package/src/lights/PointLight.js +74 -0
- package/src/lights/PointLightShadow.js +15 -80
- package/src/lights/RectAreaLight.js +59 -0
- package/src/lights/SpotLight.js +124 -1
- package/src/lights/SpotLightShadow.js +33 -3
- package/src/lights/webgpu/IESSpotLight.js +22 -0
- package/src/lights/webgpu/ProjectorLight.js +46 -0
- package/src/loaders/AnimationLoader.js +34 -2
- package/src/loaders/AudioLoader.js +34 -2
- package/src/loaders/BufferGeometryLoader.js +38 -13
- package/src/loaders/Cache.js +75 -2
- package/src/loaders/CompressedTextureLoader.js +36 -3
- package/src/loaders/CubeTextureLoader.js +45 -0
- package/src/loaders/DataTextureLoader.js +45 -4
- package/src/loaders/FileLoader.js +85 -5
- package/src/loaders/ImageBitmapLoader.js +113 -11
- package/src/loaders/ImageLoader.js +85 -8
- package/src/loaders/Loader.js +150 -0
- package/src/loaders/LoaderUtils.js +18 -36
- package/src/loaders/LoadingManager.js +187 -0
- package/src/loaders/MaterialLoader.js +62 -3
- package/src/loaders/ObjectLoader.js +131 -31
- package/src/loaders/TextureLoader.js +33 -0
- package/src/loaders/nodes/NodeLoader.js +68 -4
- package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
- package/src/loaders/nodes/NodeObjectLoader.js +61 -0
- package/src/materials/LineBasicMaterial.js +74 -1
- package/src/materials/LineDashedMaterial.js +52 -1
- package/src/materials/Material.js +502 -8
- package/src/materials/MeshBasicMaterial.js +168 -2
- package/src/materials/MeshDepthMaterial.js +94 -0
- package/src/materials/MeshDistanceMaterial.js +76 -0
- package/src/materials/MeshLambertMaterial.js +283 -0
- package/src/materials/MeshMatcapMaterial.js +164 -0
- package/src/materials/MeshNormalMaterial.js +114 -0
- package/src/materials/MeshPhongMaterial.js +298 -0
- package/src/materials/MeshPhysicalMaterial.js +296 -4
- package/src/materials/MeshStandardMaterial.js +300 -2
- package/src/materials/MeshToonMaterial.js +219 -0
- package/src/materials/PointsMaterial.js +89 -0
- package/src/materials/RawShaderMaterial.js +25 -0
- package/src/materials/ShaderMaterial.js +234 -6
- package/src/materials/ShadowMaterial.js +54 -0
- package/src/materials/SpriteMaterial.js +82 -0
- package/src/materials/nodes/Line2NodeMaterial.js +158 -53
- package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
- package/src/materials/nodes/LineDashedNodeMaterial.js +81 -6
- package/src/materials/nodes/MeshBasicNodeMaterial.js +59 -2
- package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +23 -3
- package/src/materials/nodes/MeshNormalNodeMaterial.js +27 -4
- package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +276 -3
- package/src/materials/nodes/MeshSSSNodeMaterial.js +98 -10
- package/src/materials/nodes/MeshStandardNodeMaterial.js +83 -4
- package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
- package/src/materials/nodes/NodeMaterial.js +789 -74
- package/src/materials/nodes/NodeMaterials.js +0 -1
- package/src/materials/nodes/PointsNodeMaterial.js +180 -11
- package/src/materials/nodes/ShadowNodeMaterial.js +38 -0
- package/src/materials/nodes/SpriteNodeMaterial.js +86 -23
- package/src/materials/nodes/VolumeNodeMaterial.js +57 -84
- package/src/materials/nodes/manager/NodeMaterialObserver.js +329 -12
- package/src/math/Box2.js +177 -0
- package/src/math/Box3.js +271 -0
- package/src/math/Color.js +355 -11
- package/src/math/ColorManagement.js +158 -92
- package/src/math/Cylindrical.js +65 -6
- package/src/math/Euler.js +139 -5
- package/src/math/Frustum.js +108 -9
- package/src/math/FrustumArray.js +258 -0
- package/src/math/Interpolant.js +87 -8
- package/src/math/Line3.js +221 -2
- package/src/math/MathUtils.js +408 -20
- package/src/math/Matrix2.js +70 -0
- package/src/math/Matrix3.js +229 -4
- package/src/math/Matrix4.js +489 -94
- package/src/math/Plane.js +164 -2
- package/src/math/Quaternion.js +322 -90
- package/src/math/Ray.js +162 -0
- package/src/math/Sphere.js +175 -0
- package/src/math/Spherical.js +73 -11
- package/src/math/SphericalHarmonics3.js +112 -14
- package/src/math/Triangle.js +206 -2
- package/src/math/Vector2.js +396 -10
- package/src/math/Vector3.js +550 -15
- package/src/math/Vector4.js +415 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/math/interpolants/CubicInterpolant.js +10 -1
- package/src/math/interpolants/DiscreteInterpolant.js +10 -2
- package/src/math/interpolants/LinearInterpolant.js +13 -0
- package/src/math/interpolants/QuaternionLinearInterpolant.js +10 -1
- package/src/nodes/Nodes.js +91 -88
- package/src/nodes/TSL.js +32 -38
- package/src/nodes/accessors/AccessorsUtils.js +37 -9
- package/src/nodes/accessors/Arrays.js +68 -0
- package/src/nodes/accessors/BatchNode.js +49 -14
- package/src/nodes/accessors/Bitangent.js +82 -13
- package/src/nodes/accessors/BufferAttributeNode.js +269 -8
- package/src/nodes/accessors/BufferNode.js +91 -2
- package/src/nodes/accessors/BuiltinNode.js +63 -0
- package/src/nodes/accessors/Camera.js +400 -10
- package/src/nodes/accessors/ClippingNode.js +149 -45
- package/src/nodes/accessors/CubeTextureNode.js +137 -7
- package/src/nodes/accessors/InstanceNode.js +245 -40
- package/src/nodes/accessors/InstancedMeshNode.js +50 -0
- package/src/nodes/accessors/Lights.js +88 -0
- package/src/nodes/accessors/MaterialNode.js +355 -13
- package/src/nodes/accessors/MaterialProperties.js +57 -1
- package/src/nodes/accessors/MaterialReferenceNode.js +52 -14
- package/src/nodes/accessors/ModelNode.js +117 -5
- package/src/nodes/accessors/ModelViewProjectionNode.js +10 -39
- package/src/nodes/accessors/MorphNode.js +73 -26
- package/src/nodes/accessors/Normal.js +174 -19
- package/src/nodes/accessors/Object3DNode.js +146 -12
- package/src/nodes/accessors/PointUVNode.js +25 -0
- package/src/nodes/accessors/Position.js +119 -7
- package/src/nodes/accessors/ReferenceBaseNode.js +190 -4
- package/src/nodes/accessors/ReferenceNode.js +223 -8
- package/src/nodes/accessors/ReflectVector.js +29 -3
- package/src/nodes/accessors/RendererReferenceNode.js +45 -2
- package/src/nodes/accessors/SceneProperties.js +53 -0
- package/src/nodes/accessors/SkinningNode.js +180 -43
- package/src/nodes/accessors/StorageBufferNode.js +278 -26
- package/src/nodes/accessors/StorageTextureNode.js +205 -12
- package/src/nodes/accessors/Tangent.js +48 -10
- package/src/nodes/accessors/TangentUtils.js +46 -0
- package/src/nodes/accessors/Texture3DNode.js +104 -11
- package/src/nodes/accessors/TextureBicubic.js +31 -4
- package/src/nodes/accessors/TextureNode.js +564 -52
- package/src/nodes/accessors/TextureSizeNode.js +42 -1
- package/src/nodes/accessors/UV.js +9 -1
- package/src/nodes/accessors/UniformArrayNode.js +226 -34
- package/src/nodes/accessors/UserDataNode.js +46 -2
- package/src/nodes/accessors/VelocityNode.js +93 -3
- package/src/nodes/accessors/VertexColorNode.js +39 -4
- package/src/nodes/code/CodeNode.js +101 -8
- package/src/nodes/code/ExpressionNode.js +29 -2
- package/src/nodes/code/FunctionCallNode.js +98 -10
- package/src/nodes/code/FunctionNode.js +69 -2
- package/src/nodes/core/ArrayNode.js +174 -0
- package/src/nodes/core/AssignNode.js +80 -9
- package/src/nodes/core/AttributeNode.js +47 -4
- package/src/nodes/core/BypassNode.js +47 -3
- package/src/nodes/core/ConstNode.js +32 -0
- package/src/nodes/core/ContextNode.js +220 -14
- package/src/nodes/core/IndexNode.js +72 -7
- package/src/nodes/core/InputNode.js +50 -1
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/IsolateNode.js +133 -0
- package/src/nodes/core/LightingModel.js +65 -5
- package/src/nodes/core/MRTNode.js +113 -2
- package/src/nodes/core/Node.js +595 -36
- package/src/nodes/core/NodeAttribute.js +38 -0
- package/src/nodes/core/NodeBuilder.js +1840 -121
- package/src/nodes/core/NodeCache.js +41 -2
- package/src/nodes/core/NodeCode.js +31 -0
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +153 -24
- package/src/nodes/core/NodeFunction.js +48 -1
- package/src/nodes/core/NodeFunctionInput.js +44 -0
- package/src/nodes/core/NodeParser.js +13 -1
- package/src/nodes/core/NodeUniform.js +53 -1
- package/src/nodes/core/NodeUtils.js +201 -51
- package/src/nodes/core/NodeVar.js +47 -1
- package/src/nodes/core/NodeVarying.js +47 -1
- package/src/nodes/core/OutputStructNode.js +54 -12
- package/src/nodes/core/ParameterNode.js +60 -2
- package/src/nodes/core/PropertyNode.js +286 -7
- package/src/nodes/core/StackNode.js +337 -20
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +134 -0
- package/src/nodes/core/StructType.js +13 -0
- package/src/nodes/core/StructTypeNode.js +126 -6
- package/src/nodes/core/SubBuildNode.js +89 -0
- package/src/nodes/core/TempNode.js +31 -5
- package/src/nodes/core/UniformGroupNode.js +85 -7
- package/src/nodes/core/UniformNode.js +163 -16
- package/src/nodes/core/VarNode.js +317 -10
- package/src/nodes/core/VaryingNode.js +115 -13
- package/src/nodes/core/constants.js +40 -0
- package/src/nodes/display/BlendModes.js +171 -0
- package/src/nodes/display/BumpMapNode.js +38 -2
- package/src/nodes/display/ColorAdjustment.js +118 -6
- package/src/nodes/display/ColorSpaceFunctions.js +22 -6
- package/src/nodes/display/ColorSpaceNode.js +97 -47
- package/src/nodes/display/FrontFacingNode.js +64 -7
- package/src/nodes/display/NormalMapNode.js +101 -54
- package/src/nodes/display/PassNode.js +690 -33
- package/src/nodes/display/RenderOutputNode.js +94 -4
- package/src/nodes/display/ScreenNode.js +138 -27
- package/src/nodes/display/ToneMappingFunctions.js +62 -10
- package/src/nodes/display/ToneMappingNode.js +88 -8
- package/src/nodes/display/ToonOutlinePassNode.js +84 -4
- package/src/nodes/display/ViewportDepthNode.js +227 -10
- package/src/nodes/display/ViewportDepthTextureNode.js +39 -5
- package/src/nodes/display/ViewportSharedTextureNode.js +35 -1
- package/src/nodes/display/ViewportTextureNode.js +171 -7
- package/src/nodes/fog/Fog.js +97 -0
- 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/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/LTC.js +45 -1
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
- package/src/nodes/functions/BasicLightingModel.js +28 -6
- package/src/nodes/functions/PhongLightingModel.js +36 -6
- package/src/nodes/functions/PhysicalLightingModel.js +336 -91
- package/src/nodes/functions/ShadowMaskModel.js +30 -3
- package/src/nodes/functions/ToonLightingModel.js +21 -2
- package/src/nodes/functions/VolumetricLightingModel.js +183 -0
- package/src/nodes/functions/material/getAlphaHashThreshold.js +68 -0
- package/src/nodes/functions/material/getGeometryRoughness.js +10 -4
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +37 -0
- package/src/nodes/geometry/RangeNode.js +97 -8
- package/src/nodes/gpgpu/AtomicFunctionNode.js +198 -23
- package/src/nodes/gpgpu/BarrierNode.js +52 -3
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +135 -6
- package/src/nodes/gpgpu/ComputeNode.js +212 -16
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +143 -9
- package/src/nodes/lighting/AONode.js +18 -0
- package/src/nodes/lighting/AmbientLightNode.js +10 -0
- package/src/nodes/lighting/AnalyticLightNode.js +186 -399
- package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
- package/src/nodes/lighting/BasicLightMapNode.js +17 -0
- package/src/nodes/lighting/DirectionalLightNode.js +12 -11
- package/src/nodes/lighting/EnvironmentNode.js +59 -19
- package/src/nodes/lighting/HemisphereLightNode.js +33 -2
- package/src/nodes/lighting/IESSpotLightNode.js +13 -1
- package/src/nodes/lighting/IrradianceNode.js +17 -0
- package/src/nodes/lighting/LightProbeNode.js +20 -0
- package/src/nodes/lighting/LightUtils.js +11 -3
- package/src/nodes/lighting/LightingContextNode.js +52 -4
- package/src/nodes/lighting/LightingNode.js +15 -6
- package/src/nodes/lighting/LightsNode.js +238 -35
- package/src/nodes/lighting/PointLightNode.js +60 -25
- package/src/nodes/lighting/PointShadowNode.js +325 -0
- package/src/nodes/lighting/ProjectorLightNode.js +91 -0
- package/src/nodes/lighting/RectAreaLightNode.js +50 -14
- package/src/nodes/lighting/ShadowBaseNode.js +81 -0
- package/src/nodes/lighting/ShadowFilterNode.js +264 -0
- package/src/nodes/lighting/ShadowNode.js +867 -0
- package/src/nodes/lighting/SpotLightNode.js +99 -18
- package/src/nodes/materialx/MaterialXNodes.js +131 -2
- package/src/nodes/materialx/lib/mx_noise.js +166 -2
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +110 -21
- package/src/nodes/math/Hash.js +8 -0
- package/src/nodes/math/MathNode.js +820 -97
- package/src/nodes/math/MathUtils.js +47 -1
- package/src/nodes/math/OperatorNode.js +517 -84
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/TriNoise3D.js +17 -7
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
- package/src/nodes/parsers/GLSLNodeParser.js +11 -0
- package/src/nodes/pmrem/PMREMNode.js +180 -23
- package/src/nodes/pmrem/PMREMUtils.js +114 -5
- package/src/nodes/procedural/Checker.js +8 -0
- package/src/nodes/shapes/Shapes.js +33 -0
- package/src/nodes/tsl/TSLBase.js +10 -4
- package/src/nodes/tsl/TSLCore.js +732 -160
- package/src/nodes/utils/ArrayElementNode.js +55 -4
- package/src/nodes/utils/ConvertNode.js +31 -0
- package/src/nodes/utils/CubeMapNode.js +79 -2
- package/src/nodes/utils/DebugNode.js +83 -0
- package/src/nodes/utils/Discard.js +18 -2
- package/src/nodes/utils/EquirectUV.js +27 -0
- package/src/nodes/utils/EventNode.js +118 -0
- package/src/nodes/utils/FlipNode.js +38 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +91 -22
- package/src/nodes/utils/JoinNode.js +57 -4
- package/src/nodes/utils/LoopNode.js +193 -55
- package/src/nodes/utils/MatcapUV.js +22 -0
- package/src/nodes/utils/MaxMipLevelNode.js +49 -1
- package/src/nodes/utils/MemberNode.js +120 -0
- package/src/nodes/utils/Oscillators.js +41 -0
- package/src/nodes/utils/Packing.js +30 -1
- package/src/nodes/utils/PostProcessingUtils.js +154 -0
- package/src/nodes/utils/RTTNode.js +165 -9
- package/src/nodes/utils/ReflectorNode.js +407 -21
- package/src/nodes/utils/RemapNode.js +81 -2
- package/src/nodes/utils/RotateNode.js +41 -1
- package/src/nodes/utils/SampleNode.js +91 -0
- package/src/nodes/utils/SetNode.js +44 -1
- package/src/nodes/utils/SplitNode.js +66 -3
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/SpriteUtils.js +16 -0
- package/src/nodes/utils/StorageArrayElementNode.js +56 -3
- package/src/nodes/utils/Timer.js +26 -0
- package/src/nodes/utils/TriplanarTextures.js +65 -0
- package/src/nodes/utils/UVUtils.js +48 -0
- package/src/nodes/utils/ViewportUtils.js +12 -0
- package/src/objects/BatchedMesh.js +798 -309
- package/src/objects/Bone.js +24 -0
- package/src/objects/ClippingGroup.js +68 -0
- package/src/objects/Group.js +24 -0
- package/src/objects/InstancedMesh.js +131 -2
- package/src/objects/LOD.js +99 -5
- package/src/objects/Line.js +90 -7
- package/src/objects/LineLoop.js +20 -0
- package/src/objects/LineSegments.js +20 -1
- package/src/objects/Mesh.js +84 -0
- package/src/objects/Points.js +60 -0
- package/src/objects/Skeleton.js +120 -5
- package/src/objects/SkinnedMesh.js +102 -6
- package/src/objects/Sprite.js +65 -1
- package/src/renderers/WebGL3DRenderTarget.js +26 -0
- package/src/renderers/WebGLArrayRenderTarget.js +26 -0
- package/src/renderers/WebGLCubeRenderTarget.js +41 -5
- package/src/renderers/WebGLRenderTarget.js +19 -0
- package/src/renderers/WebGLRenderer.js +1016 -278
- package/src/renderers/common/Animation.js +123 -14
- package/src/renderers/common/Attributes.js +41 -1
- package/src/renderers/common/Backend.js +623 -44
- package/src/renderers/common/Background.js +99 -16
- package/src/renderers/common/BindGroup.js +37 -2
- package/src/renderers/common/Binding.js +46 -0
- package/src/renderers/common/Bindings.js +211 -20
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +89 -0
- package/src/renderers/common/BufferUtils.js +25 -0
- package/src/renderers/common/BundleGroup.js +57 -0
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +73 -10
- package/src/renderers/common/ClippingContext.js +172 -87
- package/src/renderers/common/Color4.js +40 -0
- package/src/renderers/common/ComputePipeline.js +24 -0
- package/src/renderers/common/Constants.js +2 -1
- package/src/renderers/common/CubeRenderTarget.js +77 -7
- package/src/renderers/common/DataMap.js +37 -1
- package/src/renderers/common/Geometries.js +163 -14
- package/src/renderers/common/IndirectStorageBufferAttribute.js +38 -0
- package/src/renderers/common/Info.js +81 -36
- package/src/renderers/common/InspectorBase.js +146 -0
- package/src/renderers/common/Lighting.js +57 -0
- package/src/renderers/common/Pipeline.js +22 -0
- package/src/renderers/common/Pipelines.js +150 -7
- package/src/renderers/common/PostProcessing.js +22 -84
- package/src/renderers/common/ProgrammableStage.js +60 -2
- package/src/renderers/common/QuadMesh.js +63 -6
- package/src/renderers/common/RenderBundle.js +14 -8
- package/src/renderers/common/RenderBundles.js +40 -10
- package/src/renderers/common/RenderContext.js +219 -4
- package/src/renderers/common/RenderContexts.js +54 -17
- package/src/renderers/common/RenderList.js +233 -24
- package/src/renderers/common/RenderLists.js +46 -6
- package/src/renderers/common/RenderObject.js +548 -46
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +133 -15
- package/src/renderers/common/RenderPipeline.js +216 -6
- package/src/renderers/common/Renderer.js +2155 -332
- package/src/renderers/common/RendererUtils.js +200 -0
- package/src/renderers/common/SampledTexture.js +99 -39
- package/src/renderers/common/Sampler.js +148 -1
- package/src/renderers/common/Storage3DTexture.js +100 -0
- package/src/renderers/common/StorageArrayTexture.js +84 -0
- package/src/renderers/common/StorageBuffer.js +38 -2
- package/src/renderers/common/StorageBufferAttribute.js +31 -2
- package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
- package/src/renderers/common/StorageTexture.js +65 -0
- package/src/renderers/common/Textures.js +273 -57
- package/src/renderers/common/TimestampQueryPool.js +163 -0
- package/src/renderers/common/Uniform.js +233 -3
- package/src/renderers/common/UniformBuffer.js +19 -0
- package/src/renderers/common/UniformsGroup.js +235 -26
- package/src/renderers/common/XRManager.js +1677 -0
- package/src/renderers/common/XRRenderTarget.js +91 -0
- package/src/renderers/common/extras/PMREMGenerator.js +371 -108
- package/src/renderers/common/nodes/NodeBuilderState.js +100 -6
- package/src/renderers/common/nodes/NodeLibrary.js +95 -17
- package/src/renderers/common/nodes/NodeManager.js +852 -0
- package/src/renderers/common/nodes/NodeSampledTexture.js +84 -8
- package/src/renderers/common/nodes/NodeSampler.js +41 -1
- package/src/renderers/common/nodes/NodeStorageBuffer.js +48 -3
- package/src/renderers/common/nodes/NodeUniform.js +285 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +81 -0
- package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
- package/src/renderers/shaders/DFGLUTData.js +49 -0
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +4 -24
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +154 -59
- 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/map_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +230 -181
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
- package/src/renderers/shaders/ShaderChunk.js +3 -3
- package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +14 -2
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -5
- package/src/renderers/shaders/UniformsLib.js +2 -7
- package/src/renderers/shaders/UniformsUtils.js +21 -2
- package/src/renderers/webgl/WebGLAttributes.js +4 -0
- package/src/renderers/webgl/WebGLBackground.js +30 -5
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +2 -6
- package/src/renderers/webgl/WebGLCapabilities.js +7 -14
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLGeometries.js +10 -35
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +2 -6
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +12 -0
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +267 -0
- package/src/renderers/webgl/WebGLProgram.js +87 -148
- package/src/renderers/webgl/WebGLPrograms.js +53 -51
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLShadowMap.js +204 -28
- package/src/renderers/webgl/WebGLState.js +88 -56
- package/src/renderers/webgl/WebGLTextures.js +293 -59
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl/WebGLUtils.js +7 -5
- package/src/renderers/webgl-fallback/WebGLBackend.js +1416 -293
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +5 -10
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +785 -92
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +62 -1
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +3 -3
- package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +584 -20
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +468 -80
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +396 -0
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +72 -24
- package/src/renderers/webgpu/WebGPUBackend.js +1517 -428
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +31 -4
- package/src/renderers/webgpu/WebGPURenderer.js +55 -4
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +23 -16
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +37 -42
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +1335 -241
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +32 -4
- package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +144 -20
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +460 -116
- package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -4
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +283 -69
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +225 -178
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +583 -191
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +310 -0
- package/src/renderers/webgpu/utils/WebGPUUtils.js +150 -28
- package/src/renderers/webxr/WebXRController.js +87 -2
- package/src/renderers/webxr/WebXRDepthSensing.js +52 -7
- package/src/renderers/webxr/WebXRManager.js +275 -15
- package/src/scenes/Fog.js +60 -0
- package/src/scenes/FogExp2.js +51 -0
- package/src/scenes/Scene.js +88 -0
- package/src/textures/CanvasTexture.js +28 -0
- package/src/textures/CompressedArrayTexture.js +57 -0
- package/src/textures/CompressedCubeTexture.js +29 -0
- package/src/textures/CompressedTexture.js +64 -6
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/CubeTexture.js +52 -4
- package/src/textures/Data3DTexture.js +79 -2
- package/src/textures/DataArrayTexture.js +93 -0
- package/src/textures/DataTexture.js +65 -0
- package/src/textures/DepthTexture.js +59 -11
- package/src/textures/ExternalTexture.js +56 -0
- package/src/textures/FramebufferTexture.js +62 -0
- package/src/textures/Source.js +106 -4
- package/src/textures/Texture.js +488 -6
- package/src/textures/VideoFrameTexture.js +72 -0
- package/src/textures/VideoTexture.js +78 -6
- package/src/utils.js +322 -3
- package/examples/jsm/animation/MMDAnimationHelper.js +0 -1207
- package/examples/jsm/animation/MMDPhysics.js +0 -1406
- package/examples/jsm/cameras/CinematicCamera.js +0 -208
- package/examples/jsm/effects/PeppersGhostEffect.js +0 -153
- package/examples/jsm/exporters/MMDExporter.js +0 -217
- package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -174
- package/examples/jsm/geometries/ParametricGeometries.js +0 -254
- package/examples/jsm/libs/mmdparser.module.js +0 -11530
- package/examples/jsm/loaders/GLTFLoaderAnimationPointer.js +0 -729
- package/examples/jsm/loaders/MMDLoader.js +0 -2295
- package/examples/jsm/loaders/RGBMLoader.js +0 -1081
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -432
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -144
- package/examples/jsm/misc/Timer.js +0 -128
- package/examples/jsm/objects/InstancedPoints.js +0 -21
- package/examples/jsm/shaders/GodRaysShader.js +0 -321
- package/examples/jsm/shaders/MMDToonShader.js +0 -134
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -156
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -24
- package/src/nodes/accessors/SceneNode.js +0 -55
- package/src/nodes/code/ScriptableNode.js +0 -505
- package/src/nodes/code/ScriptableValueNode.js +0 -170
- package/src/nodes/core/CacheNode.js +0 -50
- package/src/nodes/core/UniformGroup.js +0 -13
- package/src/nodes/display/AfterImageNode.js +0 -158
- package/src/nodes/display/AnaglyphPassNode.js +0 -67
- package/src/nodes/display/AnamorphicNode.js +0 -151
- package/src/nodes/display/BlendMode.js +0 -54
- package/src/nodes/display/BloomNode.js +0 -341
- package/src/nodes/display/DenoiseNode.js +0 -204
- package/src/nodes/display/DepthOfFieldNode.js +0 -124
- package/src/nodes/display/DotScreenNode.js +0 -66
- package/src/nodes/display/FXAANode.js +0 -332
- package/src/nodes/display/FilmNode.js +0 -56
- package/src/nodes/display/GTAONode.js +0 -331
- package/src/nodes/display/GaussianBlurNode.js +0 -213
- package/src/nodes/display/Lut3DNode.js +0 -57
- package/src/nodes/display/MotionBlur.js +0 -25
- package/src/nodes/display/ParallaxBarrierPassNode.js +0 -58
- package/src/nodes/display/PixelationPassNode.js +0 -213
- package/src/nodes/display/PosterizeNode.js +0 -33
- package/src/nodes/display/RGBShiftNode.js +0 -53
- package/src/nodes/display/StereoCompositePassNode.js +0 -110
- package/src/nodes/display/TransitionNode.js +0 -80
- package/src/nodes/fog/FogExp2Node.js +0 -35
- package/src/nodes/fog/FogNode.js +0 -50
- package/src/nodes/fog/FogRangeNode.js +0 -36
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
- package/src/nodes/utils/EquirectUVNode.js +0 -36
- package/src/nodes/utils/MatcapUVNode.js +0 -33
- package/src/nodes/utils/OscNode.js +0 -85
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -45
- package/src/nodes/utils/TimerNode.js +0 -97
- package/src/nodes/utils/TriplanarTexturesNode.js +0 -64
- package/src/renderers/common/nodes/Nodes.js +0 -534
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -136
|
@@ -11,21 +11,205 @@ 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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
import { isTypedArray, warnOnce, warn, error } from '../../utils.js';
|
|
15
|
+
import { WebGLCoordinateSystem, TimestampQuery, Compatibility } from '../../constants.js';
|
|
16
|
+
import WebGLTimestampQueryPool from './utils/WebGLTimestampQueryPool.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A backend implementation targeting WebGL 2.
|
|
20
|
+
*
|
|
21
|
+
* @private
|
|
22
|
+
* @augments Backend
|
|
23
|
+
*/
|
|
19
24
|
class WebGLBackend extends Backend {
|
|
20
25
|
|
|
26
|
+
/**
|
|
27
|
+
* WebGLBackend options.
|
|
28
|
+
*
|
|
29
|
+
* @typedef {Object} WebGLBackend~Options
|
|
30
|
+
* @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
|
|
31
|
+
* @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
|
|
32
|
+
* @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
|
|
33
|
+
* @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
|
|
34
|
+
* @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
|
|
35
|
+
* @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
|
|
36
|
+
* @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.
|
|
37
|
+
* @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.
|
|
38
|
+
* @property {WebGL2RenderingContext} [context=undefined] - A WebGL 2 rendering context.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Constructs a new WebGPU backend.
|
|
43
|
+
*
|
|
44
|
+
* @param {WebGLBackend~Options} [parameters] - The configuration parameter.
|
|
45
|
+
*/
|
|
21
46
|
constructor( parameters = {} ) {
|
|
22
47
|
|
|
23
48
|
super( parameters );
|
|
24
49
|
|
|
50
|
+
/**
|
|
51
|
+
* This flag can be used for type testing.
|
|
52
|
+
*
|
|
53
|
+
* @type {boolean}
|
|
54
|
+
* @readonly
|
|
55
|
+
* @default true
|
|
56
|
+
*/
|
|
25
57
|
this.isWebGLBackend = true;
|
|
26
58
|
|
|
59
|
+
/**
|
|
60
|
+
* A reference to a backend module holding shader attribute-related
|
|
61
|
+
* utility functions.
|
|
62
|
+
*
|
|
63
|
+
* @type {?WebGLAttributeUtils}
|
|
64
|
+
* @default null
|
|
65
|
+
*/
|
|
66
|
+
this.attributeUtils = null;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* A reference to a backend module holding extension-related
|
|
70
|
+
* utility functions.
|
|
71
|
+
*
|
|
72
|
+
* @type {?WebGLExtensions}
|
|
73
|
+
* @default null
|
|
74
|
+
*/
|
|
75
|
+
this.extensions = null;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* A reference to a backend module holding capability-related
|
|
79
|
+
* utility functions.
|
|
80
|
+
*
|
|
81
|
+
* @type {?WebGLCapabilities}
|
|
82
|
+
* @default null
|
|
83
|
+
*/
|
|
84
|
+
this.capabilities = null;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* A reference to a backend module holding texture-related
|
|
88
|
+
* utility functions.
|
|
89
|
+
*
|
|
90
|
+
* @type {?WebGLTextureUtils}
|
|
91
|
+
* @default null
|
|
92
|
+
*/
|
|
93
|
+
this.textureUtils = null;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* A reference to a backend module holding renderer-related
|
|
97
|
+
* utility functions.
|
|
98
|
+
*
|
|
99
|
+
* @type {?WebGLBufferRenderer}
|
|
100
|
+
* @default null
|
|
101
|
+
*/
|
|
102
|
+
this.bufferRenderer = null;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* A reference to the rendering context.
|
|
106
|
+
*
|
|
107
|
+
* @type {?WebGL2RenderingContext}
|
|
108
|
+
* @default null
|
|
109
|
+
*/
|
|
110
|
+
this.gl = null;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* A reference to a backend module holding state-related
|
|
114
|
+
* utility functions.
|
|
115
|
+
*
|
|
116
|
+
* @type {?WebGLState}
|
|
117
|
+
* @default null
|
|
118
|
+
*/
|
|
119
|
+
this.state = null;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* A reference to a backend module holding common
|
|
123
|
+
* utility functions.
|
|
124
|
+
*
|
|
125
|
+
* @type {?WebGLUtils}
|
|
126
|
+
* @default null
|
|
127
|
+
*/
|
|
128
|
+
this.utils = null;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Dictionary for caching VAOs.
|
|
132
|
+
*
|
|
133
|
+
* @type {Object<string,WebGLVertexArrayObject>}
|
|
134
|
+
*/
|
|
135
|
+
this.vaoCache = {};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Dictionary for caching transform feedback objects.
|
|
139
|
+
*
|
|
140
|
+
* @type {Object<string,WebGLTransformFeedback>}
|
|
141
|
+
*/
|
|
142
|
+
this.transformFeedbackCache = {};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Controls if `gl.RASTERIZER_DISCARD` should be enabled or not.
|
|
146
|
+
* Only relevant when using compute shaders.
|
|
147
|
+
*
|
|
148
|
+
* @type {boolean}
|
|
149
|
+
* @default false
|
|
150
|
+
*/
|
|
151
|
+
this.discard = false;
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* A reference to the `EXT_disjoint_timer_query_webgl2` extension. `null` if the
|
|
155
|
+
* device does not support the extension.
|
|
156
|
+
*
|
|
157
|
+
* @type {?EXTDisjointTimerQueryWebGL2}
|
|
158
|
+
* @default null
|
|
159
|
+
*/
|
|
160
|
+
this.disjoint = null;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* A reference to the `KHR_parallel_shader_compile` extension. `null` if the
|
|
164
|
+
* device does not support the extension.
|
|
165
|
+
*
|
|
166
|
+
* @type {?KHRParallelShaderCompile}
|
|
167
|
+
* @default null
|
|
168
|
+
*/
|
|
169
|
+
this.parallel = null;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* A reference to the current render context.
|
|
173
|
+
*
|
|
174
|
+
* @private
|
|
175
|
+
* @type {RenderContext}
|
|
176
|
+
* @default null
|
|
177
|
+
*/
|
|
178
|
+
this._currentContext = null;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* A unique collection of bindings.
|
|
182
|
+
*
|
|
183
|
+
* @private
|
|
184
|
+
* @type {WeakSet<Array<BindGroup>>}
|
|
185
|
+
*/
|
|
186
|
+
this._knownBindings = new WeakSet();
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Whether the device supports framebuffers invalidation or not.
|
|
190
|
+
*
|
|
191
|
+
* @private
|
|
192
|
+
* @type {boolean}
|
|
193
|
+
*/
|
|
194
|
+
this._supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* The target framebuffer when rendering with
|
|
198
|
+
* the WebXR device API.
|
|
199
|
+
*
|
|
200
|
+
* @private
|
|
201
|
+
* @type {?WebGLFramebuffer}
|
|
202
|
+
* @default null
|
|
203
|
+
*/
|
|
204
|
+
this._xrFramebuffer = null;
|
|
205
|
+
|
|
27
206
|
}
|
|
28
207
|
|
|
208
|
+
/**
|
|
209
|
+
* Initializes the backend so it is ready for usage.
|
|
210
|
+
*
|
|
211
|
+
* @param {Renderer} renderer - The renderer.
|
|
212
|
+
*/
|
|
29
213
|
init( renderer ) {
|
|
30
214
|
|
|
31
215
|
super.init( renderer );
|
|
@@ -34,7 +218,33 @@ class WebGLBackend extends Backend {
|
|
|
34
218
|
|
|
35
219
|
const parameters = this.parameters;
|
|
36
220
|
|
|
37
|
-
const
|
|
221
|
+
const contextAttributes = {
|
|
222
|
+
antialias: renderer.currentSamples > 0,
|
|
223
|
+
alpha: true, // always true for performance reasons
|
|
224
|
+
depth: renderer.depth,
|
|
225
|
+
stencil: renderer.stencil
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
const glContext = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgl2', contextAttributes );
|
|
229
|
+
|
|
230
|
+
function onContextLost( event ) {
|
|
231
|
+
|
|
232
|
+
event.preventDefault();
|
|
233
|
+
|
|
234
|
+
const contextLossInfo = {
|
|
235
|
+
api: 'WebGL',
|
|
236
|
+
message: event.statusMessage || 'Unknown reason',
|
|
237
|
+
reason: null,
|
|
238
|
+
originalEvent: event
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
renderer.onDeviceLost( contextLossInfo );
|
|
242
|
+
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
this._onContextLost = onContextLost;
|
|
246
|
+
|
|
247
|
+
renderer.domElement.addEventListener( 'webglcontextlost', onContextLost, false );
|
|
38
248
|
|
|
39
249
|
this.gl = glContext;
|
|
40
250
|
|
|
@@ -47,11 +257,6 @@ class WebGLBackend extends Backend {
|
|
|
47
257
|
this.state = new WebGLState( this );
|
|
48
258
|
this.utils = new WebGLUtils( this );
|
|
49
259
|
|
|
50
|
-
this.vaoCache = {};
|
|
51
|
-
this.transformFeedbackCache = {};
|
|
52
|
-
this.discard = false;
|
|
53
|
-
this.trackTimestamp = ( parameters.trackTimestamp === true );
|
|
54
|
-
|
|
55
260
|
this.extensions.get( 'EXT_color_buffer_float' );
|
|
56
261
|
this.extensions.get( 'WEBGL_clip_cull_distance' );
|
|
57
262
|
this.extensions.get( 'OES_texture_float_linear' );
|
|
@@ -59,158 +264,213 @@ class WebGLBackend extends Backend {
|
|
|
59
264
|
this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
|
|
60
265
|
this.extensions.get( 'WEBGL_render_shared_exponent' );
|
|
61
266
|
this.extensions.get( 'WEBGL_multi_draw' );
|
|
267
|
+
this.extensions.get( 'OVR_multiview2' );
|
|
268
|
+
this.extensions.get( 'EXT_clip_control' );
|
|
62
269
|
|
|
63
270
|
this.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );
|
|
64
271
|
this.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );
|
|
272
|
+
this.drawBuffersIndexedExt = this.extensions.get( 'OES_draw_buffers_indexed' );
|
|
65
273
|
|
|
66
|
-
this.
|
|
274
|
+
if ( parameters.reversedDepthBuffer === true && this.extensions.has( 'EXT_clip_control' ) ) {
|
|
275
|
+
|
|
276
|
+
this.state.setReversedDepth( true );
|
|
277
|
+
|
|
278
|
+
}
|
|
67
279
|
|
|
68
280
|
}
|
|
69
281
|
|
|
282
|
+
/**
|
|
283
|
+
* The coordinate system of the backend.
|
|
284
|
+
*
|
|
285
|
+
* @type {number}
|
|
286
|
+
* @readonly
|
|
287
|
+
*/
|
|
70
288
|
get coordinateSystem() {
|
|
71
289
|
|
|
72
290
|
return WebGLCoordinateSystem;
|
|
73
291
|
|
|
74
292
|
}
|
|
75
293
|
|
|
294
|
+
/**
|
|
295
|
+
* This method performs a readback operation by moving buffer data from
|
|
296
|
+
* a storage buffer attribute from the GPU to the CPU.
|
|
297
|
+
*
|
|
298
|
+
* @async
|
|
299
|
+
* @param {StorageBufferAttribute} attribute - The storage buffer attribute.
|
|
300
|
+
* @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.
|
|
301
|
+
*/
|
|
76
302
|
async getArrayBufferAsync( attribute ) {
|
|
77
303
|
|
|
78
304
|
return await this.attributeUtils.getArrayBufferAsync( attribute );
|
|
79
305
|
|
|
80
306
|
}
|
|
81
307
|
|
|
308
|
+
/**
|
|
309
|
+
* Ensures the backend is XR compatible.
|
|
310
|
+
*
|
|
311
|
+
* @async
|
|
312
|
+
* @return {Promise} A Promise that resolve when the renderer is XR compatible.
|
|
313
|
+
*/
|
|
314
|
+
async makeXRCompatible() {
|
|
82
315
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
86
|
-
|
|
87
|
-
const renderContextData = this.get( renderContext );
|
|
316
|
+
const attributes = this.gl.getContextAttributes();
|
|
88
317
|
|
|
89
|
-
if (
|
|
318
|
+
if ( attributes.xrCompatible !== true ) {
|
|
90
319
|
|
|
91
|
-
|
|
92
|
-
renderContextData.queryQueue.push( renderContext );
|
|
93
|
-
return;
|
|
320
|
+
await this.gl.makeXRCompatible();
|
|
94
321
|
|
|
95
322
|
}
|
|
96
323
|
|
|
97
|
-
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Sets the XR rendering destination.
|
|
327
|
+
*
|
|
328
|
+
* @param {WebGLFramebuffer} xrFramebuffer - The XR framebuffer.
|
|
329
|
+
*/
|
|
330
|
+
setXRTarget( xrFramebuffer ) {
|
|
98
331
|
|
|
99
|
-
|
|
100
|
-
renderContextData.activeQuery = null;
|
|
332
|
+
this._xrFramebuffer = xrFramebuffer;
|
|
101
333
|
|
|
102
|
-
|
|
334
|
+
}
|
|
103
335
|
|
|
104
|
-
|
|
336
|
+
/**
|
|
337
|
+
* Configures the given XR render target with external textures.
|
|
338
|
+
*
|
|
339
|
+
* This method is only relevant when using the WebXR Layers API.
|
|
340
|
+
*
|
|
341
|
+
* @param {XRRenderTarget} renderTarget - The XR render target.
|
|
342
|
+
* @param {WebGLTexture} colorTexture - A native color texture.
|
|
343
|
+
* @param {?WebGLTexture} [depthTexture=null] - A native depth texture.
|
|
344
|
+
*/
|
|
345
|
+
setXRRenderTargetTextures( renderTarget, colorTexture, depthTexture = null ) {
|
|
105
346
|
|
|
106
|
-
|
|
347
|
+
const gl = this.gl;
|
|
107
348
|
|
|
108
|
-
|
|
109
|
-
this.queryRunning = true;
|
|
349
|
+
this.set( renderTarget.texture, { textureGPU: colorTexture, glInternalFormat: gl.RGBA8 } ); // see #24698 why RGBA8 and not SRGB8_ALPHA8 is used
|
|
110
350
|
|
|
111
|
-
|
|
351
|
+
if ( depthTexture !== null ) {
|
|
112
352
|
|
|
113
|
-
|
|
353
|
+
const glInternalFormat = renderTarget.stencilBuffer ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;
|
|
114
354
|
|
|
115
|
-
|
|
355
|
+
this.set( renderTarget.depthTexture, { textureGPU: depthTexture, glInternalFormat: glInternalFormat } );
|
|
116
356
|
|
|
117
|
-
|
|
357
|
+
// The multisample_render_to_texture extension doesn't work properly if there
|
|
358
|
+
// are midframe flushes and an external depth texture.
|
|
359
|
+
if ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {
|
|
118
360
|
|
|
119
|
-
|
|
361
|
+
warn( 'WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );
|
|
120
362
|
|
|
121
|
-
|
|
363
|
+
}
|
|
122
364
|
|
|
123
|
-
|
|
365
|
+
renderTarget._autoAllocateDepthBuffer = false;
|
|
124
366
|
|
|
125
|
-
|
|
367
|
+
}
|
|
126
368
|
|
|
127
|
-
|
|
128
|
-
renderContextData.gpuQueries.push( { query: renderContextData.activeQuery } );
|
|
129
|
-
renderContextData.activeQuery = null;
|
|
130
|
-
this.queryRunning = false;
|
|
369
|
+
}
|
|
131
370
|
|
|
132
|
-
|
|
371
|
+
/**
|
|
372
|
+
* Inits a time stamp query for the given render context.
|
|
373
|
+
*
|
|
374
|
+
* @param {string} type - The type of the timestamp query.
|
|
375
|
+
* @param {string} uid - A unique identifier for the timestamp query.
|
|
376
|
+
*/
|
|
377
|
+
initTimestampQuery( type, uid ) {
|
|
133
378
|
|
|
134
|
-
|
|
135
|
-
this.initTimestampQuery( nextRenderContext );
|
|
379
|
+
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
136
380
|
|
|
137
|
-
|
|
381
|
+
if ( ! this.timestampQueryPool[ type ] ) {
|
|
382
|
+
|
|
383
|
+
// TODO: Variable maxQueries?
|
|
384
|
+
this.timestampQueryPool[ type ] = new WebGLTimestampQueryPool( this.gl, type, 2048 );
|
|
138
385
|
|
|
139
386
|
}
|
|
140
387
|
|
|
141
|
-
|
|
388
|
+
const timestampQueryPool = this.timestampQueryPool[ type ];
|
|
142
389
|
|
|
143
|
-
|
|
390
|
+
const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
|
|
144
391
|
|
|
145
|
-
if (
|
|
392
|
+
if ( baseOffset !== null ) {
|
|
146
393
|
|
|
147
|
-
|
|
394
|
+
timestampQueryPool.beginQuery( uid );
|
|
148
395
|
|
|
149
|
-
|
|
396
|
+
}
|
|
150
397
|
|
|
151
|
-
|
|
398
|
+
}
|
|
152
399
|
|
|
153
|
-
|
|
154
|
-
const available = this.gl.getQueryParameter( queryInfo.query, this.gl.QUERY_RESULT_AVAILABLE );
|
|
155
|
-
const disjoint = this.gl.getParameter( this.disjoint.GPU_DISJOINT_EXT );
|
|
400
|
+
// timestamp utils
|
|
156
401
|
|
|
157
|
-
|
|
402
|
+
/**
|
|
403
|
+
* Prepares the timestamp buffer.
|
|
404
|
+
*
|
|
405
|
+
* @param {string} type - The type of the timestamp query.
|
|
406
|
+
* @param {string} uid - A unique identifier for the timestamp query.
|
|
407
|
+
*/
|
|
408
|
+
prepareTimestampBuffer( type, uid ) {
|
|
158
409
|
|
|
159
|
-
|
|
160
|
-
const duration = Number( elapsed ) / 1000000; // Convert nanoseconds to milliseconds
|
|
161
|
-
this.gl.deleteQuery( queryInfo.query );
|
|
162
|
-
renderContextData.gpuQueries.splice( i, 1 ); // Remove the processed query
|
|
163
|
-
i --;
|
|
164
|
-
this.renderer.info.updateTimestamp( type, duration );
|
|
410
|
+
if ( ! this.disjoint || ! this.trackTimestamp ) return;
|
|
165
411
|
|
|
166
|
-
|
|
412
|
+
const timestampQueryPool = this.timestampQueryPool[ type ];
|
|
167
413
|
|
|
168
|
-
|
|
414
|
+
timestampQueryPool.endQuery( uid );
|
|
169
415
|
|
|
170
416
|
}
|
|
171
417
|
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Returns the backend's rendering context.
|
|
421
|
+
*
|
|
422
|
+
* @return {WebGL2RenderingContext} The rendering context.
|
|
423
|
+
*/
|
|
172
424
|
getContext() {
|
|
173
425
|
|
|
174
426
|
return this.gl;
|
|
175
427
|
|
|
176
428
|
}
|
|
177
429
|
|
|
430
|
+
/**
|
|
431
|
+
* This method is executed at the beginning of a render call and prepares
|
|
432
|
+
* the WebGL state for upcoming render calls
|
|
433
|
+
*
|
|
434
|
+
* @param {RenderContext} renderContext - The render context.
|
|
435
|
+
*/
|
|
178
436
|
beginRender( renderContext ) {
|
|
179
437
|
|
|
180
|
-
const {
|
|
438
|
+
const { state } = this;
|
|
181
439
|
const renderContextData = this.get( renderContext );
|
|
182
440
|
|
|
183
441
|
//
|
|
184
442
|
|
|
185
|
-
|
|
443
|
+
if ( renderContext.viewport ) {
|
|
186
444
|
|
|
187
|
-
|
|
445
|
+
this.updateViewport( renderContext );
|
|
188
446
|
|
|
189
|
-
|
|
190
|
-
this._currentContext = renderContext;
|
|
447
|
+
} else {
|
|
191
448
|
|
|
192
|
-
|
|
449
|
+
const { width, height } = this.getDrawingBufferSize();
|
|
450
|
+
state.viewport( 0, 0, width, height );
|
|
193
451
|
|
|
194
|
-
|
|
452
|
+
}
|
|
195
453
|
|
|
196
|
-
|
|
197
|
-
if ( renderContext.viewport ) {
|
|
454
|
+
if ( renderContext.scissor ) {
|
|
198
455
|
|
|
199
|
-
this.
|
|
456
|
+
this.updateScissor( renderContext );
|
|
200
457
|
|
|
201
458
|
} else {
|
|
202
459
|
|
|
203
|
-
|
|
460
|
+
const { width, height } = this.getDrawingBufferSize();
|
|
461
|
+
state.scissor( 0, 0, width, height );
|
|
204
462
|
|
|
205
463
|
}
|
|
206
464
|
|
|
207
|
-
|
|
465
|
+
//
|
|
208
466
|
|
|
209
|
-
|
|
467
|
+
this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
|
|
210
468
|
|
|
211
|
-
|
|
469
|
+
renderContextData.previousContext = this._currentContext;
|
|
470
|
+
this._currentContext = renderContext;
|
|
212
471
|
|
|
213
|
-
|
|
472
|
+
this._setFramebuffer( renderContext );
|
|
473
|
+
this.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );
|
|
214
474
|
|
|
215
475
|
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
216
476
|
|
|
@@ -230,12 +490,20 @@ class WebGLBackend extends Backend {
|
|
|
230
490
|
|
|
231
491
|
}
|
|
232
492
|
|
|
493
|
+
/**
|
|
494
|
+
* This method is executed at the end of a render call and finalizes work
|
|
495
|
+
* after draw calls.
|
|
496
|
+
*
|
|
497
|
+
* @param {RenderContext} renderContext - The render context.
|
|
498
|
+
*/
|
|
233
499
|
finishRender( renderContext ) {
|
|
234
500
|
|
|
235
501
|
const { gl, state } = this;
|
|
236
502
|
const renderContextData = this.get( renderContext );
|
|
237
503
|
const previousContext = renderContextData.previousContext;
|
|
238
504
|
|
|
505
|
+
state.resetVertexState();
|
|
506
|
+
|
|
239
507
|
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
240
508
|
|
|
241
509
|
if ( occlusionQueryCount > 0 ) {
|
|
@@ -270,72 +538,47 @@ class WebGLBackend extends Backend {
|
|
|
270
538
|
|
|
271
539
|
this._currentContext = previousContext;
|
|
272
540
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
const renderTargetContextData = this.get( renderContext.renderTarget );
|
|
276
|
-
|
|
277
|
-
const { samples } = renderContext.renderTarget;
|
|
278
|
-
|
|
279
|
-
if ( samples > 0 ) {
|
|
280
|
-
|
|
281
|
-
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
282
|
-
|
|
283
|
-
const mask = gl.COLOR_BUFFER_BIT;
|
|
284
|
-
|
|
285
|
-
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
286
|
-
|
|
287
|
-
const textures = renderContext.textures;
|
|
288
|
-
|
|
289
|
-
state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
|
|
290
|
-
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
291
|
-
|
|
292
|
-
for ( let i = 0; i < textures.length; i ++ ) {
|
|
293
|
-
|
|
294
|
-
// TODO Add support for MRT
|
|
295
|
-
|
|
296
|
-
if ( renderContext.scissor ) {
|
|
297
|
-
|
|
298
|
-
const { x, y, width, height } = renderContext.scissorValue;
|
|
541
|
+
this._resolveRenderTarget( renderContext );
|
|
299
542
|
|
|
300
|
-
|
|
543
|
+
if ( previousContext !== null ) {
|
|
301
544
|
|
|
302
|
-
|
|
303
|
-
gl.invalidateSubFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray, x, viewY, width, height );
|
|
545
|
+
this._setFramebuffer( previousContext );
|
|
304
546
|
|
|
305
|
-
|
|
547
|
+
if ( previousContext.viewport ) {
|
|
306
548
|
|
|
307
|
-
|
|
308
|
-
gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
|
|
549
|
+
this.updateViewport( previousContext );
|
|
309
550
|
|
|
310
|
-
|
|
551
|
+
} else {
|
|
311
552
|
|
|
312
|
-
}
|
|
553
|
+
const { width, height } = this.getDrawingBufferSize();
|
|
554
|
+
state.viewport( 0, 0, width, height );
|
|
313
555
|
|
|
314
556
|
}
|
|
315
557
|
|
|
558
|
+
if ( previousContext.scissor ) {
|
|
316
559
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
if ( previousContext !== null ) {
|
|
320
|
-
|
|
321
|
-
this._setFramebuffer( previousContext );
|
|
322
|
-
|
|
323
|
-
if ( previousContext.viewport ) {
|
|
324
|
-
|
|
325
|
-
this.updateViewport( previousContext );
|
|
560
|
+
this.updateScissor( previousContext );
|
|
326
561
|
|
|
327
562
|
} else {
|
|
328
563
|
|
|
329
|
-
|
|
564
|
+
const { width, height } = this.getDrawingBufferSize();
|
|
565
|
+
state.scissor( 0, 0, width, height );
|
|
330
566
|
|
|
331
567
|
}
|
|
332
568
|
|
|
333
569
|
}
|
|
334
570
|
|
|
335
|
-
this.prepareTimestampBuffer( renderContext );
|
|
571
|
+
this.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );
|
|
336
572
|
|
|
337
573
|
}
|
|
338
574
|
|
|
575
|
+
/**
|
|
576
|
+
* This method processes the result of occlusion queries and writes it
|
|
577
|
+
* into render context data.
|
|
578
|
+
*
|
|
579
|
+
* @async
|
|
580
|
+
* @param {RenderContext} renderContext - The render context.
|
|
581
|
+
*/
|
|
339
582
|
resolveOccludedAsync( renderContext ) {
|
|
340
583
|
|
|
341
584
|
const renderContextData = this.get( renderContext );
|
|
@@ -365,7 +608,7 @@ class WebGLBackend extends Backend {
|
|
|
365
608
|
|
|
366
609
|
if ( gl.getQueryParameter( query, gl.QUERY_RESULT_AVAILABLE ) ) {
|
|
367
610
|
|
|
368
|
-
if ( gl.getQueryParameter( query, gl.QUERY_RESULT )
|
|
611
|
+
if ( gl.getQueryParameter( query, gl.QUERY_RESULT ) === 0 ) occluded.add( currentOcclusionQueryObjects[ i ] );
|
|
369
612
|
|
|
370
613
|
currentOcclusionQueries[ i ] = null;
|
|
371
614
|
gl.deleteQuery( query );
|
|
@@ -394,6 +637,14 @@ class WebGLBackend extends Backend {
|
|
|
394
637
|
|
|
395
638
|
}
|
|
396
639
|
|
|
640
|
+
/**
|
|
641
|
+
* Returns `true` if the given 3D object is fully occluded by other
|
|
642
|
+
* 3D objects in the scene.
|
|
643
|
+
*
|
|
644
|
+
* @param {RenderContext} renderContext - The render context.
|
|
645
|
+
* @param {Object3D} object - The 3D object to test.
|
|
646
|
+
* @return {boolean} Whether the 3D object is fully occluded or not.
|
|
647
|
+
*/
|
|
397
648
|
isOccluded( renderContext, object ) {
|
|
398
649
|
|
|
399
650
|
const renderContextData = this.get( renderContext );
|
|
@@ -402,40 +653,90 @@ class WebGLBackend extends Backend {
|
|
|
402
653
|
|
|
403
654
|
}
|
|
404
655
|
|
|
656
|
+
/**
|
|
657
|
+
* Updates the viewport with the values from the given render context.
|
|
658
|
+
*
|
|
659
|
+
* @param {RenderContext} renderContext - The render context.
|
|
660
|
+
*/
|
|
405
661
|
updateViewport( renderContext ) {
|
|
406
662
|
|
|
407
|
-
const
|
|
663
|
+
const { state } = this;
|
|
408
664
|
const { x, y, width, height } = renderContext.viewportValue;
|
|
409
665
|
|
|
410
|
-
|
|
666
|
+
state.viewport( x, renderContext.height - height - y, width, height );
|
|
411
667
|
|
|
412
668
|
}
|
|
413
669
|
|
|
414
|
-
|
|
670
|
+
/**
|
|
671
|
+
* Updates the scissor with the values from the given render context.
|
|
672
|
+
*
|
|
673
|
+
* @param {RenderContext} renderContext - The render context.
|
|
674
|
+
*/
|
|
675
|
+
updateScissor( renderContext ) {
|
|
415
676
|
|
|
416
|
-
const
|
|
677
|
+
const { state } = this;
|
|
678
|
+
const { x, y, width, height } = renderContext.scissorValue;
|
|
417
679
|
|
|
418
|
-
|
|
680
|
+
state.scissor( x, renderContext.height - height - y, width, height );
|
|
419
681
|
|
|
420
|
-
|
|
682
|
+
}
|
|
421
683
|
|
|
422
|
-
|
|
684
|
+
/**
|
|
685
|
+
* Defines the scissor test.
|
|
686
|
+
*
|
|
687
|
+
* @param {boolean} boolean - Whether the scissor test should be enabled or not.
|
|
688
|
+
*/
|
|
689
|
+
setScissorTest( boolean ) {
|
|
423
690
|
|
|
424
|
-
|
|
691
|
+
const state = this.state;
|
|
425
692
|
|
|
426
|
-
|
|
693
|
+
state.setScissorTest( boolean );
|
|
427
694
|
|
|
428
695
|
}
|
|
429
696
|
|
|
430
|
-
|
|
697
|
+
/**
|
|
698
|
+
* Returns the clear color and alpha into a single
|
|
699
|
+
* color object.
|
|
700
|
+
*
|
|
701
|
+
* @return {Color4} The clear color.
|
|
702
|
+
*/
|
|
703
|
+
getClearColor() {
|
|
431
704
|
|
|
432
|
-
const
|
|
705
|
+
const clearColor = super.getClearColor();
|
|
706
|
+
|
|
707
|
+
// Since the canvas is always created with alpha: true,
|
|
708
|
+
// WebGL must always premultiply the clear color.
|
|
709
|
+
|
|
710
|
+
clearColor.r *= clearColor.a;
|
|
711
|
+
clearColor.g *= clearColor.a;
|
|
712
|
+
clearColor.b *= clearColor.a;
|
|
713
|
+
|
|
714
|
+
return clearColor;
|
|
715
|
+
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
/**
|
|
719
|
+
* Performs a clear operation.
|
|
720
|
+
*
|
|
721
|
+
* @param {boolean} color - Whether the color buffer should be cleared or not.
|
|
722
|
+
* @param {boolean} depth - Whether the depth buffer should be cleared or not.
|
|
723
|
+
* @param {boolean} stencil - Whether the stencil buffer should be cleared or not.
|
|
724
|
+
* @param {?Object} [descriptor=null] - The render context of the current set render target.
|
|
725
|
+
* @param {boolean} [setFrameBuffer=true] - Controls whether the intermediate framebuffer should be set or not.
|
|
726
|
+
* @param {boolean} [resolveRenderTarget=true] - Controls whether an active render target should be resolved
|
|
727
|
+
* or not. Only relevant for explicit clears.
|
|
728
|
+
*/
|
|
729
|
+
clear( color, depth, stencil, descriptor = null, setFrameBuffer = true, resolveRenderTarget = true ) {
|
|
730
|
+
|
|
731
|
+
const { gl, renderer } = this;
|
|
433
732
|
|
|
434
733
|
if ( descriptor === null ) {
|
|
435
734
|
|
|
735
|
+
const clearColor = this.getClearColor();
|
|
736
|
+
|
|
436
737
|
descriptor = {
|
|
437
738
|
textures: null,
|
|
438
|
-
clearColorValue:
|
|
739
|
+
clearColorValue: clearColor
|
|
439
740
|
};
|
|
440
741
|
|
|
441
742
|
}
|
|
@@ -450,13 +751,20 @@ class WebGLBackend extends Backend {
|
|
|
450
751
|
|
|
451
752
|
if ( clear !== 0 ) {
|
|
452
753
|
|
|
453
|
-
|
|
754
|
+
let clearColor;
|
|
454
755
|
|
|
455
|
-
|
|
756
|
+
if ( descriptor.clearColorValue ) {
|
|
456
757
|
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
758
|
+
clearColor = descriptor.clearColorValue;
|
|
759
|
+
|
|
760
|
+
} else {
|
|
761
|
+
|
|
762
|
+
clearColor = this.getClearColor();
|
|
763
|
+
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
const clearDepth = renderer.getClearDepth();
|
|
767
|
+
const clearStencil = renderer.getClearStencil();
|
|
460
768
|
|
|
461
769
|
if ( depth ) this.state.setDepthMask( true );
|
|
462
770
|
|
|
@@ -473,7 +781,15 @@ class WebGLBackend extends Backend {
|
|
|
473
781
|
|
|
474
782
|
for ( let i = 0; i < descriptor.textures.length; i ++ ) {
|
|
475
783
|
|
|
476
|
-
|
|
784
|
+
if ( i === 0 ) {
|
|
785
|
+
|
|
786
|
+
gl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );
|
|
787
|
+
|
|
788
|
+
} else {
|
|
789
|
+
|
|
790
|
+
gl.clearBufferfv( gl.COLOR, i, [ 0, 0, 0, 1 ] );
|
|
791
|
+
|
|
792
|
+
}
|
|
477
793
|
|
|
478
794
|
}
|
|
479
795
|
|
|
@@ -481,58 +797,77 @@ class WebGLBackend extends Backend {
|
|
|
481
797
|
|
|
482
798
|
if ( depth && stencil ) {
|
|
483
799
|
|
|
484
|
-
gl.clearBufferfi( gl.DEPTH_STENCIL, 0,
|
|
800
|
+
gl.clearBufferfi( gl.DEPTH_STENCIL, 0, clearDepth, clearStencil );
|
|
485
801
|
|
|
486
802
|
} else if ( depth ) {
|
|
487
803
|
|
|
488
|
-
gl.clearBufferfv( gl.DEPTH, 0, [
|
|
804
|
+
gl.clearBufferfv( gl.DEPTH, 0, [ clearDepth ] );
|
|
489
805
|
|
|
490
806
|
} else if ( stencil ) {
|
|
491
807
|
|
|
492
|
-
gl.clearBufferiv( gl.STENCIL, 0, [
|
|
808
|
+
gl.clearBufferiv( gl.STENCIL, 0, [ clearStencil ] );
|
|
493
809
|
|
|
494
810
|
}
|
|
495
811
|
|
|
812
|
+
if ( setFrameBuffer && resolveRenderTarget ) this._resolveRenderTarget( descriptor );
|
|
813
|
+
|
|
496
814
|
}
|
|
497
815
|
|
|
498
816
|
}
|
|
499
817
|
|
|
500
818
|
}
|
|
501
819
|
|
|
820
|
+
/**
|
|
821
|
+
* This method is executed at the beginning of a compute call and
|
|
822
|
+
* prepares the state for upcoming compute tasks.
|
|
823
|
+
*
|
|
824
|
+
* @param {Node|Array<Node>} computeGroup - The compute node(s).
|
|
825
|
+
*/
|
|
502
826
|
beginCompute( computeGroup ) {
|
|
503
827
|
|
|
504
828
|
const { state, gl } = this;
|
|
505
829
|
|
|
830
|
+
//
|
|
831
|
+
|
|
506
832
|
state.bindFramebuffer( gl.FRAMEBUFFER, null );
|
|
507
|
-
this.initTimestampQuery( computeGroup );
|
|
833
|
+
this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
|
|
508
834
|
|
|
509
835
|
}
|
|
510
836
|
|
|
511
|
-
|
|
837
|
+
/**
|
|
838
|
+
* Executes a compute command for the given compute node.
|
|
839
|
+
*
|
|
840
|
+
* @param {Node|Array<Node>} computeGroup - The group of compute nodes of a compute call. Can be a single compute node.
|
|
841
|
+
* @param {Node} computeNode - The compute node.
|
|
842
|
+
* @param {Array<BindGroup>} bindings - The bindings.
|
|
843
|
+
* @param {ComputePipeline} pipeline - The compute pipeline.
|
|
844
|
+
* @param {?number} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.
|
|
845
|
+
*/
|
|
846
|
+
compute( computeGroup, computeNode, bindings, pipeline, count = null ) {
|
|
512
847
|
|
|
513
848
|
const { state, gl } = this;
|
|
514
849
|
|
|
515
|
-
if (
|
|
850
|
+
if ( this.discard === false ) {
|
|
516
851
|
|
|
517
852
|
// required here to handle async behaviour of render.compute()
|
|
518
|
-
|
|
853
|
+
state.enable( gl.RASTERIZER_DISCARD );
|
|
519
854
|
this.discard = true;
|
|
520
855
|
|
|
521
856
|
}
|
|
522
857
|
|
|
523
858
|
const { programGPU, transformBuffers, attributes } = this.get( pipeline );
|
|
524
859
|
|
|
525
|
-
const vaoKey = this._getVaoKey(
|
|
860
|
+
const vaoKey = this._getVaoKey( attributes );
|
|
526
861
|
|
|
527
862
|
const vaoGPU = this.vaoCache[ vaoKey ];
|
|
528
863
|
|
|
529
864
|
if ( vaoGPU === undefined ) {
|
|
530
865
|
|
|
531
|
-
this._createVao(
|
|
866
|
+
this.vaoCache[ vaoKey ] = this._createVao( attributes );
|
|
532
867
|
|
|
533
868
|
} else {
|
|
534
869
|
|
|
535
|
-
|
|
870
|
+
state.setVertexState( vaoGPU );
|
|
536
871
|
|
|
537
872
|
}
|
|
538
873
|
|
|
@@ -545,13 +880,29 @@ class WebGLBackend extends Backend {
|
|
|
545
880
|
gl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );
|
|
546
881
|
gl.beginTransformFeedback( gl.POINTS );
|
|
547
882
|
|
|
883
|
+
count = ( count !== null ) ? count : computeNode.count;
|
|
884
|
+
|
|
885
|
+
if ( Array.isArray( count ) ) {
|
|
886
|
+
|
|
887
|
+
warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not an array.' );
|
|
888
|
+
|
|
889
|
+
count = count[ 0 ];
|
|
890
|
+
|
|
891
|
+
} else if ( count && typeof count === 'object' && count.isIndirectStorageBufferAttribute ) {
|
|
892
|
+
|
|
893
|
+
warnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not IndirectStorageBufferAttribute' );
|
|
894
|
+
|
|
895
|
+
count = computeNode.count;
|
|
896
|
+
|
|
897
|
+
}
|
|
898
|
+
|
|
548
899
|
if ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {
|
|
549
900
|
|
|
550
|
-
gl.drawArraysInstanced( gl.POINTS, 0, 1,
|
|
901
|
+
gl.drawArraysInstanced( gl.POINTS, 0, 1, count );
|
|
551
902
|
|
|
552
903
|
} else {
|
|
553
904
|
|
|
554
|
-
gl.drawArrays( gl.POINTS, 0,
|
|
905
|
+
gl.drawArrays( gl.POINTS, 0, count );
|
|
555
906
|
|
|
556
907
|
}
|
|
557
908
|
|
|
@@ -564,7 +915,7 @@ class WebGLBackend extends Backend {
|
|
|
564
915
|
|
|
565
916
|
const dualAttributeData = transformBuffers[ i ];
|
|
566
917
|
|
|
567
|
-
if ( dualAttributeData.pbo ) {
|
|
918
|
+
if ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {
|
|
568
919
|
|
|
569
920
|
this.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );
|
|
570
921
|
|
|
@@ -577,30 +928,62 @@ class WebGLBackend extends Backend {
|
|
|
577
928
|
|
|
578
929
|
}
|
|
579
930
|
|
|
931
|
+
/**
|
|
932
|
+
* This method is executed at the end of a compute call and
|
|
933
|
+
* finalizes work after compute tasks.
|
|
934
|
+
*
|
|
935
|
+
* @param {Node|Array<Node>} computeGroup - The compute node(s).
|
|
936
|
+
*/
|
|
580
937
|
finishCompute( computeGroup ) {
|
|
581
938
|
|
|
582
|
-
const gl = this
|
|
939
|
+
const { state, gl } = this;
|
|
583
940
|
|
|
584
941
|
this.discard = false;
|
|
585
942
|
|
|
586
|
-
|
|
943
|
+
state.disable( gl.RASTERIZER_DISCARD );
|
|
944
|
+
|
|
945
|
+
this.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );
|
|
946
|
+
|
|
947
|
+
if ( this._currentContext ) {
|
|
948
|
+
|
|
949
|
+
this._setFramebuffer( this._currentContext );
|
|
950
|
+
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
/**
|
|
956
|
+
* Internal to determine if the current render target is a render target array with depth 2D array texture.
|
|
957
|
+
*
|
|
958
|
+
* @param {RenderContext} renderContext - The render context.
|
|
959
|
+
* @return {boolean} Whether the render target is a render target array with depth 2D array texture.
|
|
960
|
+
*
|
|
961
|
+
* @private
|
|
962
|
+
*/
|
|
963
|
+
_isRenderCameraDepthArray( renderContext ) {
|
|
587
964
|
|
|
588
|
-
|
|
965
|
+
return renderContext.depthTexture && renderContext.depthTexture.isArrayTexture && renderContext.camera.isArrayCamera;
|
|
589
966
|
|
|
590
967
|
}
|
|
591
968
|
|
|
969
|
+
/**
|
|
970
|
+
* Executes a draw command for the given render object.
|
|
971
|
+
*
|
|
972
|
+
* @param {RenderObject} renderObject - The render object to draw.
|
|
973
|
+
* @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.
|
|
974
|
+
*/
|
|
592
975
|
draw( renderObject/*, info*/ ) {
|
|
593
976
|
|
|
594
|
-
const { object, pipeline, material, context } = renderObject;
|
|
977
|
+
const { object, pipeline, material, context, hardwareClippingPlanes } = renderObject;
|
|
595
978
|
const { programGPU } = this.get( pipeline );
|
|
596
979
|
|
|
597
980
|
const { gl, state } = this;
|
|
598
981
|
|
|
599
982
|
const contextData = this.get( context );
|
|
600
983
|
|
|
601
|
-
const
|
|
984
|
+
const drawParams = renderObject.getDrawParameters();
|
|
602
985
|
|
|
603
|
-
if (
|
|
986
|
+
if ( drawParams === null ) return;
|
|
604
987
|
|
|
605
988
|
//
|
|
606
989
|
|
|
@@ -608,37 +991,44 @@ class WebGLBackend extends Backend {
|
|
|
608
991
|
|
|
609
992
|
const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
|
|
610
993
|
|
|
611
|
-
state.setMaterial( material, frontFaceCW );
|
|
994
|
+
state.setMaterial( material, frontFaceCW, hardwareClippingPlanes );
|
|
995
|
+
|
|
996
|
+
if ( context.mrt !== null && context.textures !== null ) {
|
|
997
|
+
|
|
998
|
+
state.setMRTBlending( context.textures, context.mrt, material );
|
|
999
|
+
|
|
1000
|
+
}
|
|
612
1001
|
|
|
613
1002
|
state.useProgram( programGPU );
|
|
614
1003
|
|
|
615
|
-
//
|
|
1004
|
+
// vertex state
|
|
616
1005
|
|
|
617
|
-
|
|
1006
|
+
const attributes = renderObject.getAttributes();
|
|
1007
|
+
const attributesData = this.get( attributes );
|
|
1008
|
+
|
|
1009
|
+
let vaoGPU = attributesData.vaoGPU;
|
|
618
1010
|
|
|
619
1011
|
if ( vaoGPU === undefined ) {
|
|
620
1012
|
|
|
621
|
-
const vaoKey = this._getVaoKey(
|
|
1013
|
+
const vaoKey = this._getVaoKey( attributes );
|
|
622
1014
|
|
|
623
1015
|
vaoGPU = this.vaoCache[ vaoKey ];
|
|
624
1016
|
|
|
625
1017
|
if ( vaoGPU === undefined ) {
|
|
626
1018
|
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
( { vaoGPU, staticVao } = this._createVao( renderObject.getIndex(), renderObject.getAttributes() ) );
|
|
1019
|
+
vaoGPU = this._createVao( attributes );
|
|
630
1020
|
|
|
631
|
-
|
|
1021
|
+
this.vaoCache[ vaoKey ] = vaoGPU;
|
|
1022
|
+
attributesData.vaoGPU = vaoGPU;
|
|
632
1023
|
|
|
633
1024
|
}
|
|
634
1025
|
|
|
635
1026
|
}
|
|
636
1027
|
|
|
637
|
-
gl.bindVertexArray( vaoGPU );
|
|
638
|
-
|
|
639
|
-
//
|
|
640
|
-
|
|
641
1028
|
const index = renderObject.getIndex();
|
|
1029
|
+
const indexGPU = ( index !== null ) ? this.get( index ).bufferGPU : null;
|
|
1030
|
+
|
|
1031
|
+
state.setVertexState( vaoGPU, indexGPU );
|
|
642
1032
|
|
|
643
1033
|
//
|
|
644
1034
|
|
|
@@ -693,8 +1083,8 @@ class WebGLBackend extends Backend {
|
|
|
693
1083
|
|
|
694
1084
|
//
|
|
695
1085
|
|
|
696
|
-
const { vertexCount, instanceCount } =
|
|
697
|
-
let { firstVertex } =
|
|
1086
|
+
const { vertexCount, instanceCount } = drawParams;
|
|
1087
|
+
let { firstVertex } = drawParams;
|
|
698
1088
|
|
|
699
1089
|
renderer.object = object;
|
|
700
1090
|
|
|
@@ -713,43 +1103,172 @@ class WebGLBackend extends Backend {
|
|
|
713
1103
|
|
|
714
1104
|
}
|
|
715
1105
|
|
|
716
|
-
|
|
1106
|
+
const draw = () => {
|
|
1107
|
+
|
|
1108
|
+
if ( object.isBatchedMesh ) {
|
|
1109
|
+
|
|
1110
|
+
if ( object._multiDrawInstances !== null ) {
|
|
1111
|
+
|
|
1112
|
+
// @deprecated, r174
|
|
1113
|
+
warnOnce( 'WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
|
|
1114
|
+
renderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );
|
|
717
1115
|
|
|
718
|
-
|
|
1116
|
+
} else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) {
|
|
719
1117
|
|
|
720
|
-
|
|
1118
|
+
warnOnce( 'WebGLBackend: WEBGL_multi_draw not supported.' );
|
|
721
1119
|
|
|
722
|
-
|
|
1120
|
+
} else {
|
|
1121
|
+
|
|
1122
|
+
renderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );
|
|
1123
|
+
|
|
1124
|
+
}
|
|
723
1125
|
|
|
724
|
-
|
|
1126
|
+
} else if ( instanceCount > 1 ) {
|
|
1127
|
+
|
|
1128
|
+
renderer.renderInstances( firstVertex, vertexCount, instanceCount );
|
|
725
1129
|
|
|
726
1130
|
} else {
|
|
727
1131
|
|
|
728
|
-
renderer.
|
|
1132
|
+
renderer.render( firstVertex, vertexCount );
|
|
1133
|
+
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
};
|
|
1137
|
+
|
|
1138
|
+
if ( renderObject.camera.isArrayCamera === true && renderObject.camera.cameras.length > 0 && renderObject.camera.isMultiViewCamera === false ) {
|
|
1139
|
+
|
|
1140
|
+
const cameraData = this.get( renderObject.camera );
|
|
1141
|
+
const cameras = renderObject.camera.cameras;
|
|
1142
|
+
const cameraIndex = renderObject.getBindingGroup( 'cameraIndex' ).bindings[ 0 ];
|
|
1143
|
+
|
|
1144
|
+
if ( cameraData.indexesGPU === undefined || cameraData.indexesGPU.length !== cameras.length ) {
|
|
1145
|
+
|
|
1146
|
+
const data = new Uint32Array( [ 0, 0, 0, 0 ] );
|
|
1147
|
+
const indexesGPU = [];
|
|
1148
|
+
|
|
1149
|
+
for ( let i = 0, len = cameras.length; i < len; i ++ ) {
|
|
1150
|
+
|
|
1151
|
+
const bufferGPU = gl.createBuffer();
|
|
1152
|
+
|
|
1153
|
+
data[ 0 ] = i;
|
|
1154
|
+
|
|
1155
|
+
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1156
|
+
gl.bufferData( gl.UNIFORM_BUFFER, data, gl.STATIC_DRAW );
|
|
1157
|
+
|
|
1158
|
+
indexesGPU.push( bufferGPU );
|
|
1159
|
+
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
cameraData.indexesGPU = indexesGPU; // TODO: Create a global library for this
|
|
1163
|
+
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
const cameraIndexData = this.get( cameraIndex );
|
|
1167
|
+
const pixelRatio = this.renderer.getPixelRatio();
|
|
1168
|
+
|
|
1169
|
+
const renderTarget = this._currentContext.renderTarget;
|
|
1170
|
+
const isRenderCameraDepthArray = this._isRenderCameraDepthArray( this._currentContext );
|
|
1171
|
+
const prevActiveCubeFace = this._currentContext.activeCubeFace;
|
|
1172
|
+
|
|
1173
|
+
if ( isRenderCameraDepthArray ) {
|
|
1174
|
+
|
|
1175
|
+
// Clear the depth texture
|
|
1176
|
+
const textureData = this.get( renderTarget.depthTexture );
|
|
1177
|
+
|
|
1178
|
+
if ( textureData.clearedRenderId !== this.renderer._nodes.nodeFrame.renderId ) {
|
|
1179
|
+
|
|
1180
|
+
textureData.clearedRenderId = this.renderer._nodes.nodeFrame.renderId;
|
|
1181
|
+
|
|
1182
|
+
const { stencilBuffer } = renderTarget;
|
|
1183
|
+
|
|
1184
|
+
for ( let i = 0, len = cameras.length; i < len; i ++ ) {
|
|
1185
|
+
|
|
1186
|
+
this.renderer._activeCubeFace = i;
|
|
1187
|
+
this._currentContext.activeCubeFace = i;
|
|
1188
|
+
|
|
1189
|
+
this._setFramebuffer( this._currentContext );
|
|
1190
|
+
this.clear( false, true, stencilBuffer, this._currentContext, false, false );
|
|
1191
|
+
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
this.renderer._activeCubeFace = prevActiveCubeFace;
|
|
1195
|
+
this._currentContext.activeCubeFace = prevActiveCubeFace;
|
|
1196
|
+
|
|
1197
|
+
}
|
|
729
1198
|
|
|
730
1199
|
}
|
|
731
1200
|
|
|
732
|
-
|
|
1201
|
+
for ( let i = 0, len = cameras.length; i < len; i ++ ) {
|
|
1202
|
+
|
|
1203
|
+
const subCamera = cameras[ i ];
|
|
1204
|
+
|
|
1205
|
+
if ( object.layers.test( subCamera.layers ) ) {
|
|
733
1206
|
|
|
734
|
-
|
|
1207
|
+
if ( isRenderCameraDepthArray ) {
|
|
1208
|
+
|
|
1209
|
+
// Update the active layer
|
|
1210
|
+
this.renderer._activeCubeFace = i;
|
|
1211
|
+
this._currentContext.activeCubeFace = i;
|
|
1212
|
+
|
|
1213
|
+
this._setFramebuffer( this._currentContext );
|
|
1214
|
+
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
const vp = subCamera.viewport;
|
|
1218
|
+
|
|
1219
|
+
if ( vp !== undefined ) {
|
|
1220
|
+
|
|
1221
|
+
const x = vp.x * pixelRatio;
|
|
1222
|
+
const y = vp.y * pixelRatio;
|
|
1223
|
+
const width = vp.width * pixelRatio;
|
|
1224
|
+
const height = vp.height * pixelRatio;
|
|
1225
|
+
|
|
1226
|
+
state.viewport(
|
|
1227
|
+
Math.floor( x ),
|
|
1228
|
+
Math.floor( renderObject.context.height - height - y ),
|
|
1229
|
+
Math.floor( width ),
|
|
1230
|
+
Math.floor( height )
|
|
1231
|
+
);
|
|
1232
|
+
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
state.bindBufferBase( gl.UNIFORM_BUFFER, cameraIndexData.index, cameraData.indexesGPU[ i ] );
|
|
1236
|
+
|
|
1237
|
+
draw();
|
|
1238
|
+
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1241
|
+
this._currentContext.activeCubeFace = prevActiveCubeFace;
|
|
1242
|
+
this.renderer._activeCubeFace = prevActiveCubeFace;
|
|
1243
|
+
|
|
1244
|
+
}
|
|
735
1245
|
|
|
736
1246
|
} else {
|
|
737
1247
|
|
|
738
|
-
|
|
1248
|
+
draw();
|
|
739
1249
|
|
|
740
1250
|
}
|
|
741
|
-
//
|
|
742
|
-
|
|
743
|
-
gl.bindVertexArray( null );
|
|
744
1251
|
|
|
745
1252
|
}
|
|
746
1253
|
|
|
1254
|
+
/**
|
|
1255
|
+
* Explain why always null is returned.
|
|
1256
|
+
*
|
|
1257
|
+
* @param {RenderObject} renderObject - The render object.
|
|
1258
|
+
* @return {boolean} Whether the render pipeline requires an update or not.
|
|
1259
|
+
*/
|
|
747
1260
|
needsRenderUpdate( /*renderObject*/ ) {
|
|
748
1261
|
|
|
749
1262
|
return false;
|
|
750
1263
|
|
|
751
1264
|
}
|
|
752
1265
|
|
|
1266
|
+
/**
|
|
1267
|
+
* Explain why no cache key is computed.
|
|
1268
|
+
*
|
|
1269
|
+
* @param {RenderObject} renderObject - The render object.
|
|
1270
|
+
* @return {string} The cache key.
|
|
1271
|
+
*/
|
|
753
1272
|
getRenderCacheKey( /*renderObject*/ ) {
|
|
754
1273
|
|
|
755
1274
|
return '';
|
|
@@ -758,53 +1277,104 @@ class WebGLBackend extends Backend {
|
|
|
758
1277
|
|
|
759
1278
|
// textures
|
|
760
1279
|
|
|
1280
|
+
/**
|
|
1281
|
+
* Creates a default texture for the given texture that can be used
|
|
1282
|
+
* as a placeholder until the actual texture is ready for usage.
|
|
1283
|
+
*
|
|
1284
|
+
* @param {Texture} texture - The texture to create a default texture for.
|
|
1285
|
+
*/
|
|
761
1286
|
createDefaultTexture( texture ) {
|
|
762
1287
|
|
|
763
1288
|
this.textureUtils.createDefaultTexture( texture );
|
|
764
1289
|
|
|
765
1290
|
}
|
|
766
1291
|
|
|
1292
|
+
/**
|
|
1293
|
+
* Defines a texture on the GPU for the given texture object.
|
|
1294
|
+
*
|
|
1295
|
+
* @param {Texture} texture - The texture.
|
|
1296
|
+
* @param {Object} [options={}] - Optional configuration parameter.
|
|
1297
|
+
*/
|
|
767
1298
|
createTexture( texture, options ) {
|
|
768
1299
|
|
|
769
1300
|
this.textureUtils.createTexture( texture, options );
|
|
770
1301
|
|
|
771
1302
|
}
|
|
772
1303
|
|
|
1304
|
+
/**
|
|
1305
|
+
* Uploads the updated texture data to the GPU.
|
|
1306
|
+
*
|
|
1307
|
+
* @param {Texture} texture - The texture.
|
|
1308
|
+
* @param {Object} [options={}] - Optional configuration parameter.
|
|
1309
|
+
*/
|
|
773
1310
|
updateTexture( texture, options ) {
|
|
774
1311
|
|
|
775
1312
|
this.textureUtils.updateTexture( texture, options );
|
|
776
1313
|
|
|
777
1314
|
}
|
|
778
1315
|
|
|
1316
|
+
/**
|
|
1317
|
+
* Generates mipmaps for the given texture.
|
|
1318
|
+
*
|
|
1319
|
+
* @param {Texture} texture - The texture.
|
|
1320
|
+
*/
|
|
779
1321
|
generateMipmaps( texture ) {
|
|
780
1322
|
|
|
781
1323
|
this.textureUtils.generateMipmaps( texture );
|
|
782
1324
|
|
|
783
1325
|
}
|
|
784
1326
|
|
|
1327
|
+
/**
|
|
1328
|
+
* Destroys the GPU data for the given texture object.
|
|
1329
|
+
*
|
|
1330
|
+
* @param {Texture} texture - The texture.
|
|
1331
|
+
* @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
|
|
1332
|
+
*/
|
|
1333
|
+
destroyTexture( texture, isDefaultTexture = false ) {
|
|
785
1334
|
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
this.textureUtils.destroyTexture( texture );
|
|
1335
|
+
this.textureUtils.destroyTexture( texture, isDefaultTexture );
|
|
789
1336
|
|
|
790
1337
|
}
|
|
791
1338
|
|
|
792
|
-
|
|
1339
|
+
/**
|
|
1340
|
+
* Returns texture data as a typed array.
|
|
1341
|
+
*
|
|
1342
|
+
* @async
|
|
1343
|
+
* @param {Texture} texture - The texture to copy.
|
|
1344
|
+
* @param {number} x - The x coordinate of the copy origin.
|
|
1345
|
+
* @param {number} y - The y coordinate of the copy origin.
|
|
1346
|
+
* @param {number} width - The width of the copy.
|
|
1347
|
+
* @param {number} height - The height of the copy.
|
|
1348
|
+
* @param {number} faceIndex - The face index.
|
|
1349
|
+
* @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.
|
|
1350
|
+
*/
|
|
1351
|
+
async copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {
|
|
793
1352
|
|
|
794
1353
|
return this.textureUtils.copyTextureToBuffer( texture, x, y, width, height, faceIndex );
|
|
795
1354
|
|
|
796
1355
|
}
|
|
797
1356
|
|
|
798
|
-
|
|
1357
|
+
/**
|
|
1358
|
+
* This method does nothing since WebGL 2 has no concept of samplers.
|
|
1359
|
+
*
|
|
1360
|
+
* @param {Texture} texture - The texture to update the sampler for.
|
|
1361
|
+
* @return {string} The current sampler key.
|
|
1362
|
+
*/
|
|
1363
|
+
updateSampler( /*texture*/ ) {
|
|
799
1364
|
|
|
800
|
-
|
|
1365
|
+
return '';
|
|
801
1366
|
|
|
802
1367
|
}
|
|
803
1368
|
|
|
804
|
-
destroySampler() {}
|
|
805
|
-
|
|
806
1369
|
// node builder
|
|
807
1370
|
|
|
1371
|
+
/**
|
|
1372
|
+
* Returns a node builder for the given render object.
|
|
1373
|
+
*
|
|
1374
|
+
* @param {RenderObject} object - The render object.
|
|
1375
|
+
* @param {Renderer} renderer - The renderer.
|
|
1376
|
+
* @return {GLSLNodeBuilder} The node builder.
|
|
1377
|
+
*/
|
|
808
1378
|
createNodeBuilder( object, renderer ) {
|
|
809
1379
|
|
|
810
1380
|
return new GLSLNodeBuilder( object, renderer );
|
|
@@ -813,6 +1383,11 @@ class WebGLBackend extends Backend {
|
|
|
813
1383
|
|
|
814
1384
|
// program
|
|
815
1385
|
|
|
1386
|
+
/**
|
|
1387
|
+
* Creates a shader program from the given programmable stage.
|
|
1388
|
+
*
|
|
1389
|
+
* @param {ProgrammableStage} program - The programmable stage.
|
|
1390
|
+
*/
|
|
816
1391
|
createProgram( program ) {
|
|
817
1392
|
|
|
818
1393
|
const gl = this.gl;
|
|
@@ -829,12 +1404,23 @@ class WebGLBackend extends Backend {
|
|
|
829
1404
|
|
|
830
1405
|
}
|
|
831
1406
|
|
|
832
|
-
|
|
1407
|
+
/**
|
|
1408
|
+
* Destroys the shader program of the given programmable stage.
|
|
1409
|
+
*
|
|
1410
|
+
* @param {ProgrammableStage} program - The programmable stage.
|
|
1411
|
+
*/
|
|
1412
|
+
destroyProgram( program ) {
|
|
833
1413
|
|
|
834
|
-
|
|
1414
|
+
this.delete( program );
|
|
835
1415
|
|
|
836
1416
|
}
|
|
837
1417
|
|
|
1418
|
+
/**
|
|
1419
|
+
* Creates a render pipeline for the given render object.
|
|
1420
|
+
*
|
|
1421
|
+
* @param {RenderObject} renderObject - The render object.
|
|
1422
|
+
* @param {Array<Promise>} promises - An array of compilation promises which are used in `compileAsync()`.
|
|
1423
|
+
*/
|
|
838
1424
|
createRenderPipeline( renderObject, promises ) {
|
|
839
1425
|
|
|
840
1426
|
const gl = this.gl;
|
|
@@ -893,6 +1479,14 @@ class WebGLBackend extends Backend {
|
|
|
893
1479
|
|
|
894
1480
|
}
|
|
895
1481
|
|
|
1482
|
+
/**
|
|
1483
|
+
* Formats the source code of error messages.
|
|
1484
|
+
*
|
|
1485
|
+
* @private
|
|
1486
|
+
* @param {string} string - The code.
|
|
1487
|
+
* @param {number} errorLine - The error line.
|
|
1488
|
+
* @return {string} The formatted code.
|
|
1489
|
+
*/
|
|
896
1490
|
_handleSource( string, errorLine ) {
|
|
897
1491
|
|
|
898
1492
|
const lines = string.split( '\n' );
|
|
@@ -912,10 +1506,21 @@ class WebGLBackend extends Backend {
|
|
|
912
1506
|
|
|
913
1507
|
}
|
|
914
1508
|
|
|
1509
|
+
/**
|
|
1510
|
+
* Gets the shader compilation errors from the info log.
|
|
1511
|
+
*
|
|
1512
|
+
* @private
|
|
1513
|
+
* @param {WebGL2RenderingContext} gl - The rendering context.
|
|
1514
|
+
* @param {WebGLShader} shader - The WebGL shader object.
|
|
1515
|
+
* @param {string} type - The shader type.
|
|
1516
|
+
* @return {string} The shader errors.
|
|
1517
|
+
*/
|
|
915
1518
|
_getShaderErrors( gl, shader, type ) {
|
|
916
1519
|
|
|
917
1520
|
const status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );
|
|
918
|
-
|
|
1521
|
+
|
|
1522
|
+
const shaderInfoLog = gl.getShaderInfoLog( shader ) || '';
|
|
1523
|
+
const errors = shaderInfoLog.trim();
|
|
919
1524
|
|
|
920
1525
|
if ( status && errors === '' ) return '';
|
|
921
1526
|
|
|
@@ -933,17 +1538,25 @@ class WebGLBackend extends Backend {
|
|
|
933
1538
|
|
|
934
1539
|
}
|
|
935
1540
|
|
|
1541
|
+
/**
|
|
1542
|
+
* Logs shader compilation errors.
|
|
1543
|
+
*
|
|
1544
|
+
* @private
|
|
1545
|
+
* @param {WebGLProgram} programGPU - The WebGL program.
|
|
1546
|
+
* @param {WebGLShader} glFragmentShader - The fragment shader as a native WebGL shader object.
|
|
1547
|
+
* @param {WebGLShader} glVertexShader - The vertex shader as a native WebGL shader object.
|
|
1548
|
+
*/
|
|
936
1549
|
_logProgramError( programGPU, glFragmentShader, glVertexShader ) {
|
|
937
1550
|
|
|
938
1551
|
if ( this.renderer.debug.checkShaderErrors ) {
|
|
939
1552
|
|
|
940
1553
|
const gl = this.gl;
|
|
941
1554
|
|
|
942
|
-
const
|
|
1555
|
+
const programInfoLog = gl.getProgramInfoLog( programGPU ) || '';
|
|
1556
|
+
const programLog = programInfoLog.trim();
|
|
943
1557
|
|
|
944
1558
|
if ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {
|
|
945
1559
|
|
|
946
|
-
|
|
947
1560
|
if ( typeof this.renderer.debug.onShaderError === 'function' ) {
|
|
948
1561
|
|
|
949
1562
|
this.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );
|
|
@@ -955,7 +1568,7 @@ class WebGLBackend extends Backend {
|
|
|
955
1568
|
const vertexErrors = this._getShaderErrors( gl, glVertexShader, 'vertex' );
|
|
956
1569
|
const fragmentErrors = this._getShaderErrors( gl, glFragmentShader, 'fragment' );
|
|
957
1570
|
|
|
958
|
-
|
|
1571
|
+
error(
|
|
959
1572
|
'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +
|
|
960
1573
|
'VALIDATE_STATUS ' + gl.getProgramParameter( programGPU, gl.VALIDATE_STATUS ) + '\n\n' +
|
|
961
1574
|
'Program Info Log: ' + programLog + '\n' +
|
|
@@ -967,7 +1580,7 @@ class WebGLBackend extends Backend {
|
|
|
967
1580
|
|
|
968
1581
|
} else if ( programLog !== '' ) {
|
|
969
1582
|
|
|
970
|
-
|
|
1583
|
+
warn( 'WebGLProgram: Program Info Log:', programLog );
|
|
971
1584
|
|
|
972
1585
|
}
|
|
973
1586
|
|
|
@@ -975,6 +1588,13 @@ class WebGLBackend extends Backend {
|
|
|
975
1588
|
|
|
976
1589
|
}
|
|
977
1590
|
|
|
1591
|
+
/**
|
|
1592
|
+
* Completes the shader program setup for the given render object.
|
|
1593
|
+
*
|
|
1594
|
+
* @private
|
|
1595
|
+
* @param {RenderObject} renderObject - The render object.
|
|
1596
|
+
* @param {RenderPipeline} pipeline - The render pipeline.
|
|
1597
|
+
*/
|
|
978
1598
|
_completeCompile( renderObject, pipeline ) {
|
|
979
1599
|
|
|
980
1600
|
const { state, gl } = this;
|
|
@@ -1003,6 +1623,12 @@ class WebGLBackend extends Backend {
|
|
|
1003
1623
|
|
|
1004
1624
|
}
|
|
1005
1625
|
|
|
1626
|
+
/**
|
|
1627
|
+
* Creates a compute pipeline for the given compute node.
|
|
1628
|
+
*
|
|
1629
|
+
* @param {ComputePipeline} computePipeline - The compute pipeline.
|
|
1630
|
+
* @param {Array<BindGroup>} bindings - The bindings.
|
|
1631
|
+
*/
|
|
1006
1632
|
createComputePipeline( computePipeline, bindings ) {
|
|
1007
1633
|
|
|
1008
1634
|
const { state, gl } = this;
|
|
@@ -1059,8 +1685,6 @@ class WebGLBackend extends Backend {
|
|
|
1059
1685
|
|
|
1060
1686
|
// Bindings
|
|
1061
1687
|
|
|
1062
|
-
this.createBindings( null, bindings );
|
|
1063
|
-
|
|
1064
1688
|
this._setupBindings( bindings, programGPU );
|
|
1065
1689
|
|
|
1066
1690
|
const attributeNodes = computeProgram.attributes;
|
|
@@ -1099,60 +1723,132 @@ class WebGLBackend extends Backend {
|
|
|
1099
1723
|
|
|
1100
1724
|
}
|
|
1101
1725
|
|
|
1102
|
-
|
|
1726
|
+
/**
|
|
1727
|
+
* Creates bindings from the given bind group definition.
|
|
1728
|
+
*
|
|
1729
|
+
* @param {BindGroup} bindGroup - The bind group.
|
|
1730
|
+
* @param {Array<BindGroup>} bindings - Array of bind groups.
|
|
1731
|
+
* @param {number} cacheIndex - The cache index.
|
|
1732
|
+
* @param {number} version - The version.
|
|
1733
|
+
*/
|
|
1734
|
+
createBindings( bindGroup, bindings /*, cacheIndex, version*/ ) {
|
|
1103
1735
|
|
|
1104
|
-
this.
|
|
1736
|
+
if ( this._knownBindings.has( bindings ) === false ) {
|
|
1105
1737
|
|
|
1106
|
-
|
|
1738
|
+
this._knownBindings.add( bindings );
|
|
1107
1739
|
|
|
1108
|
-
|
|
1740
|
+
let uniformBuffers = 0;
|
|
1741
|
+
let textures = 0;
|
|
1109
1742
|
|
|
1110
|
-
|
|
1743
|
+
for ( const bindGroup of bindings ) {
|
|
1111
1744
|
|
|
1112
|
-
|
|
1745
|
+
this.set( bindGroup, {
|
|
1746
|
+
textures: textures,
|
|
1747
|
+
uniformBuffers: uniformBuffers
|
|
1748
|
+
} );
|
|
1113
1749
|
|
|
1114
|
-
|
|
1115
|
-
const bindGroupData = this.get( bindGroup );
|
|
1750
|
+
for ( const binding of bindGroup.bindings ) {
|
|
1116
1751
|
|
|
1117
|
-
|
|
1752
|
+
if ( binding.isUniformBuffer ) uniformBuffers ++;
|
|
1753
|
+
if ( binding.isSampledTexture ) textures ++;
|
|
1118
1754
|
|
|
1119
|
-
|
|
1755
|
+
}
|
|
1120
1756
|
|
|
1121
|
-
|
|
1757
|
+
}
|
|
1122
1758
|
|
|
1123
|
-
}
|
|
1759
|
+
}
|
|
1124
1760
|
|
|
1125
|
-
|
|
1126
|
-
bindingsData.textureIndex = bindGroupData.textureIndex;
|
|
1761
|
+
this.updateBindings( bindGroup, bindings );
|
|
1127
1762
|
|
|
1128
|
-
|
|
1763
|
+
}
|
|
1764
|
+
|
|
1765
|
+
/**
|
|
1766
|
+
* Updates the given bind group definition.
|
|
1767
|
+
*
|
|
1768
|
+
* @param {BindGroup} bindGroup - The bind group.
|
|
1769
|
+
* @param {Array<BindGroup>} bindings - Array of bind groups.
|
|
1770
|
+
* @param {number} cacheIndex - The cache index.
|
|
1771
|
+
* @param {number} version - The version.
|
|
1772
|
+
*/
|
|
1773
|
+
updateBindings( bindGroup /*, bindings, cacheIndex, version*/ ) {
|
|
1774
|
+
|
|
1775
|
+
const { gl } = this;
|
|
1776
|
+
|
|
1777
|
+
const bindGroupData = this.get( bindGroup );
|
|
1129
1778
|
|
|
1130
|
-
let i =
|
|
1779
|
+
let i = bindGroupData.uniformBuffers;
|
|
1780
|
+
let t = bindGroupData.textures;
|
|
1131
1781
|
|
|
1132
1782
|
for ( const binding of bindGroup.bindings ) {
|
|
1133
1783
|
|
|
1784
|
+
const map = this.get( binding );
|
|
1785
|
+
|
|
1134
1786
|
if ( binding.isUniformsGroup || binding.isUniformBuffer ) {
|
|
1135
1787
|
|
|
1136
|
-
const
|
|
1137
|
-
|
|
1788
|
+
const array = binding.buffer;
|
|
1789
|
+
let { bufferGPU } = this.get( array );
|
|
1790
|
+
|
|
1791
|
+
if ( bufferGPU === undefined ) {
|
|
1792
|
+
|
|
1793
|
+
// create
|
|
1794
|
+
|
|
1795
|
+
bufferGPU = gl.createBuffer();
|
|
1796
|
+
|
|
1797
|
+
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1798
|
+
gl.bufferData( gl.UNIFORM_BUFFER, array.byteLength, gl.DYNAMIC_DRAW );
|
|
1799
|
+
|
|
1800
|
+
this.set( array, { bufferGPU } );
|
|
1801
|
+
|
|
1802
|
+
} else {
|
|
1803
|
+
|
|
1804
|
+
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1805
|
+
|
|
1806
|
+
}
|
|
1807
|
+
|
|
1808
|
+
// update
|
|
1809
|
+
|
|
1810
|
+
const updateRanges = binding.updateRanges;
|
|
1138
1811
|
|
|
1139
1812
|
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1140
|
-
gl.bufferData( gl.UNIFORM_BUFFER, data, gl.DYNAMIC_DRAW );
|
|
1141
1813
|
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1814
|
+
if ( updateRanges.length === 0 ) {
|
|
1815
|
+
|
|
1816
|
+
gl.bufferData( gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW );
|
|
1817
|
+
|
|
1818
|
+
} else {
|
|
1819
|
+
|
|
1820
|
+
const isTyped = isTypedArray( array );
|
|
1821
|
+
const byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;
|
|
1822
|
+
|
|
1823
|
+
for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
|
|
1824
|
+
|
|
1825
|
+
const range = updateRanges[ i ];
|
|
1826
|
+
|
|
1827
|
+
const dataOffset = range.start * byteOffsetFactor;
|
|
1828
|
+
const size = range.count * byteOffsetFactor;
|
|
1829
|
+
|
|
1830
|
+
const bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
|
|
1831
|
+
|
|
1832
|
+
gl.bufferSubData( gl.UNIFORM_BUFFER, bufferOffset, array, dataOffset, size );
|
|
1833
|
+
|
|
1834
|
+
}
|
|
1835
|
+
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
map.index = i ++;
|
|
1839
|
+
map.bufferGPU = bufferGPU;
|
|
1840
|
+
|
|
1841
|
+
this.set( binding, map );
|
|
1146
1842
|
|
|
1147
1843
|
} else if ( binding.isSampledTexture ) {
|
|
1148
1844
|
|
|
1149
1845
|
const { textureGPU, glTextureType } = this.get( binding.texture );
|
|
1150
1846
|
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1847
|
+
map.index = t ++;
|
|
1848
|
+
map.textureGPU = textureGPU;
|
|
1849
|
+
map.glTextureType = glTextureType;
|
|
1850
|
+
|
|
1851
|
+
this.set( binding, map );
|
|
1156
1852
|
|
|
1157
1853
|
}
|
|
1158
1854
|
|
|
@@ -1160,6 +1856,11 @@ class WebGLBackend extends Backend {
|
|
|
1160
1856
|
|
|
1161
1857
|
}
|
|
1162
1858
|
|
|
1859
|
+
/**
|
|
1860
|
+
* Updates a buffer binding.
|
|
1861
|
+
*
|
|
1862
|
+
* @param {Buffer} binding - The buffer binding to update.
|
|
1863
|
+
*/
|
|
1163
1864
|
updateBinding( binding ) {
|
|
1164
1865
|
|
|
1165
1866
|
const gl = this.gl;
|
|
@@ -1168,10 +1869,35 @@ class WebGLBackend extends Backend {
|
|
|
1168
1869
|
|
|
1169
1870
|
const bindingData = this.get( binding );
|
|
1170
1871
|
const bufferGPU = bindingData.bufferGPU;
|
|
1171
|
-
const
|
|
1872
|
+
const array = binding.buffer;
|
|
1873
|
+
|
|
1874
|
+
const updateRanges = binding.updateRanges;
|
|
1172
1875
|
|
|
1173
1876
|
gl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );
|
|
1174
|
-
|
|
1877
|
+
|
|
1878
|
+
if ( updateRanges.length === 0 ) {
|
|
1879
|
+
|
|
1880
|
+
gl.bufferData( gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW );
|
|
1881
|
+
|
|
1882
|
+
} else {
|
|
1883
|
+
|
|
1884
|
+
const isTyped = isTypedArray( array );
|
|
1885
|
+
const byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;
|
|
1886
|
+
|
|
1887
|
+
for ( let i = 0, l = updateRanges.length; i < l; i ++ ) {
|
|
1888
|
+
|
|
1889
|
+
const range = updateRanges[ i ];
|
|
1890
|
+
|
|
1891
|
+
const dataOffset = range.start * byteOffsetFactor;
|
|
1892
|
+
const size = range.count * byteOffsetFactor;
|
|
1893
|
+
|
|
1894
|
+
const bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes
|
|
1895
|
+
|
|
1896
|
+
gl.bufferSubData( gl.UNIFORM_BUFFER, bufferOffset, array, dataOffset, size );
|
|
1897
|
+
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
}
|
|
1175
1901
|
|
|
1176
1902
|
}
|
|
1177
1903
|
|
|
@@ -1179,6 +1905,11 @@ class WebGLBackend extends Backend {
|
|
|
1179
1905
|
|
|
1180
1906
|
// attributes
|
|
1181
1907
|
|
|
1908
|
+
/**
|
|
1909
|
+
* Creates the GPU buffer of an indexed shader attribute.
|
|
1910
|
+
*
|
|
1911
|
+
* @param {BufferAttribute} attribute - The indexed buffer attribute.
|
|
1912
|
+
*/
|
|
1182
1913
|
createIndexAttribute( attribute ) {
|
|
1183
1914
|
|
|
1184
1915
|
const gl = this.gl;
|
|
@@ -1187,6 +1918,11 @@ class WebGLBackend extends Backend {
|
|
|
1187
1918
|
|
|
1188
1919
|
}
|
|
1189
1920
|
|
|
1921
|
+
/**
|
|
1922
|
+
* Creates the GPU buffer of a shader attribute.
|
|
1923
|
+
*
|
|
1924
|
+
* @param {BufferAttribute} attribute - The buffer attribute.
|
|
1925
|
+
*/
|
|
1190
1926
|
createAttribute( attribute ) {
|
|
1191
1927
|
|
|
1192
1928
|
if ( this.has( attribute ) ) return;
|
|
@@ -1197,6 +1933,11 @@ class WebGLBackend extends Backend {
|
|
|
1197
1933
|
|
|
1198
1934
|
}
|
|
1199
1935
|
|
|
1936
|
+
/**
|
|
1937
|
+
* Creates the GPU buffer of a storage attribute.
|
|
1938
|
+
*
|
|
1939
|
+
* @param {BufferAttribute} attribute - The buffer attribute.
|
|
1940
|
+
*/
|
|
1200
1941
|
createStorageAttribute( attribute ) {
|
|
1201
1942
|
|
|
1202
1943
|
if ( this.has( attribute ) ) return;
|
|
@@ -1207,24 +1948,34 @@ class WebGLBackend extends Backend {
|
|
|
1207
1948
|
|
|
1208
1949
|
}
|
|
1209
1950
|
|
|
1951
|
+
/**
|
|
1952
|
+
* Updates the GPU buffer of a shader attribute.
|
|
1953
|
+
*
|
|
1954
|
+
* @param {BufferAttribute} attribute - The buffer attribute to update.
|
|
1955
|
+
*/
|
|
1210
1956
|
updateAttribute( attribute ) {
|
|
1211
1957
|
|
|
1212
1958
|
this.attributeUtils.updateAttribute( attribute );
|
|
1213
1959
|
|
|
1214
1960
|
}
|
|
1215
1961
|
|
|
1962
|
+
/**
|
|
1963
|
+
* Destroys the GPU buffer of a shader attribute.
|
|
1964
|
+
*
|
|
1965
|
+
* @param {BufferAttribute} attribute - The buffer attribute to destroy.
|
|
1966
|
+
*/
|
|
1216
1967
|
destroyAttribute( attribute ) {
|
|
1217
1968
|
|
|
1218
1969
|
this.attributeUtils.destroyAttribute( attribute );
|
|
1219
1970
|
|
|
1220
1971
|
}
|
|
1221
1972
|
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1973
|
+
/**
|
|
1974
|
+
* Checks if the given feature is supported by the backend.
|
|
1975
|
+
*
|
|
1976
|
+
* @param {string} name - The feature's name.
|
|
1977
|
+
* @return {boolean} Whether the feature is supported or not.
|
|
1978
|
+
*/
|
|
1228
1979
|
hasFeature( name ) {
|
|
1229
1980
|
|
|
1230
1981
|
const keysMatching = Object.keys( GLFeatureName ).filter( key => GLFeatureName[ key ] === name );
|
|
@@ -1241,24 +1992,81 @@ class WebGLBackend extends Backend {
|
|
|
1241
1992
|
|
|
1242
1993
|
}
|
|
1243
1994
|
|
|
1995
|
+
/**
|
|
1996
|
+
* Returns the maximum anisotropy texture filtering value.
|
|
1997
|
+
*
|
|
1998
|
+
* @return {number} The maximum anisotropy texture filtering value.
|
|
1999
|
+
*/
|
|
1244
2000
|
getMaxAnisotropy() {
|
|
1245
2001
|
|
|
1246
2002
|
return this.capabilities.getMaxAnisotropy();
|
|
1247
2003
|
|
|
1248
2004
|
}
|
|
1249
2005
|
|
|
1250
|
-
|
|
2006
|
+
/**
|
|
2007
|
+
* Copies data of the given source texture to the given destination texture.
|
|
2008
|
+
*
|
|
2009
|
+
* @param {Texture} srcTexture - The source texture.
|
|
2010
|
+
* @param {Texture} dstTexture - The destination texture.
|
|
2011
|
+
* @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.
|
|
2012
|
+
* @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.
|
|
2013
|
+
* @param {number} [srcLevel=0] - The source mip level to copy from.
|
|
2014
|
+
* @param {number} [dstLevel=0] - The destination mip level to copy to.
|
|
2015
|
+
*/
|
|
2016
|
+
copyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {
|
|
1251
2017
|
|
|
1252
|
-
this.textureUtils.copyTextureToTexture(
|
|
2018
|
+
this.textureUtils.copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, srcLevel, dstLevel );
|
|
1253
2019
|
|
|
1254
2020
|
}
|
|
1255
2021
|
|
|
2022
|
+
/**
|
|
2023
|
+
* Copies the current bound framebuffer to the given texture.
|
|
2024
|
+
*
|
|
2025
|
+
* @param {Texture} texture - The destination texture.
|
|
2026
|
+
* @param {RenderContext} renderContext - The render context.
|
|
2027
|
+
* @param {Vector4} rectangle - A four dimensional vector defining the origin and dimension of the copy.
|
|
2028
|
+
*/
|
|
1256
2029
|
copyFramebufferToTexture( texture, renderContext, rectangle ) {
|
|
1257
2030
|
|
|
1258
2031
|
this.textureUtils.copyFramebufferToTexture( texture, renderContext, rectangle );
|
|
1259
2032
|
|
|
1260
2033
|
}
|
|
1261
2034
|
|
|
2035
|
+
/**
|
|
2036
|
+
* Checks if the given compatibility is supported by the backend.
|
|
2037
|
+
*
|
|
2038
|
+
* @param {string} name - The compatibility name.
|
|
2039
|
+
* @return {boolean} Whether the compatibility is supported or not.
|
|
2040
|
+
*/
|
|
2041
|
+
hasCompatibility( name ) {
|
|
2042
|
+
|
|
2043
|
+
if ( name === Compatibility.TEXTURE_COMPARE ) return true;
|
|
2044
|
+
|
|
2045
|
+
return super.hasCompatibility( name );
|
|
2046
|
+
|
|
2047
|
+
}
|
|
2048
|
+
|
|
2049
|
+
/**
|
|
2050
|
+
* Initializes the render target defined in the given render context.
|
|
2051
|
+
*
|
|
2052
|
+
* @param {RenderContext} renderContext - The render context.
|
|
2053
|
+
*/
|
|
2054
|
+
initRenderTarget( renderContext ) {
|
|
2055
|
+
|
|
2056
|
+
const { gl, state } = this;
|
|
2057
|
+
|
|
2058
|
+
this._setFramebuffer( renderContext );
|
|
2059
|
+
|
|
2060
|
+
state.bindFramebuffer( gl.FRAMEBUFFER, null );
|
|
2061
|
+
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
/**
|
|
2065
|
+
* Configures the active framebuffer from the given render context.
|
|
2066
|
+
*
|
|
2067
|
+
* @private
|
|
2068
|
+
* @param {RenderContext} descriptor - The render context.
|
|
2069
|
+
*/
|
|
1262
2070
|
_setFramebuffer( descriptor ) {
|
|
1263
2071
|
|
|
1264
2072
|
const { gl, state } = this;
|
|
@@ -1271,11 +2079,17 @@ class WebGLBackend extends Backend {
|
|
|
1271
2079
|
const renderTargetContextData = this.get( renderTarget );
|
|
1272
2080
|
const { samples, depthBuffer, stencilBuffer } = renderTarget;
|
|
1273
2081
|
|
|
1274
|
-
const isCube = renderTarget.
|
|
2082
|
+
const isCube = renderTarget.isCubeRenderTarget === true;
|
|
2083
|
+
const isRenderTarget3D = renderTarget.isRenderTarget3D === true;
|
|
2084
|
+
const isRenderTargetArray = renderTarget.depth > 1;
|
|
2085
|
+
const isXRRenderTarget = renderTarget.isXRRenderTarget === true;
|
|
2086
|
+
const _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );
|
|
1275
2087
|
|
|
1276
2088
|
let msaaFb = renderTargetContextData.msaaFrameBuffer;
|
|
1277
2089
|
let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
|
|
1278
|
-
|
|
2090
|
+
const multisampledRTTExt = this.extensions.get( 'WEBGL_multisampled_render_to_texture' );
|
|
2091
|
+
const multiviewExt = this.extensions.get( 'OVR_multiview2' );
|
|
2092
|
+
const useMultisampledRTT = this._useMultisampledExtension( renderTarget );
|
|
1279
2093
|
const cacheKey = getCacheKey( descriptor );
|
|
1280
2094
|
|
|
1281
2095
|
let fb;
|
|
@@ -1286,6 +2100,10 @@ class WebGLBackend extends Backend {
|
|
|
1286
2100
|
|
|
1287
2101
|
fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
|
|
1288
2102
|
|
|
2103
|
+
} else if ( isXRRenderTarget && _hasExternalTextures === false ) {
|
|
2104
|
+
|
|
2105
|
+
fb = this._xrFramebuffer;
|
|
2106
|
+
|
|
1289
2107
|
} else {
|
|
1290
2108
|
|
|
1291
2109
|
renderTargetContextData.framebuffers || ( renderTargetContextData.framebuffers = {} );
|
|
@@ -1301,6 +2119,7 @@ class WebGLBackend extends Backend {
|
|
|
1301
2119
|
state.bindFramebuffer( gl.FRAMEBUFFER, fb );
|
|
1302
2120
|
|
|
1303
2121
|
const textures = descriptor.textures;
|
|
2122
|
+
const depthInvalidationArray = [];
|
|
1304
2123
|
|
|
1305
2124
|
if ( isCube ) {
|
|
1306
2125
|
|
|
@@ -1309,8 +2128,9 @@ class WebGLBackend extends Backend {
|
|
|
1309
2128
|
const { textureGPU } = this.get( textures[ 0 ] );
|
|
1310
2129
|
|
|
1311
2130
|
const cubeFace = this.renderer._activeCubeFace;
|
|
2131
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
1312
2132
|
|
|
1313
|
-
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU,
|
|
2133
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );
|
|
1314
2134
|
|
|
1315
2135
|
} else {
|
|
1316
2136
|
|
|
@@ -1321,29 +2141,182 @@ class WebGLBackend extends Backend {
|
|
|
1321
2141
|
const texture = textures[ i ];
|
|
1322
2142
|
const textureData = this.get( texture );
|
|
1323
2143
|
textureData.renderTarget = descriptor.renderTarget;
|
|
2144
|
+
textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
|
|
1324
2145
|
|
|
1325
2146
|
const attachment = gl.COLOR_ATTACHMENT0 + i;
|
|
1326
2147
|
|
|
1327
|
-
|
|
2148
|
+
if ( renderTarget.multiview ) {
|
|
2149
|
+
|
|
2150
|
+
multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, samples, 0, 2 );
|
|
2151
|
+
|
|
2152
|
+
} else if ( isRenderTarget3D || isRenderTargetArray ) {
|
|
2153
|
+
|
|
2154
|
+
const layer = this.renderer._activeCubeFace;
|
|
2155
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
2156
|
+
|
|
2157
|
+
gl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );
|
|
2158
|
+
|
|
2159
|
+
} else {
|
|
2160
|
+
|
|
2161
|
+
if ( useMultisampledRTT ) {
|
|
2162
|
+
|
|
2163
|
+
multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
|
|
2164
|
+
|
|
2165
|
+
} else {
|
|
2166
|
+
|
|
2167
|
+
const mipLevel = this.renderer._activeMipmapLevel;
|
|
2168
|
+
|
|
2169
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );
|
|
2170
|
+
|
|
2171
|
+
}
|
|
2172
|
+
|
|
2173
|
+
}
|
|
1328
2174
|
|
|
1329
2175
|
}
|
|
1330
2176
|
|
|
1331
|
-
|
|
2177
|
+
}
|
|
2178
|
+
|
|
2179
|
+
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
2180
|
+
|
|
2181
|
+
if ( renderTarget._autoAllocateDepthBuffer === true ) {
|
|
2182
|
+
|
|
2183
|
+
const renderbuffer = gl.createRenderbuffer();
|
|
2184
|
+
this.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );
|
|
2185
|
+
renderTargetContextData.xrDepthRenderbuffer = renderbuffer;
|
|
2186
|
+
depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
|
|
2187
|
+
|
|
2188
|
+
gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
|
|
2189
|
+
gl.framebufferRenderbuffer( gl.FRAMEBUFFER, depthStyle, gl.RENDERBUFFER, renderbuffer );
|
|
2190
|
+
|
|
2191
|
+
|
|
2192
|
+
} else {
|
|
2193
|
+
|
|
2194
|
+
if ( descriptor.depthTexture !== null ) {
|
|
2195
|
+
|
|
2196
|
+
depthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );
|
|
2197
|
+
|
|
2198
|
+
const textureData = this.get( descriptor.depthTexture );
|
|
2199
|
+
textureData.renderTarget = descriptor.renderTarget;
|
|
2200
|
+
textureData.cacheKey = cacheKey; // required for copyTextureToTexture()
|
|
2201
|
+
|
|
2202
|
+
if ( renderTarget.multiview ) {
|
|
2203
|
+
|
|
2204
|
+
multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
|
|
2205
|
+
|
|
2206
|
+
} else if ( _hasExternalTextures && useMultisampledRTT ) {
|
|
2207
|
+
|
|
2208
|
+
multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
|
|
2209
|
+
|
|
2210
|
+
} else {
|
|
2211
|
+
|
|
2212
|
+
if ( descriptor.depthTexture.isArrayTexture ) {
|
|
2213
|
+
|
|
2214
|
+
const layer = this.renderer._activeCubeFace;
|
|
2215
|
+
|
|
2216
|
+
gl.framebufferTextureLayer( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, layer );
|
|
2217
|
+
|
|
2218
|
+
} else if ( descriptor.depthTexture.isCubeTexture ) {
|
|
2219
|
+
|
|
2220
|
+
const cubeFace = this.renderer._activeCubeFace;
|
|
2221
|
+
|
|
2222
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureData.textureGPU, 0 );
|
|
2223
|
+
|
|
2224
|
+
} else {
|
|
2225
|
+
|
|
2226
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
|
|
2227
|
+
|
|
2228
|
+
}
|
|
2229
|
+
|
|
2230
|
+
}
|
|
2231
|
+
|
|
2232
|
+
}
|
|
1332
2233
|
|
|
1333
2234
|
}
|
|
1334
2235
|
|
|
1335
|
-
|
|
2236
|
+
renderTargetContextData.depthInvalidationArray = depthInvalidationArray;
|
|
2237
|
+
|
|
2238
|
+
|
|
2239
|
+
} else {
|
|
2240
|
+
|
|
2241
|
+
const isRenderCameraDepthArray = this._isRenderCameraDepthArray( descriptor );
|
|
2242
|
+
|
|
2243
|
+
if ( isRenderCameraDepthArray ) {
|
|
2244
|
+
|
|
2245
|
+
state.bindFramebuffer( gl.FRAMEBUFFER, fb );
|
|
2246
|
+
|
|
2247
|
+
const layer = this.renderer._activeCubeFace;
|
|
2248
|
+
|
|
2249
|
+
const depthData = this.get( descriptor.depthTexture );
|
|
2250
|
+
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
2251
|
+
gl.framebufferTextureLayer(
|
|
2252
|
+
gl.FRAMEBUFFER,
|
|
2253
|
+
depthStyle,
|
|
2254
|
+
depthData.textureGPU,
|
|
2255
|
+
0,
|
|
2256
|
+
layer
|
|
2257
|
+
);
|
|
2258
|
+
|
|
2259
|
+
}
|
|
2260
|
+
|
|
2261
|
+
// rebind external XR textures
|
|
2262
|
+
|
|
2263
|
+
if ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {
|
|
2264
|
+
|
|
2265
|
+
state.bindFramebuffer( gl.FRAMEBUFFER, fb );
|
|
2266
|
+
|
|
2267
|
+
// rebind color
|
|
2268
|
+
|
|
2269
|
+
const textureData = this.get( descriptor.textures[ 0 ] );
|
|
2270
|
+
|
|
2271
|
+
if ( renderTarget.multiview ) {
|
|
2272
|
+
|
|
2273
|
+
multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureData.textureGPU, 0, samples, 0, 2 );
|
|
2274
|
+
|
|
2275
|
+
} else if ( useMultisampledRTT ) {
|
|
2276
|
+
|
|
2277
|
+
multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
|
|
2278
|
+
|
|
2279
|
+
} else {
|
|
2280
|
+
|
|
2281
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0 );
|
|
2282
|
+
|
|
2283
|
+
}
|
|
2284
|
+
|
|
2285
|
+
// rebind depth
|
|
1336
2286
|
|
|
1337
|
-
const textureData = this.get( descriptor.depthTexture );
|
|
1338
2287
|
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
1339
2288
|
|
|
1340
|
-
|
|
2289
|
+
if ( renderTarget._autoAllocateDepthBuffer === true ) {
|
|
2290
|
+
|
|
2291
|
+
const renderbuffer = renderTargetContextData.xrDepthRenderbuffer;
|
|
2292
|
+
gl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );
|
|
2293
|
+
gl.framebufferRenderbuffer( gl.FRAMEBUFFER, depthStyle, gl.RENDERBUFFER, renderbuffer );
|
|
2294
|
+
|
|
2295
|
+
} else {
|
|
2296
|
+
|
|
2297
|
+
const textureData = this.get( descriptor.depthTexture );
|
|
2298
|
+
|
|
2299
|
+
if ( renderTarget.multiview ) {
|
|
2300
|
+
|
|
2301
|
+
multiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );
|
|
2302
|
+
|
|
2303
|
+
} else if ( useMultisampledRTT ) {
|
|
2304
|
+
|
|
2305
|
+
multisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );
|
|
2306
|
+
|
|
2307
|
+
} else {
|
|
2308
|
+
|
|
2309
|
+
gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
|
|
2310
|
+
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
}
|
|
1341
2314
|
|
|
1342
2315
|
}
|
|
1343
2316
|
|
|
1344
2317
|
}
|
|
1345
2318
|
|
|
1346
|
-
if ( samples > 0 ) {
|
|
2319
|
+
if ( samples > 0 && useMultisampledRTT === false && ! renderTarget.multiview ) {
|
|
1347
2320
|
|
|
1348
2321
|
if ( msaaFb === undefined ) {
|
|
1349
2322
|
|
|
@@ -1365,13 +2338,6 @@ class WebGLBackend extends Backend {
|
|
|
1365
2338
|
|
|
1366
2339
|
invalidationArray.push( gl.COLOR_ATTACHMENT0 + i );
|
|
1367
2340
|
|
|
1368
|
-
if ( depthBuffer ) {
|
|
1369
|
-
|
|
1370
|
-
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
1371
|
-
invalidationArray.push( depthStyle );
|
|
1372
|
-
|
|
1373
|
-
}
|
|
1374
|
-
|
|
1375
2341
|
const texture = descriptor.textures[ i ];
|
|
1376
2342
|
const textureData = this.get( texture );
|
|
1377
2343
|
|
|
@@ -1381,13 +2347,15 @@ class WebGLBackend extends Backend {
|
|
|
1381
2347
|
|
|
1382
2348
|
}
|
|
1383
2349
|
|
|
2350
|
+
gl.bindRenderbuffer( gl.RENDERBUFFER, null );
|
|
2351
|
+
|
|
1384
2352
|
renderTargetContextData.msaaFrameBuffer = msaaFb;
|
|
1385
2353
|
renderTargetContextData.msaaRenderbuffers = msaaRenderbuffers;
|
|
1386
2354
|
|
|
1387
|
-
if ( depthRenderbuffer === undefined ) {
|
|
2355
|
+
if ( depthBuffer && depthRenderbuffer === undefined ) {
|
|
1388
2356
|
|
|
1389
2357
|
depthRenderbuffer = gl.createRenderbuffer();
|
|
1390
|
-
this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor );
|
|
2358
|
+
this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor, samples );
|
|
1391
2359
|
|
|
1392
2360
|
renderTargetContextData.depthRenderbuffer = depthRenderbuffer;
|
|
1393
2361
|
|
|
@@ -1408,24 +2376,24 @@ class WebGLBackend extends Backend {
|
|
|
1408
2376
|
|
|
1409
2377
|
}
|
|
1410
2378
|
|
|
2379
|
+
state.drawBuffers( descriptor, fb );
|
|
2380
|
+
|
|
1411
2381
|
}
|
|
1412
2382
|
|
|
1413
2383
|
state.bindFramebuffer( gl.FRAMEBUFFER, currentFrameBuffer );
|
|
1414
2384
|
|
|
1415
2385
|
}
|
|
1416
2386
|
|
|
2387
|
+
/**
|
|
2388
|
+
* Computes the VAO key for the given index and attributes.
|
|
2389
|
+
*
|
|
2390
|
+
* @private
|
|
2391
|
+
* @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
|
|
2392
|
+
* @return {string} The VAO key.
|
|
2393
|
+
*/
|
|
2394
|
+
_getVaoKey( attributes ) {
|
|
1417
2395
|
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
let key = [];
|
|
1421
|
-
|
|
1422
|
-
if ( index !== null ) {
|
|
1423
|
-
|
|
1424
|
-
const indexData = this.get( index );
|
|
1425
|
-
|
|
1426
|
-
key += ':' + indexData.id;
|
|
1427
|
-
|
|
1428
|
-
}
|
|
2396
|
+
let key = '';
|
|
1429
2397
|
|
|
1430
2398
|
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
1431
2399
|
|
|
@@ -1439,39 +2407,29 @@ class WebGLBackend extends Backend {
|
|
|
1439
2407
|
|
|
1440
2408
|
}
|
|
1441
2409
|
|
|
1442
|
-
|
|
2410
|
+
/**
|
|
2411
|
+
* Creates a VAO from the index and attributes.
|
|
2412
|
+
*
|
|
2413
|
+
* @private
|
|
2414
|
+
* @param {Array<BufferAttribute>} attributes - An array of buffer attributes.
|
|
2415
|
+
* @return {Object} The VAO data.
|
|
2416
|
+
*/
|
|
2417
|
+
_createVao( attributes ) {
|
|
1443
2418
|
|
|
1444
2419
|
const { gl } = this;
|
|
1445
2420
|
|
|
1446
2421
|
const vaoGPU = gl.createVertexArray();
|
|
1447
|
-
let key = '';
|
|
1448
|
-
|
|
1449
|
-
let staticVao = true;
|
|
1450
2422
|
|
|
1451
2423
|
gl.bindVertexArray( vaoGPU );
|
|
1452
2424
|
|
|
1453
|
-
if ( index !== null ) {
|
|
1454
|
-
|
|
1455
|
-
const indexData = this.get( index );
|
|
1456
|
-
|
|
1457
|
-
gl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, indexData.bufferGPU );
|
|
1458
|
-
|
|
1459
|
-
key += ':' + indexData.id;
|
|
1460
|
-
|
|
1461
|
-
}
|
|
1462
|
-
|
|
1463
2425
|
for ( let i = 0; i < attributes.length; i ++ ) {
|
|
1464
2426
|
|
|
1465
2427
|
const attribute = attributes[ i ];
|
|
1466
2428
|
const attributeData = this.get( attribute );
|
|
1467
2429
|
|
|
1468
|
-
key += ':' + attributeData.id;
|
|
1469
|
-
|
|
1470
2430
|
gl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );
|
|
1471
2431
|
gl.enableVertexAttribArray( i );
|
|
1472
2432
|
|
|
1473
|
-
if ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) staticVao = false;
|
|
1474
|
-
|
|
1475
2433
|
let stride, offset;
|
|
1476
2434
|
|
|
1477
2435
|
if ( attribute.isInterleavedBufferAttribute === true ) {
|
|
@@ -1510,12 +2468,17 @@ class WebGLBackend extends Backend {
|
|
|
1510
2468
|
|
|
1511
2469
|
gl.bindBuffer( gl.ARRAY_BUFFER, null );
|
|
1512
2470
|
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
return { vaoGPU, staticVao };
|
|
2471
|
+
return vaoGPU;
|
|
1516
2472
|
|
|
1517
2473
|
}
|
|
1518
2474
|
|
|
2475
|
+
/**
|
|
2476
|
+
* Creates a transform feedback from the given transform buffers.
|
|
2477
|
+
*
|
|
2478
|
+
* @private
|
|
2479
|
+
* @param {Array<DualAttributeData>} transformBuffers - The transform buffers.
|
|
2480
|
+
* @return {WebGLTransformFeedback} The transform feedback.
|
|
2481
|
+
*/
|
|
1519
2482
|
_getTransformFeedback( transformBuffers ) {
|
|
1520
2483
|
|
|
1521
2484
|
let key = '';
|
|
@@ -1556,7 +2519,13 @@ class WebGLBackend extends Backend {
|
|
|
1556
2519
|
|
|
1557
2520
|
}
|
|
1558
2521
|
|
|
1559
|
-
|
|
2522
|
+
/**
|
|
2523
|
+
* Setups the given bindings.
|
|
2524
|
+
*
|
|
2525
|
+
* @private
|
|
2526
|
+
* @param {Array<BindGroup>} bindings - The bindings.
|
|
2527
|
+
* @param {WebGLProgram} programGPU - The WebGL program.
|
|
2528
|
+
*/
|
|
1560
2529
|
_setupBindings( bindings, programGPU ) {
|
|
1561
2530
|
|
|
1562
2531
|
const gl = this.gl;
|
|
@@ -1586,6 +2555,12 @@ class WebGLBackend extends Backend {
|
|
|
1586
2555
|
|
|
1587
2556
|
}
|
|
1588
2557
|
|
|
2558
|
+
/**
|
|
2559
|
+
* Binds the given uniforms.
|
|
2560
|
+
*
|
|
2561
|
+
* @private
|
|
2562
|
+
* @param {Array<BindGroup>} bindings - The bindings.
|
|
2563
|
+
*/
|
|
1589
2564
|
_bindUniforms( bindings ) {
|
|
1590
2565
|
|
|
1591
2566
|
const { gl, state } = this;
|
|
@@ -1614,6 +2589,154 @@ class WebGLBackend extends Backend {
|
|
|
1614
2589
|
|
|
1615
2590
|
}
|
|
1616
2591
|
|
|
2592
|
+
/**
|
|
2593
|
+
* The method ensures multisampled render targets are resolved.
|
|
2594
|
+
*
|
|
2595
|
+
* @private
|
|
2596
|
+
* @param {RenderContext} renderContext - The render context.
|
|
2597
|
+
*/
|
|
2598
|
+
_resolveRenderTarget( renderContext ) {
|
|
2599
|
+
|
|
2600
|
+
const { gl, state } = this;
|
|
2601
|
+
|
|
2602
|
+
const renderTarget = renderContext.renderTarget;
|
|
2603
|
+
|
|
2604
|
+
if ( renderContext.textures !== null && renderTarget ) {
|
|
2605
|
+
|
|
2606
|
+
const renderTargetContextData = this.get( renderTarget );
|
|
2607
|
+
|
|
2608
|
+
if ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {
|
|
2609
|
+
|
|
2610
|
+
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
2611
|
+
|
|
2612
|
+
let mask = gl.COLOR_BUFFER_BIT;
|
|
2613
|
+
|
|
2614
|
+
if ( renderTarget.resolveDepthBuffer ) {
|
|
2615
|
+
|
|
2616
|
+
if ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;
|
|
2617
|
+
if ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;
|
|
2618
|
+
|
|
2619
|
+
}
|
|
2620
|
+
|
|
2621
|
+
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
2622
|
+
const msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;
|
|
2623
|
+
|
|
2624
|
+
const textures = renderContext.textures;
|
|
2625
|
+
const isMRT = textures.length > 1;
|
|
2626
|
+
|
|
2627
|
+
state.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );
|
|
2628
|
+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
2629
|
+
|
|
2630
|
+
if ( isMRT ) {
|
|
2631
|
+
|
|
2632
|
+
// blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,
|
|
2633
|
+
// the engine temporarily removes all attachments and then configures each attachment for the resolve.
|
|
2634
|
+
|
|
2635
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2636
|
+
|
|
2637
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );
|
|
2638
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );
|
|
2639
|
+
|
|
2640
|
+
}
|
|
2641
|
+
|
|
2642
|
+
}
|
|
2643
|
+
|
|
2644
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2645
|
+
|
|
2646
|
+
if ( isMRT ) {
|
|
2647
|
+
|
|
2648
|
+
// configure attachment for resolve
|
|
2649
|
+
|
|
2650
|
+
const { textureGPU } = this.get( textures[ i ] );
|
|
2651
|
+
|
|
2652
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
2653
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );
|
|
2654
|
+
|
|
2655
|
+
}
|
|
2656
|
+
|
|
2657
|
+
if ( renderContext.scissor ) {
|
|
2658
|
+
|
|
2659
|
+
const { x, y, width, height } = renderContext.scissorValue;
|
|
2660
|
+
|
|
2661
|
+
const viewY = renderContext.height - height - y;
|
|
2662
|
+
|
|
2663
|
+
gl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );
|
|
2664
|
+
|
|
2665
|
+
} else {
|
|
2666
|
+
|
|
2667
|
+
gl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );
|
|
2668
|
+
|
|
2669
|
+
}
|
|
2670
|
+
|
|
2671
|
+
}
|
|
2672
|
+
|
|
2673
|
+
if ( isMRT ) {
|
|
2674
|
+
|
|
2675
|
+
// restore attachments
|
|
2676
|
+
|
|
2677
|
+
for ( let i = 0; i < textures.length; i ++ ) {
|
|
2678
|
+
|
|
2679
|
+
const { textureGPU } = this.get( textures[ i ] );
|
|
2680
|
+
|
|
2681
|
+
gl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
2682
|
+
gl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );
|
|
2683
|
+
|
|
2684
|
+
}
|
|
2685
|
+
|
|
2686
|
+
}
|
|
2687
|
+
|
|
2688
|
+
if ( this._supportsInvalidateFramebuffer === true ) {
|
|
2689
|
+
|
|
2690
|
+
gl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );
|
|
2691
|
+
|
|
2692
|
+
}
|
|
2693
|
+
|
|
2694
|
+
} else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {
|
|
2695
|
+
|
|
2696
|
+
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
2697
|
+
state.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );
|
|
2698
|
+
gl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );
|
|
2699
|
+
|
|
2700
|
+
}
|
|
2701
|
+
|
|
2702
|
+
}
|
|
2703
|
+
|
|
2704
|
+
}
|
|
2705
|
+
|
|
2706
|
+
/**
|
|
2707
|
+
* Returns `true` if the `WEBGL_multisampled_render_to_texture` extension
|
|
2708
|
+
* should be used when MSAA is enabled.
|
|
2709
|
+
*
|
|
2710
|
+
* @private
|
|
2711
|
+
* @param {RenderTarget} renderTarget - The render target that should be multisampled.
|
|
2712
|
+
* @return {boolean} Whether to use the `WEBGL_multisampled_render_to_texture` extension for MSAA or not.
|
|
2713
|
+
*/
|
|
2714
|
+
_useMultisampledExtension( renderTarget ) {
|
|
2715
|
+
|
|
2716
|
+
if ( renderTarget.multiview === true ) {
|
|
2717
|
+
|
|
2718
|
+
return true;
|
|
2719
|
+
|
|
2720
|
+
}
|
|
2721
|
+
|
|
2722
|
+
return renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;
|
|
2723
|
+
|
|
2724
|
+
}
|
|
2725
|
+
|
|
2726
|
+
/**
|
|
2727
|
+
* Frees internal resources.
|
|
2728
|
+
*/
|
|
2729
|
+
dispose() {
|
|
2730
|
+
|
|
2731
|
+
if ( this.textureUtils !== null ) this.textureUtils.dispose();
|
|
2732
|
+
|
|
2733
|
+
const extension = this.extensions.get( 'WEBGL_lose_context' );
|
|
2734
|
+
if ( extension ) extension.loseContext();
|
|
2735
|
+
|
|
2736
|
+
this.renderer.domElement.removeEventListener( 'webglcontextlost', this._onContextLost );
|
|
2737
|
+
|
|
2738
|
+
}
|
|
2739
|
+
|
|
1617
2740
|
}
|
|
1618
2741
|
|
|
1619
2742
|
export default WebGLBackend;
|