super-three 0.181.0 → 0.185.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 +3 -4
- package/build/three.cjs +21332 -19201
- package/build/three.core.js +20908 -19853
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1947 -862
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +37 -16
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +33628 -25197
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +33394 -25000
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +14 -3
- package/examples/jsm/animation/CCDIKSolver.js +7 -3
- package/examples/jsm/controls/ArcballControls.js +13 -6
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +127 -86
- package/examples/jsm/controls/FlyControls.js +4 -0
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +111 -8
- package/examples/jsm/controls/TrackballControls.js +8 -8
- package/examples/jsm/controls/TransformControls.js +102 -17
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMFrustum.js +31 -6
- package/examples/jsm/csm/CSMShadowNode.js +10 -3
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/effects/AsciiEffect.js +14 -1
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/DRACOExporter.js +27 -6
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +266 -21
- package/examples/jsm/exporters/PLYExporter.js +286 -73
- package/examples/jsm/exporters/USDZExporter.js +353 -99
- package/examples/jsm/generators/CityGenerator.js +346 -0
- package/examples/jsm/generators/ForestGenerator.js +347 -0
- package/examples/jsm/generators/TerrainGenerator.js +504 -0
- package/examples/jsm/generators/TreeGenerator.js +377 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
- package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/geometries/LoftGeometry.js +355 -0
- package/examples/jsm/geometries/TextGeometry.js +18 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelper.js +5 -4
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +83 -14
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +244 -91
- package/examples/jsm/inspector/RendererInspector.js +165 -39
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +241 -25
- package/examples/jsm/inspector/tabs/Memory.js +136 -0
- package/examples/jsm/inspector/tabs/Parameters.js +115 -7
- package/examples/jsm/inspector/tabs/Performance.js +24 -9
- package/examples/jsm/inspector/tabs/Settings.js +306 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
- package/examples/jsm/inspector/tabs/Viewer.js +723 -9
- package/examples/jsm/inspector/ui/Graph.js +162 -25
- package/examples/jsm/inspector/ui/Item.js +92 -13
- package/examples/jsm/inspector/ui/List.js +2 -2
- package/examples/jsm/inspector/ui/Profiler.js +1991 -44
- package/examples/jsm/inspector/ui/Style.js +1943 -543
- package/examples/jsm/inspector/ui/Tab.js +226 -5
- package/examples/jsm/inspector/ui/Values.js +126 -8
- package/examples/jsm/inspector/ui/utils.js +143 -10
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/libs/basis/README.md +0 -1
- package/examples/jsm/libs/demuxer_mp4.js +3 -3
- package/examples/jsm/libs/draco/README.md +0 -1
- package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
- package/examples/jsm/libs/mikktspace.module.js +34 -9
- package/examples/jsm/lighting/ClusteredLighting.js +55 -0
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +681 -0
- package/examples/jsm/lines/LineMaterial.js +45 -16
- package/examples/jsm/lines/LineSegments2.js +8 -0
- package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
- package/examples/jsm/loaders/3DMLoader.js +6 -5
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +51 -18
- package/examples/jsm/loaders/EXRLoader.js +701 -90
- package/examples/jsm/loaders/FBXLoader.js +235 -37
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +146 -178
- package/examples/jsm/loaders/HDRLoader.js +7 -30
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +58 -17
- package/examples/jsm/loaders/LDrawLoader.js +49 -58
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
- package/examples/jsm/loaders/LWOLoader.js +11 -39
- package/examples/jsm/loaders/LottieLoader.js +1 -1
- package/examples/jsm/loaders/MaterialXLoader.js +31 -9
- package/examples/jsm/loaders/NRRDLoader.js +5 -5
- package/examples/jsm/loaders/PCDLoader.js +11 -9
- package/examples/jsm/loaders/PLYLoader.js +218 -55
- package/examples/jsm/loaders/SVGLoader.js +549 -497
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/TTFLoader.js +1 -1
- package/examples/jsm/loaders/USDLoader.js +127 -43
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +80 -3
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/usd/USDAParser.js +504 -344
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
- package/examples/jsm/misc/Volume.js +2 -3
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/GroundedSkybox.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +72 -25
- package/examples/jsm/objects/Sky.js +90 -6
- package/examples/jsm/objects/SkyMesh.js +150 -16
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/Water2Mesh.js +1 -1
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +27 -15
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +36 -7
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +174 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/shaders/VolumeShader.js +31 -44
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
- package/examples/jsm/transpiler/Linker.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +75 -25
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +13 -14
- package/examples/jsm/tsl/display/GTAONode.js +40 -17
- package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
- package/examples/jsm/tsl/display/GodraysNode.js +615 -0
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +69 -19
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
- package/examples/jsm/tsl/display/SSGINode.js +96 -62
- package/examples/jsm/tsl/display/SSRNode.js +831 -134
- package/examples/jsm/tsl/display/SSSNode.js +8 -6
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +315 -126
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/tsl/math/curlNoise.js +107 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
- package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
- package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
- package/examples/jsm/tsl/utils/RNoise.js +51 -0
- package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/SceneOptimizer.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/ARButton.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
- package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +28 -34
- package/src/Three.Core.js +3 -1
- package/src/Three.TSL.js +35 -14
- package/src/Three.WebGPU.Nodes.js +5 -0
- package/src/Three.WebGPU.js +13 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +18 -4
- package/src/animation/AnimationClip.js +0 -139
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyBinding.js +2 -2
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +34 -4
- package/src/cameras/CubeCamera.js +20 -0
- package/src/cameras/StereoCamera.js +5 -2
- package/src/constants.js +90 -5
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +43 -9
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +69 -11
- package/src/core/Raycaster.js +3 -3
- package/src/core/RenderTarget.js +19 -6
- package/src/extras/PMREMGenerator.js +13 -22
- package/src/extras/TextureUtils.js +6 -2
- package/src/extras/core/ShapePath.js +149 -160
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/SphereGeometry.js +8 -3
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +6 -1
- package/src/helpers/HemisphereLightHelper.js +5 -0
- package/src/helpers/PointLightHelper.js +3 -25
- package/src/helpers/SpotLightHelper.js +4 -1
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/AudioLoader.js +11 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/DataTextureLoader.js +75 -42
- package/src/loaders/FileLoader.js +2 -3
- package/src/loaders/ImageBitmapLoader.js +12 -9
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/LoadingManager.js +5 -0
- package/src/loaders/MaterialLoader.js +37 -266
- package/src/loaders/ObjectLoader.js +48 -6
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/LineBasicMaterial.js +4 -0
- package/src/materials/Material.js +198 -1
- package/src/materials/MeshBasicMaterial.js +24 -0
- package/src/materials/MeshDepthMaterial.js +10 -0
- package/src/materials/MeshDistanceMaterial.js +10 -0
- package/src/materials/MeshLambertMaterial.js +49 -1
- package/src/materials/MeshMatcapMaterial.js +25 -1
- package/src/materials/MeshNormalMaterial.js +9 -1
- package/src/materials/MeshPhongMaterial.js +49 -1
- package/src/materials/MeshPhysicalMaterial.js +38 -0
- package/src/materials/MeshStandardMaterial.js +42 -1
- package/src/materials/MeshToonMaterial.js +35 -2
- package/src/materials/PointsMaterial.js +7 -0
- package/src/materials/ShaderMaterial.js +106 -1
- package/src/materials/SpriteMaterial.js +7 -0
- package/src/materials/nodes/Line2NodeMaterial.js +380 -297
- package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
- package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
- package/src/materials/nodes/NodeMaterial.js +153 -89
- package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
- package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
- package/src/math/Box3.js +5 -0
- package/src/math/FrustumArray.js +103 -133
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +12 -12
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +24 -9
- package/src/math/Matrix4.js +112 -74
- package/src/math/Plane.js +4 -3
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +13 -9
- package/src/math/Vector3.js +17 -15
- package/src/math/Vector4.js +15 -11
- package/src/math/interpolants/BezierInterpolant.js +106 -0
- package/src/nodes/Nodes.js +86 -71
- package/src/nodes/TSL.js +15 -13
- package/src/nodes/accessors/Arrays.js +5 -5
- package/src/nodes/accessors/Batch.js +108 -0
- package/src/nodes/accessors/Bitangent.js +7 -7
- package/src/nodes/accessors/BufferAttributeNode.js +120 -17
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +5 -5
- package/src/nodes/accessors/CubeTextureNode.js +27 -2
- package/src/nodes/accessors/Instance.js +264 -0
- package/src/nodes/accessors/MaterialNode.js +27 -3
- package/src/nodes/accessors/MaterialProperties.js +6 -8
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
- package/src/nodes/accessors/Normal.js +24 -24
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +39 -3
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
- package/src/nodes/accessors/ReferenceNode.js +9 -8
- package/src/nodes/accessors/ReflectVector.js +3 -3
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/Skinning.js +263 -0
- package/src/nodes/accessors/StorageBufferNode.js +16 -27
- package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
- package/src/nodes/accessors/StorageTextureNode.js +74 -11
- package/src/nodes/accessors/Tangent.js +8 -18
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +124 -25
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +4 -19
- package/src/nodes/core/ArrayNode.js +21 -2
- package/src/nodes/core/AssignNode.js +3 -3
- package/src/nodes/core/AttributeNode.js +3 -3
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +104 -5
- package/src/nodes/core/IndexNode.js +2 -1
- package/src/nodes/core/InputNode.js +1 -1
- package/src/nodes/core/InspectorNode.js +1 -1
- package/src/nodes/core/IsolateNode.js +1 -1
- package/src/nodes/core/MRTNode.js +55 -4
- package/src/nodes/core/Node.js +151 -17
- package/src/nodes/core/NodeBuilder.js +479 -101
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +20 -18
- package/src/nodes/core/OutputStructNode.js +13 -11
- package/src/nodes/core/OverrideContextNode.js +153 -0
- package/src/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +66 -4
- package/src/nodes/core/StackNode.js +91 -20
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +20 -8
- package/src/nodes/core/StructTypeNode.js +17 -23
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +56 -23
- package/src/nodes/core/VaryingNode.js +14 -21
- package/src/nodes/display/BlendModes.js +1 -105
- package/src/nodes/display/BumpMapNode.js +6 -1
- package/src/nodes/display/ColorAdjustment.js +27 -9
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +38 -9
- package/src/nodes/display/NormalMapNode.js +41 -6
- package/src/nodes/display/PassNode.js +157 -56
- package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
- package/src/nodes/display/RenderOutputNode.js +19 -10
- package/src/nodes/display/ScreenNode.js +4 -2
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
- package/src/nodes/display/ViewportTextureNode.js +39 -11
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/functions/VolumetricLightingModel.js +40 -7
- package/src/nodes/geometry/RangeNode.js +5 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
- package/src/nodes/gpgpu/ComputeNode.js +74 -48
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +30 -5
- package/src/nodes/lighting/IESSpotLightNode.js +40 -2
- package/src/nodes/lighting/LightingContextNode.js +10 -2
- package/src/nodes/lighting/LightsNode.js +97 -65
- package/src/nodes/lighting/PointShadowNode.js +166 -148
- package/src/nodes/lighting/ShadowFilterNode.js +74 -117
- package/src/nodes/lighting/ShadowNode.js +149 -51
- package/src/nodes/materialx/lib/mx_noise.js +2 -2
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +6 -6
- package/src/nodes/math/MathNode.js +115 -52
- package/src/nodes/math/OperatorNode.js +24 -23
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +34 -3
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +99 -33
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +12 -12
- package/src/nodes/utils/EquirectUV.js +30 -5
- package/src/nodes/utils/EventNode.js +31 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +2 -2
- package/src/nodes/utils/Packing.js +48 -5
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +41 -25
- package/src/nodes/utils/ReflectorNode.js +4 -4
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/StorageArrayElementNode.js +1 -1
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +66 -30
- package/src/objects/InstancedMesh.js +19 -3
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +344 -156
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +78 -13
- package/src/renderers/common/Background.js +26 -13
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +141 -57
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +49 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ClippingContext.js +10 -2
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Info.js +374 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Lighting.js +51 -19
- package/src/renderers/common/Pipelines.js +40 -7
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderList.js +41 -4
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +88 -16
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +21 -5
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +700 -163
- package/src/renderers/common/Sampler.js +16 -48
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +121 -9
- package/src/renderers/common/TimestampQueryPool.js +6 -4
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +84 -1
- package/src/renderers/common/XRManager.js +377 -51
- package/src/renderers/common/extras/PMREMGenerator.js +40 -61
- package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
- package/src/renderers/common/nodes/NodeLibrary.js +4 -4
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- 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/common.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -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_pars_begin.glsl.js +3 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk.js +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
- 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 -6
- package/src/renderers/shaders/UniformsLib.js +7 -5
- package/src/renderers/shaders/UniformsUtils.js +27 -5
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +9 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +271 -0
- package/src/renderers/webgl/WebGLProgram.js +54 -113
- package/src/renderers/webgl/WebGLPrograms.js +74 -55
- package/src/renderers/webgl/WebGLRenderLists.js +24 -1
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShaderCache.js +5 -11
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +75 -37
- package/src/renderers/webgl/WebGLTextures.js +230 -56
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
- package/src/renderers/webgpu/WebGPUBackend.js +733 -302
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
- package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
- package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
- package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
- package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
- package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
- package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
- package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
- package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
- package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
- package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
- package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
- package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
- package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
- package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +4 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/DepthTexture.js +1 -1
- package/src/textures/ExternalTexture.js +0 -3
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +16 -5
- package/src/utils.js +280 -3
- package/examples/fonts/LICENSE +0 -13
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
- package/examples/fonts/README.md +0 -11
- package/examples/fonts/droid/NOTICE +0 -190
- package/examples/fonts/droid/README.txt +0 -18
- package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
- package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
- package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
- package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
- package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
- package/examples/fonts/gentilis_bold.typeface.json +0 -1
- package/examples/fonts/gentilis_regular.typeface.json +0 -1
- package/examples/fonts/helvetiker_bold.typeface.json +0 -1
- package/examples/fonts/helvetiker_regular.typeface.json +0 -1
- package/examples/fonts/optimer_bold.typeface.json +0 -1
- package/examples/fonts/optimer_regular.typeface.json +0 -1
- package/examples/fonts/ttf/README.md +0 -9
- package/examples/fonts/ttf/kenpixel.ttf +0 -0
- package/examples/jsm/libs/ammo.wasm.js +0 -822
- package/examples/jsm/libs/ammo.wasm.wasm +0 -0
- package/examples/jsm/libs/draco/draco_encoder.js +0 -33
- package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
- package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
- package/examples/jsm/libs/opentype.module.js +0 -14506
- package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
- package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
- package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
- package/examples/jsm/lighting/TiledLighting.js +0 -42
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
- package/src/nodes/accessors/BatchNode.js +0 -163
- package/src/nodes/accessors/InstanceNode.js +0 -244
- package/src/nodes/accessors/InstancedMeshNode.js +0 -50
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/accessors/SkinningNode.js +0 -327
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -9,7 +9,7 @@ import RenderLists from './RenderLists.js';
|
|
|
9
9
|
import RenderContexts from './RenderContexts.js';
|
|
10
10
|
import Textures from './Textures.js';
|
|
11
11
|
import Background from './Background.js';
|
|
12
|
-
import
|
|
12
|
+
import NodeManager from './nodes/NodeManager.js';
|
|
13
13
|
import Color4 from './Color4.js';
|
|
14
14
|
import ClippingContext from './ClippingContext.js';
|
|
15
15
|
import QuadMesh from './QuadMesh.js';
|
|
@@ -30,12 +30,13 @@ import { Matrix4 } from '../../math/Matrix4.js';
|
|
|
30
30
|
import { Vector2 } from '../../math/Vector2.js';
|
|
31
31
|
import { Vector4 } from '../../math/Vector4.js';
|
|
32
32
|
import { RenderTarget } from '../../core/RenderTarget.js';
|
|
33
|
-
import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
|
|
33
|
+
import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, HalfFloatType, RGBAFormat, PCFShadowMap, VSMShadowMap } from '../../constants.js';
|
|
34
34
|
|
|
35
|
-
import { float, vec3, vec4 } from '../../nodes/tsl/TSLCore.js';
|
|
35
|
+
import { float, vec3, vec4, Fn } from '../../nodes/tsl/TSLCore.js';
|
|
36
36
|
import { reference } from '../../nodes/accessors/ReferenceNode.js';
|
|
37
37
|
import { highpModelNormalViewMatrix, highpModelViewMatrix } from '../../nodes/accessors/ModelNode.js';
|
|
38
|
-
import {
|
|
38
|
+
import { context } from '../../nodes/core/ContextNode.js';
|
|
39
|
+
import { error, warn, warnOnce, yieldToMain } from '../../utils.js';
|
|
39
40
|
|
|
40
41
|
const _scene = /*@__PURE__*/ new Scene();
|
|
41
42
|
const _drawingBufferSize = /*@__PURE__*/ new Vector2();
|
|
@@ -46,6 +47,8 @@ const _frustumArray = /*@__PURE__*/ new FrustumArray();
|
|
|
46
47
|
const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
|
|
47
48
|
const _vector4 = /*@__PURE__*/ new Vector4();
|
|
48
49
|
|
|
50
|
+
const _shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };
|
|
51
|
+
|
|
49
52
|
/**
|
|
50
53
|
* Base class for renderers.
|
|
51
54
|
*/
|
|
@@ -56,6 +59,7 @@ class Renderer {
|
|
|
56
59
|
*
|
|
57
60
|
* @typedef {Object} Renderer~Options
|
|
58
61
|
* @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
|
|
62
|
+
* @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
|
|
59
63
|
* @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
|
|
60
64
|
* @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
|
|
61
65
|
* @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
|
|
@@ -63,7 +67,7 @@ class Renderer {
|
|
|
63
67
|
* @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. This parameter can set to any other integer value than 0
|
|
64
68
|
* to overwrite the default.
|
|
65
69
|
* @property {?Function} [getFallback=null] - This callback function can be used to provide a fallback backend, if the primary backend can't be targeted.
|
|
66
|
-
* @property {number} [
|
|
70
|
+
* @property {number} [outputBufferType=HalfFloatType] - Defines the type of output buffers. The default `HalfFloatType` is recommend for best
|
|
67
71
|
* quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though.
|
|
68
72
|
* @property {boolean} [multiview=false] - If set to `true`, the renderer will use multiview during WebXR rendering if supported.
|
|
69
73
|
*/
|
|
@@ -90,13 +94,14 @@ class Renderer {
|
|
|
90
94
|
|
|
91
95
|
const {
|
|
92
96
|
logarithmicDepthBuffer = false,
|
|
97
|
+
reversedDepthBuffer = false,
|
|
93
98
|
alpha = true,
|
|
94
99
|
depth = true,
|
|
95
100
|
stencil = false,
|
|
96
101
|
antialias = false,
|
|
97
102
|
samples = 0,
|
|
98
103
|
getFallback = null,
|
|
99
|
-
|
|
104
|
+
outputBufferType = HalfFloatType,
|
|
100
105
|
multiview = false
|
|
101
106
|
} = parameters;
|
|
102
107
|
|
|
@@ -157,9 +162,19 @@ class Renderer {
|
|
|
157
162
|
*
|
|
158
163
|
* @type {boolean}
|
|
159
164
|
* @default false
|
|
165
|
+
* @readonly
|
|
160
166
|
*/
|
|
161
167
|
this.logarithmicDepthBuffer = logarithmicDepthBuffer;
|
|
162
168
|
|
|
169
|
+
/**
|
|
170
|
+
* Whether reversed depth buffer is enabled or not.
|
|
171
|
+
*
|
|
172
|
+
* @type {boolean}
|
|
173
|
+
* @default false
|
|
174
|
+
* @readonly
|
|
175
|
+
*/
|
|
176
|
+
this.reversedDepthBuffer = reversedDepthBuffer;
|
|
177
|
+
|
|
163
178
|
/**
|
|
164
179
|
* Defines the output color space of the renderer.
|
|
165
180
|
*
|
|
@@ -222,17 +237,13 @@ class Renderer {
|
|
|
222
237
|
this.info = new Info();
|
|
223
238
|
|
|
224
239
|
/**
|
|
225
|
-
*
|
|
240
|
+
* A global context node that stores override nodes for specific transformations or calculations.
|
|
226
241
|
* These nodes can be used to replace default behavior in the rendering pipeline.
|
|
227
242
|
*
|
|
228
|
-
* @type {
|
|
229
|
-
* @property {
|
|
230
|
-
* @property {?Node} modelNormalViewMatrix - An override node for the model normal view matrix.
|
|
243
|
+
* @type {ContextNode}
|
|
244
|
+
* @property {Object} value - The context value object.
|
|
231
245
|
*/
|
|
232
|
-
this.
|
|
233
|
-
modelViewMatrix: null,
|
|
234
|
-
modelNormalViewMatrix: null
|
|
235
|
-
};
|
|
246
|
+
this.contextNode = context();
|
|
236
247
|
|
|
237
248
|
/**
|
|
238
249
|
* The node library defines how certain library objects like materials, lights
|
|
@@ -320,7 +331,7 @@ class Renderer {
|
|
|
320
331
|
* A reference to a renderer module for managing node related logic.
|
|
321
332
|
*
|
|
322
333
|
* @private
|
|
323
|
-
* @type {?
|
|
334
|
+
* @type {?NodeManager}
|
|
324
335
|
* @default null
|
|
325
336
|
*/
|
|
326
337
|
this._nodes = null;
|
|
@@ -407,15 +418,14 @@ class Renderer {
|
|
|
407
418
|
this._background = null;
|
|
408
419
|
|
|
409
420
|
/**
|
|
421
|
+
* Cache for the fullscreen quad.
|
|
410
422
|
* This fullscreen quad is used for internal render passes
|
|
411
423
|
* like the tone mapping and color space output pass.
|
|
412
424
|
*
|
|
413
425
|
* @private
|
|
414
|
-
* @type {QuadMesh}
|
|
426
|
+
* @type {Map<Texture,QuadMesh>}
|
|
415
427
|
*/
|
|
416
|
-
this.
|
|
417
|
-
this._quad.name = 'Output Color Transform';
|
|
418
|
-
this._quad.material.name = 'outputColorTransform';
|
|
428
|
+
this._quadCache = new Map();
|
|
419
429
|
|
|
420
430
|
/**
|
|
421
431
|
* A reference to the current render context.
|
|
@@ -445,13 +455,12 @@ class Renderer {
|
|
|
445
455
|
this._transparentSort = null;
|
|
446
456
|
|
|
447
457
|
/**
|
|
448
|
-
*
|
|
458
|
+
* Cache of framebuffer targets per canvas target.
|
|
449
459
|
*
|
|
450
460
|
* @private
|
|
451
|
-
* @type {
|
|
452
|
-
* @default null
|
|
461
|
+
* @type {Map<CanvasTarget, RenderTarget>}
|
|
453
462
|
*/
|
|
454
|
-
this.
|
|
463
|
+
this._frameBufferTargets = new Map();
|
|
455
464
|
|
|
456
465
|
const alphaClear = this.alpha === true ? 0 : 1;
|
|
457
466
|
|
|
@@ -563,8 +572,7 @@ class Renderer {
|
|
|
563
572
|
* and pipeline updates.
|
|
564
573
|
*
|
|
565
574
|
* @private
|
|
566
|
-
* @type {
|
|
567
|
-
* @default null
|
|
575
|
+
* @type {Function}
|
|
568
576
|
*/
|
|
569
577
|
this._handleObjectFunction = this._renderObjectDirect;
|
|
570
578
|
|
|
@@ -587,7 +595,18 @@ class Renderer {
|
|
|
587
595
|
this.onDeviceLost = this._onDeviceLost;
|
|
588
596
|
|
|
589
597
|
/**
|
|
590
|
-
*
|
|
598
|
+
* A callback function that defines what should happen when an uncaptured
|
|
599
|
+
* backend error is reported (e.g. a WebGPU validation/out-of-memory/internal
|
|
600
|
+
* error raised outside an error scope). Applications can override this to
|
|
601
|
+
* surface errors in their own UI without letting them escalate to a device
|
|
602
|
+
* loss. The default implementation logs to the console.
|
|
603
|
+
*
|
|
604
|
+
* @type {Function}
|
|
605
|
+
*/
|
|
606
|
+
this.onError = this._onError;
|
|
607
|
+
|
|
608
|
+
/**
|
|
609
|
+
* Defines the type of output buffers. The default `HalfFloatType` is recommend for
|
|
591
610
|
* best quality. To save memory and bandwidth, `UnsignedByteType` might be used.
|
|
592
611
|
* This will reduce rendering quality though.
|
|
593
612
|
*
|
|
@@ -595,7 +614,7 @@ class Renderer {
|
|
|
595
614
|
* @type {number}
|
|
596
615
|
* @default HalfFloatType
|
|
597
616
|
*/
|
|
598
|
-
this.
|
|
617
|
+
this._outputBufferType = outputBufferType;
|
|
599
618
|
|
|
600
619
|
/**
|
|
601
620
|
* A cache for shadow nodes per material
|
|
@@ -614,6 +633,16 @@ class Renderer {
|
|
|
614
633
|
*/
|
|
615
634
|
this._initialized = false;
|
|
616
635
|
|
|
636
|
+
/**
|
|
637
|
+
* The call depth of the renderer. Counts the number of
|
|
638
|
+
* nested render calls.
|
|
639
|
+
*
|
|
640
|
+
* @private
|
|
641
|
+
* @type {number}
|
|
642
|
+
* @default - 1
|
|
643
|
+
*/
|
|
644
|
+
this._callDepth = - 1;
|
|
645
|
+
|
|
617
646
|
/**
|
|
618
647
|
* A reference to the promise which initializes the renderer.
|
|
619
648
|
*
|
|
@@ -632,6 +661,16 @@ class Renderer {
|
|
|
632
661
|
*/
|
|
633
662
|
this._compilationPromises = null;
|
|
634
663
|
|
|
664
|
+
/**
|
|
665
|
+
* When an override material is in use, this property points to the current
|
|
666
|
+
* source material during the rendering of a render object.
|
|
667
|
+
*
|
|
668
|
+
* @private
|
|
669
|
+
* @type {?Material}
|
|
670
|
+
* @default null
|
|
671
|
+
*/
|
|
672
|
+
this._currentSourceMaterial = null;
|
|
673
|
+
|
|
635
674
|
/**
|
|
636
675
|
* Whether the renderer should render transparent render objects or not.
|
|
637
676
|
*
|
|
@@ -652,6 +691,7 @@ class Renderer {
|
|
|
652
691
|
* Shadow map configuration
|
|
653
692
|
* @typedef {Object} ShadowMapConfig
|
|
654
693
|
* @property {boolean} enabled - Whether to globally enable shadows or not.
|
|
694
|
+
* @property {boolean} transmitted - Whether to enable light transmission through non-opaque materials.
|
|
655
695
|
* @property {number} type - The shadow map type.
|
|
656
696
|
*/
|
|
657
697
|
|
|
@@ -662,6 +702,7 @@ class Renderer {
|
|
|
662
702
|
*/
|
|
663
703
|
this.shadowMap = {
|
|
664
704
|
enabled: false,
|
|
705
|
+
transmitted: false,
|
|
665
706
|
type: PCFShadowMap
|
|
666
707
|
};
|
|
667
708
|
|
|
@@ -696,10 +737,13 @@ class Renderer {
|
|
|
696
737
|
onShaderError: null,
|
|
697
738
|
getShaderAsync: async ( scene, camera, object ) => {
|
|
698
739
|
|
|
699
|
-
await this.compileAsync(
|
|
740
|
+
await this.compileAsync( object, camera, scene );
|
|
741
|
+
|
|
742
|
+
const useFrameBufferTarget = this.needsFrameBufferTarget && this._renderTarget === null;
|
|
743
|
+
const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : ( this._renderTarget || this._outputRenderTarget );
|
|
700
744
|
|
|
701
745
|
const renderList = this._renderLists.get( scene, camera );
|
|
702
|
-
const renderContext = this._renderContexts.get(
|
|
746
|
+
const renderContext = this._renderContexts.get( renderTarget, this._mrt );
|
|
703
747
|
|
|
704
748
|
const material = scene.overrideMaterial || object.material;
|
|
705
749
|
|
|
@@ -763,18 +807,18 @@ class Renderer {
|
|
|
763
807
|
|
|
764
808
|
}
|
|
765
809
|
|
|
766
|
-
this._nodes = new
|
|
810
|
+
this._nodes = new NodeManager( this, backend );
|
|
767
811
|
this._animation = new Animation( this, this._nodes, this.info );
|
|
768
|
-
this._attributes = new Attributes( backend );
|
|
812
|
+
this._attributes = new Attributes( backend, this.info );
|
|
769
813
|
this._background = new Background( this, this._nodes );
|
|
770
814
|
this._geometries = new Geometries( this._attributes, this.info );
|
|
771
815
|
this._textures = new Textures( this, backend, this.info );
|
|
772
|
-
this._pipelines = new Pipelines( backend, this._nodes );
|
|
816
|
+
this._pipelines = new Pipelines( backend, this._nodes, this.info );
|
|
773
817
|
this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );
|
|
774
818
|
this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
|
|
775
819
|
this._renderLists = new RenderLists( this.lighting );
|
|
776
820
|
this._bundles = new RenderBundles();
|
|
777
|
-
this._renderContexts = new RenderContexts();
|
|
821
|
+
this._renderContexts = new RenderContexts( this );
|
|
778
822
|
|
|
779
823
|
//
|
|
780
824
|
|
|
@@ -835,7 +879,7 @@ class Renderer {
|
|
|
835
879
|
* @param {Object3D} scene - The scene or 3D object to precompile.
|
|
836
880
|
* @param {Camera} camera - The camera that is used to render the scene.
|
|
837
881
|
* @param {?Scene} targetScene - If the first argument is a 3D object, this parameter must represent the scene the 3D object is going to be added.
|
|
838
|
-
* @return {Promise
|
|
882
|
+
* @return {Promise} A Promise that resolves when the compile has been finished.
|
|
839
883
|
*/
|
|
840
884
|
async compileAsync( scene, camera, targetScene = null ) {
|
|
841
885
|
|
|
@@ -850,16 +894,21 @@ class Renderer {
|
|
|
850
894
|
const previousRenderId = nodeFrame.renderId;
|
|
851
895
|
const previousRenderContext = this._currentRenderContext;
|
|
852
896
|
const previousRenderObjectFunction = this._currentRenderObjectFunction;
|
|
897
|
+
const previousHandleObjectFunction = this._handleObjectFunction;
|
|
853
898
|
const previousCompilationPromises = this._compilationPromises;
|
|
854
899
|
|
|
855
900
|
//
|
|
856
901
|
|
|
857
|
-
const sceneRef = ( scene.isScene === true ) ? scene : _scene;
|
|
858
|
-
|
|
859
902
|
if ( targetScene === null ) targetScene = scene;
|
|
860
903
|
|
|
861
|
-
|
|
862
|
-
|
|
904
|
+
// Use the actual scene for caching when compiling individual objects
|
|
905
|
+
// This ensures cache keys match between compileAsync and render
|
|
906
|
+
const sceneRef = ( scene.isScene === true ) ? scene : ( targetScene.isScene === true ) ? targetScene : _scene;
|
|
907
|
+
|
|
908
|
+
// Match render()'s logic: use frameBufferTarget when needsFrameBufferTarget is true
|
|
909
|
+
const useFrameBufferTarget = this.needsFrameBufferTarget && this._renderTarget === null;
|
|
910
|
+
const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : ( this._renderTarget || this._outputRenderTarget );
|
|
911
|
+
const renderContext = this._renderContexts.get( renderTarget, this._mrt );
|
|
863
912
|
const activeMipmapLevel = this._activeMipmapLevel;
|
|
864
913
|
|
|
865
914
|
const compilationPromises = [];
|
|
@@ -887,11 +936,31 @@ class Renderer {
|
|
|
887
936
|
|
|
888
937
|
//
|
|
889
938
|
|
|
939
|
+
if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
|
|
940
|
+
|
|
941
|
+
camera = this._updateCamera( camera );
|
|
942
|
+
|
|
943
|
+
//
|
|
944
|
+
|
|
890
945
|
sceneRef.onBeforeRender( this, scene, camera, renderTarget );
|
|
891
946
|
|
|
892
947
|
//
|
|
893
948
|
|
|
894
|
-
const
|
|
949
|
+
const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
|
|
950
|
+
|
|
951
|
+
if ( camera.isArrayCamera ) {
|
|
952
|
+
|
|
953
|
+
frustum.setFromArrayCamera( camera );
|
|
954
|
+
|
|
955
|
+
} else {
|
|
956
|
+
|
|
957
|
+
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
|
|
958
|
+
frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
|
|
959
|
+
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
// Use sceneRef for render list to ensure lightsNode matches between compileAsync and render
|
|
963
|
+
const renderList = this._renderLists.get( sceneRef, camera );
|
|
895
964
|
renderList.begin();
|
|
896
965
|
|
|
897
966
|
this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
|
|
@@ -933,9 +1002,17 @@ class Renderer {
|
|
|
933
1002
|
|
|
934
1003
|
//
|
|
935
1004
|
|
|
936
|
-
|
|
1005
|
+
if ( targetScene !== scene ) {
|
|
937
1006
|
|
|
938
|
-
|
|
1007
|
+
this._background.update( targetScene, renderList, renderContext );
|
|
1008
|
+
|
|
1009
|
+
} else {
|
|
1010
|
+
|
|
1011
|
+
this._background.update( sceneRef, renderList, renderContext );
|
|
1012
|
+
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
// process render lists - _createObjectPipeline will push async promises to _compilationPromises
|
|
939
1016
|
|
|
940
1017
|
const opaqueObjects = renderList.opaque;
|
|
941
1018
|
const transparentObjects = renderList.transparent;
|
|
@@ -951,13 +1028,41 @@ class Renderer {
|
|
|
951
1028
|
|
|
952
1029
|
this._currentRenderContext = previousRenderContext;
|
|
953
1030
|
this._currentRenderObjectFunction = previousRenderObjectFunction;
|
|
1031
|
+
this._handleObjectFunction = previousHandleObjectFunction;
|
|
954
1032
|
this._compilationPromises = previousCompilationPromises;
|
|
955
1033
|
|
|
956
|
-
|
|
1034
|
+
// Process compilation work items sequentially to avoid freezing
|
|
1035
|
+
// Yields between objects to keep animation smooth
|
|
1036
|
+
|
|
1037
|
+
for ( const item of compilationPromises ) {
|
|
957
1038
|
|
|
958
|
-
|
|
1039
|
+
const renderObject = this._objects.get( item.object, item.material, item.scene, item.camera, item.lightsNode, item.renderContext, item.clippingContext, item.passId );
|
|
1040
|
+
renderObject.drawRange = item.object.geometry.drawRange;
|
|
1041
|
+
renderObject.group = item.group;
|
|
959
1042
|
|
|
960
|
-
|
|
1043
|
+
// Use async node building to yield to main thread
|
|
1044
|
+
await this._nodes.getForRenderAsync( renderObject );
|
|
1045
|
+
|
|
1046
|
+
this._nodes.updateBefore( renderObject );
|
|
1047
|
+
this._geometries.updateForRender( renderObject );
|
|
1048
|
+
this._nodes.updateForRender( renderObject );
|
|
1049
|
+
this._bindings.updateForRender( renderObject );
|
|
1050
|
+
|
|
1051
|
+
// Wait for pipeline creation
|
|
1052
|
+
const pipelinePromises = [];
|
|
1053
|
+
this._pipelines.getForRender( renderObject, pipelinePromises );
|
|
1054
|
+
if ( pipelinePromises.length > 0 ) {
|
|
1055
|
+
|
|
1056
|
+
await Promise.all( pipelinePromises );
|
|
1057
|
+
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
this._nodes.updateAfter( renderObject );
|
|
1061
|
+
|
|
1062
|
+
// Yield between objects to allow animation frames
|
|
1063
|
+
await yieldToMain();
|
|
1064
|
+
|
|
1065
|
+
}
|
|
961
1066
|
|
|
962
1067
|
}
|
|
963
1068
|
|
|
@@ -996,11 +1101,6 @@ class Renderer {
|
|
|
996
1101
|
|
|
997
1102
|
//
|
|
998
1103
|
|
|
999
|
-
/**
|
|
1000
|
-
* Sets the inspector instance. The inspector can be any class that extends from `InspectorBase`.
|
|
1001
|
-
*
|
|
1002
|
-
* @param {InspectorBase} value - The new inspector.
|
|
1003
|
-
*/
|
|
1004
1104
|
set inspector( value ) {
|
|
1005
1105
|
|
|
1006
1106
|
if ( this._inspector !== null ) {
|
|
@@ -1014,6 +1114,11 @@ class Renderer {
|
|
|
1014
1114
|
|
|
1015
1115
|
}
|
|
1016
1116
|
|
|
1117
|
+
/**
|
|
1118
|
+
* The inspector instance. The inspector can be any class that extends from `InspectorBase`.
|
|
1119
|
+
*
|
|
1120
|
+
* @type {InspectorBase}
|
|
1121
|
+
*/
|
|
1017
1122
|
get inspector() {
|
|
1018
1123
|
|
|
1019
1124
|
return this._inspector;
|
|
@@ -1031,15 +1136,17 @@ class Renderer {
|
|
|
1031
1136
|
*/
|
|
1032
1137
|
set highPrecision( value ) {
|
|
1033
1138
|
|
|
1139
|
+
const contextNodeData = this.contextNode.value;
|
|
1140
|
+
|
|
1034
1141
|
if ( value === true ) {
|
|
1035
1142
|
|
|
1036
|
-
|
|
1037
|
-
|
|
1143
|
+
contextNodeData.modelViewMatrix = highpModelViewMatrix;
|
|
1144
|
+
contextNodeData.modelNormalViewMatrix = highpModelNormalViewMatrix;
|
|
1038
1145
|
|
|
1039
1146
|
} else if ( this.highPrecision ) {
|
|
1040
1147
|
|
|
1041
|
-
|
|
1042
|
-
|
|
1148
|
+
delete contextNodeData.modelViewMatrix;
|
|
1149
|
+
delete contextNodeData.modelNormalViewMatrix;
|
|
1043
1150
|
|
|
1044
1151
|
}
|
|
1045
1152
|
|
|
@@ -1053,7 +1160,9 @@ class Renderer {
|
|
|
1053
1160
|
*/
|
|
1054
1161
|
get highPrecision() {
|
|
1055
1162
|
|
|
1056
|
-
|
|
1163
|
+
const contextNodeData = this.contextNode.value;
|
|
1164
|
+
|
|
1165
|
+
return contextNodeData.modelViewMatrix === highpModelViewMatrix && contextNodeData.modelNormalViewMatrix === highpModelNormalViewMatrix;
|
|
1057
1166
|
|
|
1058
1167
|
}
|
|
1059
1168
|
|
|
@@ -1083,13 +1192,27 @@ class Renderer {
|
|
|
1083
1192
|
}
|
|
1084
1193
|
|
|
1085
1194
|
/**
|
|
1086
|
-
* Returns the
|
|
1195
|
+
* Returns the output buffer type.
|
|
1087
1196
|
*
|
|
1088
|
-
* @return {number} The
|
|
1197
|
+
* @return {number} The output buffer type.
|
|
1089
1198
|
*/
|
|
1090
|
-
|
|
1199
|
+
getOutputBufferType() {
|
|
1091
1200
|
|
|
1092
|
-
return this.
|
|
1201
|
+
return this._outputBufferType;
|
|
1202
|
+
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
/**
|
|
1206
|
+
* Returns the output buffer type.
|
|
1207
|
+
*
|
|
1208
|
+
* @deprecated since r182. Use `.getOutputBufferType()` instead.
|
|
1209
|
+
* @return {number} The output buffer type.
|
|
1210
|
+
*/
|
|
1211
|
+
getColorBufferType() { // @deprecated, r182
|
|
1212
|
+
|
|
1213
|
+
warnOnce( 'Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".' );
|
|
1214
|
+
|
|
1215
|
+
return this.getOutputBufferType();
|
|
1093
1216
|
|
|
1094
1217
|
}
|
|
1095
1218
|
|
|
@@ -1115,6 +1238,41 @@ class Renderer {
|
|
|
1115
1238
|
|
|
1116
1239
|
}
|
|
1117
1240
|
|
|
1241
|
+
/**
|
|
1242
|
+
* Default implementation of the uncaptured backend error callback.
|
|
1243
|
+
*
|
|
1244
|
+
* @private
|
|
1245
|
+
* @param {Object} info - Information about the uncaptured error.
|
|
1246
|
+
*/
|
|
1247
|
+
_onError( info ) {
|
|
1248
|
+
|
|
1249
|
+
let errorMessage = `WebGPURenderer: Uncaptured ${ info.api } ${ info.type }`;
|
|
1250
|
+
|
|
1251
|
+
if ( info.message ) {
|
|
1252
|
+
|
|
1253
|
+
errorMessage += `: ${ info.message }`;
|
|
1254
|
+
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1257
|
+
error( errorMessage );
|
|
1258
|
+
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
/**
|
|
1262
|
+
* Returns `true` if the cached GPU render bundle for the given bundle group is
|
|
1263
|
+
* out-of-date and must be recorded again.
|
|
1264
|
+
*
|
|
1265
|
+
* @private
|
|
1266
|
+
* @param {BundleGroup} bundleGroup - The bundle group.
|
|
1267
|
+
* @param {Object} renderBundleData - The backend data of the render bundle.
|
|
1268
|
+
* @return {boolean} Whether the cached render bundle needs an update.
|
|
1269
|
+
*/
|
|
1270
|
+
_bundleNeedsUpdate( bundleGroup, renderBundleData ) {
|
|
1271
|
+
|
|
1272
|
+
return renderBundleData.bundleGPU === undefined || bundleGroup.version !== renderBundleData.version;
|
|
1273
|
+
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1118
1276
|
/**
|
|
1119
1277
|
* Renders the given render bundle.
|
|
1120
1278
|
*
|
|
@@ -1131,28 +1289,14 @@ class Renderer {
|
|
|
1131
1289
|
|
|
1132
1290
|
//
|
|
1133
1291
|
|
|
1134
|
-
const renderBundle = this._bundles.get( bundleGroup, camera );
|
|
1292
|
+
const renderBundle = this._bundles.get( bundleGroup, camera, renderContext );
|
|
1135
1293
|
const renderBundleData = this.backend.get( renderBundle );
|
|
1136
|
-
|
|
1137
|
-
if ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();
|
|
1138
|
-
|
|
1139
|
-
//
|
|
1140
|
-
|
|
1141
|
-
const needsUpdate = bundleGroup.version !== renderBundleData.version;
|
|
1142
|
-
const renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || needsUpdate;
|
|
1143
|
-
|
|
1144
|
-
renderBundleData.renderContexts.add( renderContext );
|
|
1294
|
+
const renderBundleNeedsUpdate = this._bundleNeedsUpdate( bundleGroup, renderBundleData );
|
|
1145
1295
|
|
|
1146
1296
|
if ( renderBundleNeedsUpdate ) {
|
|
1147
1297
|
|
|
1148
1298
|
this.backend.beginBundle( renderContext );
|
|
1149
1299
|
|
|
1150
|
-
if ( renderBundleData.renderObjects === undefined || needsUpdate ) {
|
|
1151
|
-
|
|
1152
|
-
renderBundleData.renderObjects = [];
|
|
1153
|
-
|
|
1154
|
-
}
|
|
1155
|
-
|
|
1156
1300
|
this._currentRenderBundle = renderBundle;
|
|
1157
1301
|
|
|
1158
1302
|
const {
|
|
@@ -1184,6 +1328,7 @@ class Renderer {
|
|
|
1184
1328
|
|
|
1185
1329
|
this._nodes.updateBefore( renderObject );
|
|
1186
1330
|
|
|
1331
|
+
this._geometries.updateForRender( renderObject );
|
|
1187
1332
|
this._nodes.updateForRender( renderObject );
|
|
1188
1333
|
this._bindings.updateForRender( renderObject );
|
|
1189
1334
|
|
|
@@ -1218,7 +1363,7 @@ class Renderer {
|
|
|
1218
1363
|
|
|
1219
1364
|
if ( this._initialized === false ) {
|
|
1220
1365
|
|
|
1221
|
-
throw new Error( 'Renderer: .render() called before the backend is initialized. Use "await renderer.init();" before rendering.' );
|
|
1366
|
+
throw new Error( 'THREE.Renderer: .render() called before the backend is initialized. Use "await renderer.init();" before rendering.' );
|
|
1222
1367
|
|
|
1223
1368
|
}
|
|
1224
1369
|
|
|
@@ -1238,6 +1383,37 @@ class Renderer {
|
|
|
1238
1383
|
|
|
1239
1384
|
}
|
|
1240
1385
|
|
|
1386
|
+
_renderOutputLayers( quad, renderTarget ) {
|
|
1387
|
+
|
|
1388
|
+
if ( renderTarget.texture.isArrayTexture !== true || renderTarget.texture.image.depth <= 1 ) {
|
|
1389
|
+
|
|
1390
|
+
this._renderScene( quad, quad.camera, false );
|
|
1391
|
+
return;
|
|
1392
|
+
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
const currentActiveCubeFace = this._activeCubeFace;
|
|
1396
|
+
|
|
1397
|
+
try {
|
|
1398
|
+
|
|
1399
|
+
for ( let layer = 0; layer < renderTarget.texture.image.depth; layer ++ ) {
|
|
1400
|
+
|
|
1401
|
+
this._nodes.setOutputLayerIndex( layer );
|
|
1402
|
+
this._activeCubeFace = layer;
|
|
1403
|
+
|
|
1404
|
+
this._renderScene( quad, quad.camera, false );
|
|
1405
|
+
|
|
1406
|
+
}
|
|
1407
|
+
|
|
1408
|
+
} finally {
|
|
1409
|
+
|
|
1410
|
+
this._nodes.setOutputLayerIndex( 0 );
|
|
1411
|
+
this._activeCubeFace = currentActiveCubeFace;
|
|
1412
|
+
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1241
1417
|
/**
|
|
1242
1418
|
* Returns an internal render target which is used when computing the output tone mapping
|
|
1243
1419
|
* and color space conversion. Unlike in `WebGLRenderer`, this is done in a separate render
|
|
@@ -1258,14 +1434,17 @@ class Renderer {
|
|
|
1258
1434
|
const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
|
|
1259
1435
|
const { depth, stencil } = this;
|
|
1260
1436
|
|
|
1261
|
-
|
|
1437
|
+
// TODO: Unify CanvasTarget and OutputRenderTarget
|
|
1438
|
+
const target = this._outputRenderTarget || this._canvasTarget;
|
|
1439
|
+
|
|
1440
|
+
let frameBufferTarget = this._frameBufferTargets.get( target );
|
|
1262
1441
|
|
|
1263
|
-
if ( frameBufferTarget ===
|
|
1442
|
+
if ( frameBufferTarget === undefined ) {
|
|
1264
1443
|
|
|
1265
1444
|
frameBufferTarget = new RenderTarget( width, height, {
|
|
1266
1445
|
depthBuffer: depth,
|
|
1267
1446
|
stencilBuffer: stencil,
|
|
1268
|
-
type: this.
|
|
1447
|
+
type: this._outputBufferType,
|
|
1269
1448
|
format: RGBAFormat,
|
|
1270
1449
|
colorSpace: ColorManagement.workingColorSpace,
|
|
1271
1450
|
generateMipmaps: false,
|
|
@@ -1276,7 +1455,19 @@ class Renderer {
|
|
|
1276
1455
|
|
|
1277
1456
|
frameBufferTarget.isPostProcessingRenderTarget = true;
|
|
1278
1457
|
|
|
1279
|
-
|
|
1458
|
+
const dispose = () => {
|
|
1459
|
+
|
|
1460
|
+
target.removeEventListener( 'dispose', dispose );
|
|
1461
|
+
|
|
1462
|
+
frameBufferTarget.dispose();
|
|
1463
|
+
|
|
1464
|
+
this._frameBufferTargets.delete( target );
|
|
1465
|
+
|
|
1466
|
+
};
|
|
1467
|
+
|
|
1468
|
+
target.addEventListener( 'dispose', dispose );
|
|
1469
|
+
|
|
1470
|
+
this._frameBufferTargets.set( target, frameBufferTarget );
|
|
1280
1471
|
|
|
1281
1472
|
}
|
|
1282
1473
|
|
|
@@ -1284,6 +1475,7 @@ class Renderer {
|
|
|
1284
1475
|
|
|
1285
1476
|
frameBufferTarget.depthBuffer = depth;
|
|
1286
1477
|
frameBufferTarget.stencilBuffer = stencil;
|
|
1478
|
+
|
|
1287
1479
|
if ( outputRenderTarget !== null ) {
|
|
1288
1480
|
|
|
1289
1481
|
frameBufferTarget.setSize( outputRenderTarget.width, outputRenderTarget.height, outputRenderTarget.depth );
|
|
@@ -1294,14 +1486,20 @@ class Renderer {
|
|
|
1294
1486
|
|
|
1295
1487
|
}
|
|
1296
1488
|
|
|
1297
|
-
|
|
1489
|
+
// RenderTarget || CanvasTarget
|
|
1490
|
+
|
|
1491
|
+
const viewport = this._outputRenderTarget ? this._outputRenderTarget.viewport : target._viewport;
|
|
1492
|
+
const scissor = this._outputRenderTarget ? this._outputRenderTarget.scissor : target._scissor;
|
|
1493
|
+
const pixelRatio = this._outputRenderTarget ? 1 : target._pixelRatio;
|
|
1494
|
+
const scissorTest = this._outputRenderTarget ? this._outputRenderTarget.scissorTest : target._scissorTest;
|
|
1298
1495
|
|
|
1299
|
-
frameBufferTarget.viewport.copy(
|
|
1300
|
-
frameBufferTarget.scissor.copy(
|
|
1301
|
-
frameBufferTarget.viewport.multiplyScalar(
|
|
1302
|
-
frameBufferTarget.scissor.multiplyScalar(
|
|
1303
|
-
frameBufferTarget.scissorTest =
|
|
1496
|
+
frameBufferTarget.viewport.copy( viewport );
|
|
1497
|
+
frameBufferTarget.scissor.copy( scissor );
|
|
1498
|
+
frameBufferTarget.viewport.multiplyScalar( pixelRatio );
|
|
1499
|
+
frameBufferTarget.scissor.multiplyScalar( pixelRatio );
|
|
1500
|
+
frameBufferTarget.scissorTest = scissorTest;
|
|
1304
1501
|
frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;
|
|
1502
|
+
frameBufferTarget.useArrayDepthTexture = outputRenderTarget !== null ? outputRenderTarget.useArrayDepthTexture : false;
|
|
1305
1503
|
frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;
|
|
1306
1504
|
frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false;
|
|
1307
1505
|
|
|
@@ -1333,9 +1531,14 @@ class Renderer {
|
|
|
1333
1531
|
const previousRenderId = nodeFrame.renderId;
|
|
1334
1532
|
const previousRenderContext = this._currentRenderContext;
|
|
1335
1533
|
const previousRenderObjectFunction = this._currentRenderObjectFunction;
|
|
1534
|
+
const previousHandleObjectFunction = this._handleObjectFunction;
|
|
1535
|
+
|
|
1536
|
+
this.lighting.beginRender( scene );
|
|
1336
1537
|
|
|
1337
1538
|
//
|
|
1338
1539
|
|
|
1540
|
+
this._callDepth ++;
|
|
1541
|
+
|
|
1339
1542
|
const sceneRef = ( scene.isScene === true ) ? scene : _scene;
|
|
1340
1543
|
|
|
1341
1544
|
const outputRenderTarget = this._renderTarget || this._outputRenderTarget;
|
|
@@ -1359,12 +1562,35 @@ class Renderer {
|
|
|
1359
1562
|
|
|
1360
1563
|
}
|
|
1361
1564
|
|
|
1565
|
+
// make sure a new render target has correct default depth values
|
|
1566
|
+
|
|
1567
|
+
if ( renderTarget !== null && renderTarget.depthBuffer === true ) {
|
|
1568
|
+
|
|
1569
|
+
const renderTargetData = this._textures.get( renderTarget );
|
|
1570
|
+
|
|
1571
|
+
if ( renderTargetData.depthInitialized !== true ) {
|
|
1572
|
+
|
|
1573
|
+
// we need a single manual clear if auto clear depth is disabled
|
|
1574
|
+
|
|
1575
|
+
if ( this.autoClear === false || ( this.autoClear === true && this.autoClearDepth === false ) ) {
|
|
1576
|
+
|
|
1577
|
+
this.clearDepth();
|
|
1578
|
+
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
renderTargetData.depthInitialized = true;
|
|
1582
|
+
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1362
1587
|
//
|
|
1363
1588
|
|
|
1364
|
-
const renderContext = this._renderContexts.get(
|
|
1589
|
+
const renderContext = this._renderContexts.get( renderTarget, this._mrt, this._callDepth );
|
|
1365
1590
|
|
|
1366
1591
|
this._currentRenderContext = renderContext;
|
|
1367
1592
|
this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
|
|
1593
|
+
this._handleObjectFunction = this._renderObjectDirect;
|
|
1368
1594
|
|
|
1369
1595
|
//
|
|
1370
1596
|
|
|
@@ -1382,39 +1608,9 @@ class Renderer {
|
|
|
1382
1608
|
|
|
1383
1609
|
//
|
|
1384
1610
|
|
|
1385
|
-
const coordinateSystem = this.coordinateSystem;
|
|
1386
|
-
const xr = this.xr;
|
|
1387
|
-
|
|
1388
|
-
if ( camera.coordinateSystem !== coordinateSystem && xr.isPresenting === false ) {
|
|
1389
|
-
|
|
1390
|
-
camera.coordinateSystem = coordinateSystem;
|
|
1391
|
-
camera.updateProjectionMatrix();
|
|
1392
|
-
|
|
1393
|
-
if ( camera.isArrayCamera ) {
|
|
1394
|
-
|
|
1395
|
-
for ( const subCamera of camera.cameras ) {
|
|
1396
|
-
|
|
1397
|
-
subCamera.coordinateSystem = coordinateSystem;
|
|
1398
|
-
subCamera.updateProjectionMatrix();
|
|
1399
|
-
|
|
1400
|
-
}
|
|
1401
|
-
|
|
1402
|
-
}
|
|
1403
|
-
|
|
1404
|
-
}
|
|
1405
|
-
|
|
1406
|
-
//
|
|
1407
|
-
|
|
1408
1611
|
if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
|
|
1409
1612
|
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
if ( xr.enabled === true && xr.isPresenting === true ) {
|
|
1413
|
-
|
|
1414
|
-
if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
|
|
1415
|
-
camera = xr.getCamera(); // use XR camera for rendering
|
|
1416
|
-
|
|
1417
|
-
}
|
|
1613
|
+
camera = this._updateCamera( camera );
|
|
1418
1614
|
|
|
1419
1615
|
//
|
|
1420
1616
|
|
|
@@ -1462,7 +1658,11 @@ class Renderer {
|
|
|
1462
1658
|
|
|
1463
1659
|
const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
|
|
1464
1660
|
|
|
1465
|
-
if (
|
|
1661
|
+
if ( camera.isArrayCamera ) {
|
|
1662
|
+
|
|
1663
|
+
frustum.setFromArrayCamera( camera );
|
|
1664
|
+
|
|
1665
|
+
} else {
|
|
1466
1666
|
|
|
1467
1667
|
_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
|
|
1468
1668
|
frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
|
|
@@ -1478,7 +1678,7 @@ class Renderer {
|
|
|
1478
1678
|
|
|
1479
1679
|
if ( this.sortObjects === true ) {
|
|
1480
1680
|
|
|
1481
|
-
renderList.sort( this._opaqueSort, this._transparentSort );
|
|
1681
|
+
renderList.sort( this._opaqueSort, this._transparentSort, camera.reversedDepth );
|
|
1482
1682
|
|
|
1483
1683
|
}
|
|
1484
1684
|
|
|
@@ -1561,12 +1761,16 @@ class Renderer {
|
|
|
1561
1761
|
// restore render tree
|
|
1562
1762
|
|
|
1563
1763
|
nodeFrame.renderId = previousRenderId;
|
|
1564
|
-
|
|
1565
1764
|
this._currentRenderContext = previousRenderContext;
|
|
1566
1765
|
this._currentRenderObjectFunction = previousRenderObjectFunction;
|
|
1766
|
+
this._handleObjectFunction = previousHandleObjectFunction;
|
|
1767
|
+
|
|
1768
|
+
this.lighting.finishRender( scene );
|
|
1567
1769
|
|
|
1568
1770
|
//
|
|
1569
1771
|
|
|
1772
|
+
this._callDepth --;
|
|
1773
|
+
|
|
1570
1774
|
if ( frameBufferTarget !== null ) {
|
|
1571
1775
|
|
|
1572
1776
|
this.setRenderTarget( outputRenderTarget, activeCubeFace, activeMipmapLevel );
|
|
@@ -1608,12 +1812,52 @@ class Renderer {
|
|
|
1608
1812
|
*/
|
|
1609
1813
|
_renderOutput( renderTarget ) {
|
|
1610
1814
|
|
|
1611
|
-
const
|
|
1815
|
+
const cacheKey = this._nodes.getOutputCacheKey();
|
|
1612
1816
|
|
|
1613
|
-
|
|
1817
|
+
let quadData = this._quadCache.get( renderTarget.texture );
|
|
1818
|
+
let quad;
|
|
1819
|
+
|
|
1820
|
+
if ( quadData === undefined ) {
|
|
1821
|
+
|
|
1822
|
+
quad = new QuadMesh( new NodeMaterial() );
|
|
1823
|
+
quad.name = 'Output Color Transform';
|
|
1824
|
+
quad.material.name = 'outputColorTransform';
|
|
1614
1825
|
|
|
1615
1826
|
quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
|
|
1616
|
-
|
|
1827
|
+
|
|
1828
|
+
quadData = {
|
|
1829
|
+
quad,
|
|
1830
|
+
cacheKey
|
|
1831
|
+
};
|
|
1832
|
+
|
|
1833
|
+
this._quadCache.set( renderTarget.texture, quadData );
|
|
1834
|
+
|
|
1835
|
+
// dispose logic
|
|
1836
|
+
|
|
1837
|
+
const dispose = () => {
|
|
1838
|
+
|
|
1839
|
+
quad.material.dispose();
|
|
1840
|
+
|
|
1841
|
+
this._quadCache.delete( renderTarget.texture );
|
|
1842
|
+
|
|
1843
|
+
renderTarget.texture.removeEventListener( 'dispose', dispose );
|
|
1844
|
+
|
|
1845
|
+
};
|
|
1846
|
+
|
|
1847
|
+
renderTarget.texture.addEventListener( 'dispose', dispose );
|
|
1848
|
+
|
|
1849
|
+
} else {
|
|
1850
|
+
|
|
1851
|
+
quad = quadData.quad;
|
|
1852
|
+
|
|
1853
|
+
if ( quadData.cacheKey !== cacheKey ) {
|
|
1854
|
+
|
|
1855
|
+
quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
|
|
1856
|
+
quad.material.needsUpdate = true;
|
|
1857
|
+
|
|
1858
|
+
quadData.cacheKey = cacheKey;
|
|
1859
|
+
|
|
1860
|
+
}
|
|
1617
1861
|
|
|
1618
1862
|
}
|
|
1619
1863
|
|
|
@@ -1624,8 +1868,7 @@ class Renderer {
|
|
|
1624
1868
|
|
|
1625
1869
|
this.autoClear = false;
|
|
1626
1870
|
this.xr.enabled = false;
|
|
1627
|
-
|
|
1628
|
-
this._renderScene( quad, quad.camera, false );
|
|
1871
|
+
this._renderOutputLayers( quad, renderTarget );
|
|
1629
1872
|
|
|
1630
1873
|
this.autoClear = currentAutoClear;
|
|
1631
1874
|
this.xr.enabled = currentXR;
|
|
@@ -1640,7 +1883,7 @@ class Renderer {
|
|
|
1640
1883
|
*/
|
|
1641
1884
|
getMaxAnisotropy() {
|
|
1642
1885
|
|
|
1643
|
-
return this.backend.getMaxAnisotropy();
|
|
1886
|
+
return this.backend.capabilities.getMaxAnisotropy();
|
|
1644
1887
|
|
|
1645
1888
|
}
|
|
1646
1889
|
|
|
@@ -1699,12 +1942,42 @@ class Renderer {
|
|
|
1699
1942
|
* from the GPU to the CPU in context of compute shaders.
|
|
1700
1943
|
*
|
|
1701
1944
|
* @async
|
|
1702
|
-
* @param {
|
|
1703
|
-
* @
|
|
1945
|
+
* @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
|
|
1946
|
+
* @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
|
|
1947
|
+
* @param {number} offset - The storage buffer attribute.
|
|
1948
|
+
* @param {number} count - The offset from which to start reading the
|
|
1949
|
+
* @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
|
|
1704
1950
|
*/
|
|
1705
|
-
async getArrayBufferAsync( attribute ) {
|
|
1951
|
+
async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
|
|
1952
|
+
|
|
1953
|
+
// tally the memory for this readback buffer
|
|
1954
|
+
if ( target !== null && target.isReadbackBuffer ) {
|
|
1706
1955
|
|
|
1707
|
-
|
|
1956
|
+
if ( this.info.memoryMap.has( target ) === false ) {
|
|
1957
|
+
|
|
1958
|
+
this.info.createReadbackBuffer( target );
|
|
1959
|
+
|
|
1960
|
+
const disposeInfo = () => {
|
|
1961
|
+
|
|
1962
|
+
target.removeEventListener( 'dispose', disposeInfo );
|
|
1963
|
+
|
|
1964
|
+
this.info.destroyReadbackBuffer( target );
|
|
1965
|
+
|
|
1966
|
+
};
|
|
1967
|
+
|
|
1968
|
+
target.addEventListener( 'dispose', disposeInfo );
|
|
1969
|
+
|
|
1970
|
+
}
|
|
1971
|
+
|
|
1972
|
+
}
|
|
1973
|
+
|
|
1974
|
+
if ( offset % 4 !== 0 || ( count > 0 && count % 4 !== 0 ) ) {
|
|
1975
|
+
|
|
1976
|
+
throw new Error( 'THREE.Renderer: "getArrayBufferAsync()" offset and count must be a multiple of 4.' );
|
|
1977
|
+
|
|
1978
|
+
}
|
|
1979
|
+
|
|
1980
|
+
return await this.backend.getArrayBufferAsync( attribute, target, offset, count );
|
|
1708
1981
|
|
|
1709
1982
|
}
|
|
1710
1983
|
|
|
@@ -1842,9 +2115,9 @@ class Renderer {
|
|
|
1842
2115
|
/**
|
|
1843
2116
|
* Defines the scissor rectangle.
|
|
1844
2117
|
*
|
|
1845
|
-
* @param {number | Vector4} x - The horizontal coordinate for the
|
|
2118
|
+
* @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the box in logical pixel unit.
|
|
1846
2119
|
* Instead of passing four arguments, the method also works with a single four-dimensional vector.
|
|
1847
|
-
* @param {number} y - The vertical coordinate for the
|
|
2120
|
+
* @param {number} y - The vertical coordinate for the upper left corner of the box in logical pixel unit.
|
|
1848
2121
|
* @param {number} width - The width of the scissor box in logical pixel unit.
|
|
1849
2122
|
* @param {number} height - The height of the scissor box in logical pixel unit.
|
|
1850
2123
|
*/
|
|
@@ -1895,8 +2168,8 @@ class Renderer {
|
|
|
1895
2168
|
/**
|
|
1896
2169
|
* Defines the viewport.
|
|
1897
2170
|
*
|
|
1898
|
-
* @param {number | Vector4} x - The horizontal coordinate for the
|
|
1899
|
-
* @param {number} y - The vertical coordinate for the
|
|
2171
|
+
* @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the viewport origin in logical pixel unit.
|
|
2172
|
+
* @param {number} y - The vertical coordinate for the upper left corner of the viewport origin in logical pixel unit.
|
|
1900
2173
|
* @param {number} width - The width of the viewport in logical pixel unit.
|
|
1901
2174
|
* @param {number} height - The height of the viewport in logical pixel unit.
|
|
1902
2175
|
* @param {number} minDepth - The minimum depth value of the viewport. WebGPU only.
|
|
@@ -1962,7 +2235,7 @@ class Renderer {
|
|
|
1962
2235
|
*/
|
|
1963
2236
|
getClearDepth() {
|
|
1964
2237
|
|
|
1965
|
-
return this._clearDepth;
|
|
2238
|
+
return ( this.reversedDepthBuffer === true ) ? 1 - this._clearDepth : this._clearDepth;
|
|
1966
2239
|
|
|
1967
2240
|
}
|
|
1968
2241
|
|
|
@@ -2026,7 +2299,7 @@ class Renderer {
|
|
|
2026
2299
|
|
|
2027
2300
|
if ( this._initialized === false ) {
|
|
2028
2301
|
|
|
2029
|
-
throw new Error( 'Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before
|
|
2302
|
+
throw new Error( 'THREE.Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
|
|
2030
2303
|
|
|
2031
2304
|
}
|
|
2032
2305
|
|
|
@@ -2040,7 +2313,7 @@ class Renderer {
|
|
|
2040
2313
|
|
|
2041
2314
|
const renderTargetData = this._textures.get( renderTarget );
|
|
2042
2315
|
|
|
2043
|
-
renderContext = this._renderContexts.
|
|
2316
|
+
renderContext = this._renderContexts.get( renderTarget, null, - 1 ); // using - 1 for the call depth to get a render context for the clear operation
|
|
2044
2317
|
renderContext.textures = renderTargetData.textures;
|
|
2045
2318
|
renderContext.depthTexture = renderTargetData.depthTexture;
|
|
2046
2319
|
renderContext.width = renderTargetData.width;
|
|
@@ -2049,10 +2322,18 @@ class Renderer {
|
|
|
2049
2322
|
renderContext.depth = renderTarget.depthBuffer;
|
|
2050
2323
|
renderContext.stencil = renderTarget.stencilBuffer;
|
|
2051
2324
|
// #30329
|
|
2052
|
-
|
|
2325
|
+
const color = this.backend.getClearColor();
|
|
2326
|
+
renderContext.clearColorValue.r = color.r;
|
|
2327
|
+
renderContext.clearColorValue.g = color.g;
|
|
2328
|
+
renderContext.clearColorValue.b = color.b;
|
|
2329
|
+
renderContext.clearColorValue.a = color.a;
|
|
2330
|
+
renderContext.clearDepthValue = this.getClearDepth();
|
|
2331
|
+
renderContext.clearStencilValue = this.getClearStencil();
|
|
2053
2332
|
renderContext.activeCubeFace = this.getActiveCubeFace();
|
|
2054
2333
|
renderContext.activeMipmapLevel = this.getActiveMipmapLevel();
|
|
2055
2334
|
|
|
2335
|
+
if ( renderTarget.depthBuffer === true ) renderTargetData.depthInitialized = true;
|
|
2336
|
+
|
|
2056
2337
|
}
|
|
2057
2338
|
|
|
2058
2339
|
this.backend.clear( color, depth, stencil, renderContext );
|
|
@@ -2266,7 +2547,11 @@ class Renderer {
|
|
|
2266
2547
|
this._renderContexts.dispose();
|
|
2267
2548
|
this._textures.dispose();
|
|
2268
2549
|
|
|
2269
|
-
|
|
2550
|
+
for ( const canvasTarget of this._frameBufferTargets.keys() ) {
|
|
2551
|
+
|
|
2552
|
+
canvasTarget.dispose();
|
|
2553
|
+
|
|
2554
|
+
}
|
|
2270
2555
|
|
|
2271
2556
|
Object.values( this.backend.timestampQueryPool ).forEach( queryPool => {
|
|
2272
2557
|
|
|
@@ -2312,7 +2597,7 @@ class Renderer {
|
|
|
2312
2597
|
/**
|
|
2313
2598
|
* Sets the output render target for the renderer.
|
|
2314
2599
|
*
|
|
2315
|
-
* @param {
|
|
2600
|
+
* @param {?RenderTarget} renderTarget - The render target to set as the output target.
|
|
2316
2601
|
*/
|
|
2317
2602
|
setOutputRenderTarget( renderTarget ) {
|
|
2318
2603
|
|
|
@@ -2360,6 +2645,7 @@ class Renderer {
|
|
|
2360
2645
|
/**
|
|
2361
2646
|
* Resets the renderer to the initial state before WebXR started.
|
|
2362
2647
|
*
|
|
2648
|
+
* @private
|
|
2363
2649
|
*/
|
|
2364
2650
|
_resetXRState() {
|
|
2365
2651
|
|
|
@@ -2367,8 +2653,11 @@ class Renderer {
|
|
|
2367
2653
|
this.setOutputRenderTarget( null );
|
|
2368
2654
|
this.setRenderTarget( null );
|
|
2369
2655
|
|
|
2370
|
-
this.
|
|
2371
|
-
|
|
2656
|
+
for ( const canvasTarget of this._frameBufferTargets.keys() ) {
|
|
2657
|
+
|
|
2658
|
+
canvasTarget.dispose();
|
|
2659
|
+
|
|
2660
|
+
}
|
|
2372
2661
|
|
|
2373
2662
|
}
|
|
2374
2663
|
|
|
@@ -2583,7 +2872,7 @@ class Renderer {
|
|
|
2583
2872
|
|
|
2584
2873
|
if ( this._initialized === false ) {
|
|
2585
2874
|
|
|
2586
|
-
throw new Error( 'Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before
|
|
2875
|
+
throw new Error( 'THREE.Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
|
|
2587
2876
|
|
|
2588
2877
|
}
|
|
2589
2878
|
|
|
@@ -2633,7 +2922,7 @@ class Renderer {
|
|
|
2633
2922
|
|
|
2634
2923
|
if ( this._initialized === false ) {
|
|
2635
2924
|
|
|
2636
|
-
throw new Error( 'Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before
|
|
2925
|
+
throw new Error( 'THREE.Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
|
|
2637
2926
|
|
|
2638
2927
|
}
|
|
2639
2928
|
|
|
@@ -2641,6 +2930,37 @@ class Renderer {
|
|
|
2641
2930
|
|
|
2642
2931
|
}
|
|
2643
2932
|
|
|
2933
|
+
/**
|
|
2934
|
+
* Initializes the given render target.
|
|
2935
|
+
*
|
|
2936
|
+
* @param {RenderTarget} renderTarget - The render target to intialize.
|
|
2937
|
+
*/
|
|
2938
|
+
initRenderTarget( renderTarget ) {
|
|
2939
|
+
|
|
2940
|
+
if ( this._initialized === false ) {
|
|
2941
|
+
|
|
2942
|
+
throw new Error( 'THREE.Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
|
|
2943
|
+
|
|
2944
|
+
}
|
|
2945
|
+
|
|
2946
|
+
this._textures.updateRenderTarget( renderTarget );
|
|
2947
|
+
|
|
2948
|
+
const renderTargetData = this._textures.get( renderTarget );
|
|
2949
|
+
|
|
2950
|
+
const renderContext = this._renderContexts.get( renderTarget );
|
|
2951
|
+
|
|
2952
|
+
renderContext.textures = renderTargetData.textures;
|
|
2953
|
+
renderContext.depthTexture = renderTargetData.depthTexture;
|
|
2954
|
+
renderContext.width = renderTargetData.width;
|
|
2955
|
+
renderContext.height = renderTargetData.height;
|
|
2956
|
+
renderContext.renderTarget = renderTarget;
|
|
2957
|
+
renderContext.depth = renderTarget.depthBuffer;
|
|
2958
|
+
renderContext.stencil = renderTarget.stencilBuffer;
|
|
2959
|
+
|
|
2960
|
+
this.backend.initRenderTarget( renderContext );
|
|
2961
|
+
|
|
2962
|
+
}
|
|
2963
|
+
|
|
2644
2964
|
/**
|
|
2645
2965
|
* Copies the current bound framebuffer into the given texture.
|
|
2646
2966
|
*
|
|
@@ -2750,6 +3070,7 @@ class Renderer {
|
|
|
2750
3070
|
* Analyzes the given 3D object's hierarchy and builds render lists from the
|
|
2751
3071
|
* processed hierarchy.
|
|
2752
3072
|
*
|
|
3073
|
+
* @private
|
|
2753
3074
|
* @param {Object3D} object - The 3D object to process (usually a scene).
|
|
2754
3075
|
* @param {Camera} camera - The camera the object is rendered with.
|
|
2755
3076
|
* @param {number} groupOrder - The group order is derived from the `renderOrder` of groups and is used to group 3D objects within groups.
|
|
@@ -2782,7 +3103,7 @@ class Renderer {
|
|
|
2782
3103
|
|
|
2783
3104
|
const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
|
|
2784
3105
|
|
|
2785
|
-
if ( ! object.frustumCulled || frustum.intersectsSprite( object
|
|
3106
|
+
if ( ! object.frustumCulled || frustum.intersectsSprite( object ) ) {
|
|
2786
3107
|
|
|
2787
3108
|
if ( this.sortObjects === true ) {
|
|
2788
3109
|
|
|
@@ -2808,7 +3129,7 @@ class Renderer {
|
|
|
2808
3129
|
|
|
2809
3130
|
const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
|
|
2810
3131
|
|
|
2811
|
-
if ( ! object.frustumCulled || frustum.intersectsObject( object
|
|
3132
|
+
if ( ! object.frustumCulled || frustum.intersectsObject( object ) ) {
|
|
2812
3133
|
|
|
2813
3134
|
const { geometry, material } = object;
|
|
2814
3135
|
|
|
@@ -2857,9 +3178,40 @@ class Renderer {
|
|
|
2857
3178
|
const baseRenderList = renderList;
|
|
2858
3179
|
|
|
2859
3180
|
// replace render list
|
|
3181
|
+
|
|
2860
3182
|
renderList = this._renderLists.get( object, camera );
|
|
2861
3183
|
|
|
2862
|
-
|
|
3184
|
+
const renderBundle = this._bundles.get( object, camera, this._currentRenderContext );
|
|
3185
|
+
const renderBundleData = this.backend.get( renderBundle );
|
|
3186
|
+
const renderBundleNeedsUpdate = this._bundleNeedsUpdate( object, renderBundleData );
|
|
3187
|
+
|
|
3188
|
+
if ( renderBundleNeedsUpdate ) {
|
|
3189
|
+
|
|
3190
|
+
// update render list if necessary
|
|
3191
|
+
|
|
3192
|
+
renderList.begin();
|
|
3193
|
+
|
|
3194
|
+
if ( renderBundleData.renderObjects === undefined ) {
|
|
3195
|
+
|
|
3196
|
+
renderBundleData.renderObjects = [];
|
|
3197
|
+
|
|
3198
|
+
} else {
|
|
3199
|
+
|
|
3200
|
+
renderBundleData.renderObjects.length = 0;
|
|
3201
|
+
|
|
3202
|
+
}
|
|
3203
|
+
|
|
3204
|
+
const children = object.children;
|
|
3205
|
+
|
|
3206
|
+
for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
3207
|
+
|
|
3208
|
+
this._projectObject( children[ i ], camera, groupOrder, renderList, clippingContext );
|
|
3209
|
+
|
|
3210
|
+
}
|
|
3211
|
+
|
|
3212
|
+
renderList.finish();
|
|
3213
|
+
|
|
3214
|
+
}
|
|
2863
3215
|
|
|
2864
3216
|
baseRenderList.pushBundle( {
|
|
2865
3217
|
bundleGroup: object,
|
|
@@ -2867,10 +3219,12 @@ class Renderer {
|
|
|
2867
3219
|
renderList,
|
|
2868
3220
|
} );
|
|
2869
3221
|
|
|
2870
|
-
|
|
3222
|
+
return;
|
|
2871
3223
|
|
|
2872
3224
|
}
|
|
2873
3225
|
|
|
3226
|
+
//
|
|
3227
|
+
|
|
2874
3228
|
const children = object.children;
|
|
2875
3229
|
|
|
2876
3230
|
for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
@@ -2975,6 +3329,7 @@ class Renderer {
|
|
|
2975
3329
|
* Retrieves shadow nodes for the given material. This is used to setup shadow passes.
|
|
2976
3330
|
* The result is cached per material and updated when the material's version changes.
|
|
2977
3331
|
*
|
|
3332
|
+
* @private
|
|
2978
3333
|
* @param {Material} material
|
|
2979
3334
|
* @returns {Object} - The shadow nodes for the material.
|
|
2980
3335
|
*/
|
|
@@ -2986,15 +3341,16 @@ class Renderer {
|
|
|
2986
3341
|
|
|
2987
3342
|
if ( cache === undefined || cache.version !== version ) {
|
|
2988
3343
|
|
|
2989
|
-
const hasMap = material.map
|
|
3344
|
+
const hasMap = material.map && material.map.isTexture;
|
|
2990
3345
|
const hasColorNode = material.colorNode && material.colorNode.isNode;
|
|
2991
3346
|
const hasCastShadowNode = material.castShadowNode && material.castShadowNode.isNode;
|
|
3347
|
+
const hasMaskNode = ( material.maskShadowNode && material.maskShadowNode.isNode ) || ( material.maskNode && material.maskNode.isNode );
|
|
2992
3348
|
|
|
2993
3349
|
let positionNode = null;
|
|
2994
3350
|
let colorNode = null;
|
|
2995
3351
|
let depthNode = null;
|
|
2996
3352
|
|
|
2997
|
-
if ( hasMap || hasColorNode || hasCastShadowNode ) {
|
|
3353
|
+
if ( hasMap || hasColorNode || hasCastShadowNode || hasMaskNode ) {
|
|
2998
3354
|
|
|
2999
3355
|
let shadowRGB;
|
|
3000
3356
|
let shadowAlpha;
|
|
@@ -3004,6 +3360,12 @@ class Renderer {
|
|
|
3004
3360
|
shadowRGB = material.castShadowNode.rgb;
|
|
3005
3361
|
shadowAlpha = material.castShadowNode.a;
|
|
3006
3362
|
|
|
3363
|
+
if ( this.shadowMap.transmitted !== true ) {
|
|
3364
|
+
|
|
3365
|
+
warnOnce( 'Renderer: `shadowMap.transmitted` needs to be set to `true` when using `material.castShadowNode`.' );
|
|
3366
|
+
|
|
3367
|
+
}
|
|
3368
|
+
|
|
3007
3369
|
} else {
|
|
3008
3370
|
|
|
3009
3371
|
shadowRGB = vec3( 0 );
|
|
@@ -3025,6 +3387,20 @@ class Renderer {
|
|
|
3025
3387
|
|
|
3026
3388
|
colorNode = vec4( shadowRGB, shadowAlpha );
|
|
3027
3389
|
|
|
3390
|
+
if ( hasMaskNode ) {
|
|
3391
|
+
|
|
3392
|
+
const maskNode = material.maskShadowNode || material.maskNode;
|
|
3393
|
+
|
|
3394
|
+
colorNode = Fn( ( [ color ] ) => {
|
|
3395
|
+
|
|
3396
|
+
maskNode.not().discard();
|
|
3397
|
+
|
|
3398
|
+
return color;
|
|
3399
|
+
|
|
3400
|
+
} )( colorNode );
|
|
3401
|
+
|
|
3402
|
+
}
|
|
3403
|
+
|
|
3028
3404
|
}
|
|
3029
3405
|
|
|
3030
3406
|
if ( material.depthNode && material.depthNode.isNode ) {
|
|
@@ -3058,6 +3434,98 @@ class Renderer {
|
|
|
3058
3434
|
|
|
3059
3435
|
}
|
|
3060
3436
|
|
|
3437
|
+
/**
|
|
3438
|
+
* Updates the camera so it's prepared for rendering operations.
|
|
3439
|
+
*
|
|
3440
|
+
* @private
|
|
3441
|
+
* @param {Camera} camera - The camera to update.
|
|
3442
|
+
* @return {Camera} The returned camera might be different depending on whether XR is used or not.
|
|
3443
|
+
*/
|
|
3444
|
+
_updateCamera( camera ) {
|
|
3445
|
+
|
|
3446
|
+
const xr = this.xr;
|
|
3447
|
+
|
|
3448
|
+
if ( xr.isPresenting === false ) {
|
|
3449
|
+
|
|
3450
|
+
let projectionMatrixNeedsUpdate = false;
|
|
3451
|
+
|
|
3452
|
+
// reversed depth
|
|
3453
|
+
|
|
3454
|
+
if ( this.reversedDepthBuffer === true && camera.reversedDepth !== true ) {
|
|
3455
|
+
|
|
3456
|
+
camera._reversedDepth = true;
|
|
3457
|
+
|
|
3458
|
+
if ( camera.isArrayCamera ) {
|
|
3459
|
+
|
|
3460
|
+
for ( const subCamera of camera.cameras ) {
|
|
3461
|
+
|
|
3462
|
+
subCamera._reversedDepth = true;
|
|
3463
|
+
|
|
3464
|
+
}
|
|
3465
|
+
|
|
3466
|
+
}
|
|
3467
|
+
|
|
3468
|
+
projectionMatrixNeedsUpdate = true;
|
|
3469
|
+
|
|
3470
|
+
}
|
|
3471
|
+
|
|
3472
|
+
// WebGPU/WebGL coordinate system
|
|
3473
|
+
|
|
3474
|
+
const coordinateSystem = this.coordinateSystem;
|
|
3475
|
+
|
|
3476
|
+
if ( camera.coordinateSystem !== coordinateSystem ) {
|
|
3477
|
+
|
|
3478
|
+
camera.coordinateSystem = coordinateSystem;
|
|
3479
|
+
|
|
3480
|
+
if ( camera.isArrayCamera ) {
|
|
3481
|
+
|
|
3482
|
+
for ( const subCamera of camera.cameras ) {
|
|
3483
|
+
|
|
3484
|
+
subCamera.coordinateSystem = coordinateSystem;
|
|
3485
|
+
|
|
3486
|
+
}
|
|
3487
|
+
|
|
3488
|
+
}
|
|
3489
|
+
|
|
3490
|
+
projectionMatrixNeedsUpdate = true;
|
|
3491
|
+
|
|
3492
|
+
}
|
|
3493
|
+
|
|
3494
|
+
// camera update
|
|
3495
|
+
|
|
3496
|
+
if ( projectionMatrixNeedsUpdate === true ) {
|
|
3497
|
+
|
|
3498
|
+
camera.updateProjectionMatrix();
|
|
3499
|
+
|
|
3500
|
+
if ( camera.isArrayCamera ) {
|
|
3501
|
+
|
|
3502
|
+
for ( const subCamera of camera.cameras ) {
|
|
3503
|
+
|
|
3504
|
+
subCamera.updateProjectionMatrix();
|
|
3505
|
+
|
|
3506
|
+
}
|
|
3507
|
+
|
|
3508
|
+
}
|
|
3509
|
+
|
|
3510
|
+
}
|
|
3511
|
+
|
|
3512
|
+
}
|
|
3513
|
+
|
|
3514
|
+
if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
|
|
3515
|
+
|
|
3516
|
+
// handle XR
|
|
3517
|
+
|
|
3518
|
+
if ( xr.enabled === true && xr.isPresenting === true ) {
|
|
3519
|
+
|
|
3520
|
+
if ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );
|
|
3521
|
+
camera = xr.getCamera(); // use XR camera for rendering
|
|
3522
|
+
|
|
3523
|
+
}
|
|
3524
|
+
|
|
3525
|
+
return camera;
|
|
3526
|
+
|
|
3527
|
+
}
|
|
3528
|
+
|
|
3061
3529
|
/**
|
|
3062
3530
|
* This method represents the default render object function that manages the render lifecycle
|
|
3063
3531
|
* of the object.
|
|
@@ -3079,6 +3547,11 @@ class Renderer {
|
|
|
3079
3547
|
let materialDepthNode;
|
|
3080
3548
|
let materialPositionNode;
|
|
3081
3549
|
let materialSide;
|
|
3550
|
+
let materialDisplacementMap;
|
|
3551
|
+
let materialDisplacementScale;
|
|
3552
|
+
let materialDisplacementBias;
|
|
3553
|
+
|
|
3554
|
+
const previousSourceMaterial = this._currentSourceMaterial;
|
|
3082
3555
|
|
|
3083
3556
|
//
|
|
3084
3557
|
|
|
@@ -3088,15 +3561,20 @@ class Renderer {
|
|
|
3088
3561
|
|
|
3089
3562
|
if ( material.allowOverride === true && scene.overrideMaterial !== null ) {
|
|
3090
3563
|
|
|
3564
|
+
this._currentSourceMaterial = material;
|
|
3565
|
+
|
|
3091
3566
|
const overrideMaterial = scene.overrideMaterial;
|
|
3092
3567
|
|
|
3093
3568
|
materialOverride = true;
|
|
3094
3569
|
|
|
3095
3570
|
// store original nodes
|
|
3096
|
-
materialColorNode =
|
|
3097
|
-
materialDepthNode =
|
|
3098
|
-
materialPositionNode =
|
|
3571
|
+
materialColorNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.colorNode : null;
|
|
3572
|
+
materialDepthNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.depthNode : null;
|
|
3573
|
+
materialPositionNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.positionNode : null;
|
|
3099
3574
|
materialSide = scene.overrideMaterial.side;
|
|
3575
|
+
materialDisplacementMap = overrideMaterial.displacementMap;
|
|
3576
|
+
materialDisplacementScale = overrideMaterial.displacementScale;
|
|
3577
|
+
materialDisplacementBias = overrideMaterial.displacementBias;
|
|
3100
3578
|
|
|
3101
3579
|
if ( material.positionNode && material.positionNode.isNode ) {
|
|
3102
3580
|
|
|
@@ -3106,6 +3584,9 @@ class Renderer {
|
|
|
3106
3584
|
|
|
3107
3585
|
overrideMaterial.alphaTest = material.alphaTest;
|
|
3108
3586
|
overrideMaterial.alphaMap = material.alphaMap;
|
|
3587
|
+
overrideMaterial.displacementMap = material.displacementMap;
|
|
3588
|
+
overrideMaterial.displacementScale = material.displacementScale;
|
|
3589
|
+
overrideMaterial.displacementBias = material.displacementBias;
|
|
3109
3590
|
overrideMaterial.transparent = material.transparent || material.transmission > 0 ||
|
|
3110
3591
|
( material.transmissionNode && material.transmissionNode.isNode ) ||
|
|
3111
3592
|
( material.backdropNode && material.backdropNode.isNode );
|
|
@@ -3114,7 +3595,15 @@ class Renderer {
|
|
|
3114
3595
|
|
|
3115
3596
|
const { colorNode, depthNode, positionNode } = this._getShadowNodes( material );
|
|
3116
3597
|
|
|
3117
|
-
|
|
3598
|
+
if ( this.shadowMap.type === VSMShadowMap ) {
|
|
3599
|
+
|
|
3600
|
+
overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;
|
|
3601
|
+
|
|
3602
|
+
} else {
|
|
3603
|
+
|
|
3604
|
+
overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : _shadowSide[ material.side ];
|
|
3605
|
+
|
|
3606
|
+
}
|
|
3118
3607
|
|
|
3119
3608
|
if ( colorNode !== null ) overrideMaterial.colorNode = colorNode;
|
|
3120
3609
|
if ( depthNode !== null ) overrideMaterial.depthNode = depthNode;
|
|
@@ -3152,15 +3641,38 @@ class Renderer {
|
|
|
3152
3641
|
scene.overrideMaterial.depthNode = materialDepthNode;
|
|
3153
3642
|
scene.overrideMaterial.positionNode = materialPositionNode;
|
|
3154
3643
|
scene.overrideMaterial.side = materialSide;
|
|
3644
|
+
scene.overrideMaterial.displacementMap = materialDisplacementMap;
|
|
3645
|
+
scene.overrideMaterial.displacementScale = materialDisplacementScale;
|
|
3646
|
+
scene.overrideMaterial.displacementBias = materialDisplacementBias;
|
|
3155
3647
|
|
|
3156
3648
|
}
|
|
3157
3649
|
|
|
3650
|
+
this._currentSourceMaterial = previousSourceMaterial;
|
|
3651
|
+
|
|
3158
3652
|
//
|
|
3159
3653
|
|
|
3160
3654
|
object.onAfterRender( this, scene, camera, geometry, material, group );
|
|
3161
3655
|
|
|
3162
3656
|
}
|
|
3163
3657
|
|
|
3658
|
+
/**
|
|
3659
|
+
* Checks if the given compatibility is supported by the selected backend.
|
|
3660
|
+
*
|
|
3661
|
+
* @param {string} name - The compatibility's name.
|
|
3662
|
+
* @return {boolean} Whether the compatibility is supported or not.
|
|
3663
|
+
*/
|
|
3664
|
+
hasCompatibility( name ) {
|
|
3665
|
+
|
|
3666
|
+
if ( this._initialized === false ) {
|
|
3667
|
+
|
|
3668
|
+
throw new Error( 'THREE.Renderer: .hasCompatibility() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
|
|
3669
|
+
|
|
3670
|
+
}
|
|
3671
|
+
|
|
3672
|
+
return this.backend.hasCompatibility( name );
|
|
3673
|
+
|
|
3674
|
+
}
|
|
3675
|
+
|
|
3164
3676
|
/**
|
|
3165
3677
|
* This method represents the default `_handleObjectFunction` implementation which creates
|
|
3166
3678
|
* a render object from the given data and performs the draw command with the selected backend.
|
|
@@ -3181,6 +3693,16 @@ class Renderer {
|
|
|
3181
3693
|
renderObject.drawRange = object.geometry.drawRange;
|
|
3182
3694
|
renderObject.group = group;
|
|
3183
3695
|
|
|
3696
|
+
if ( this._currentRenderBundle !== null ) {
|
|
3697
|
+
|
|
3698
|
+
const renderBundleData = this.backend.get( this._currentRenderBundle );
|
|
3699
|
+
|
|
3700
|
+
renderBundleData.renderObjects.push( renderObject );
|
|
3701
|
+
|
|
3702
|
+
renderObject.bundle = this._currentRenderBundle.bundleGroup;
|
|
3703
|
+
|
|
3704
|
+
}
|
|
3705
|
+
|
|
3184
3706
|
//
|
|
3185
3707
|
|
|
3186
3708
|
const needsRefresh = this._nodes.needsRefresh( renderObject );
|
|
@@ -3200,20 +3722,14 @@ class Renderer {
|
|
|
3200
3722
|
|
|
3201
3723
|
//
|
|
3202
3724
|
|
|
3203
|
-
if ( this.
|
|
3725
|
+
if ( this._pipelines.isReady( renderObject ) ) {
|
|
3204
3726
|
|
|
3205
|
-
|
|
3727
|
+
this.backend.draw( renderObject, this.info );
|
|
3206
3728
|
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
renderObject.bundle = this._currentRenderBundle.bundleGroup;
|
|
3729
|
+
if ( needsRefresh ) this._nodes.updateAfter( renderObject );
|
|
3210
3730
|
|
|
3211
3731
|
}
|
|
3212
3732
|
|
|
3213
|
-
this.backend.draw( renderObject, this.info );
|
|
3214
|
-
|
|
3215
|
-
if ( needsRefresh ) this._nodes.updateAfter( renderObject );
|
|
3216
|
-
|
|
3217
3733
|
}
|
|
3218
3734
|
|
|
3219
3735
|
/**
|
|
@@ -3232,6 +3748,27 @@ class Renderer {
|
|
|
3232
3748
|
*/
|
|
3233
3749
|
_createObjectPipeline( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {
|
|
3234
3750
|
|
|
3751
|
+
// If in async compilation mode, queue the work for sequential execution
|
|
3752
|
+
if ( this._compilationPromises !== null ) {
|
|
3753
|
+
|
|
3754
|
+
// Store work items instead of promises - will be processed sequentially
|
|
3755
|
+
this._compilationPromises.push( {
|
|
3756
|
+
object,
|
|
3757
|
+
material,
|
|
3758
|
+
scene,
|
|
3759
|
+
camera,
|
|
3760
|
+
lightsNode,
|
|
3761
|
+
group,
|
|
3762
|
+
clippingContext,
|
|
3763
|
+
passId,
|
|
3764
|
+
renderContext: this._currentRenderContext
|
|
3765
|
+
} );
|
|
3766
|
+
|
|
3767
|
+
return;
|
|
3768
|
+
|
|
3769
|
+
}
|
|
3770
|
+
|
|
3771
|
+
// Sync path
|
|
3235
3772
|
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
|
|
3236
3773
|
renderObject.drawRange = object.geometry.drawRange;
|
|
3237
3774
|
renderObject.group = group;
|