super-three 0.181.0 → 0.184.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 +13152 -11354
- package/build/three.core.js +12319 -11539
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1808 -781
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +27 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +10523 -6263
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +10484 -6262
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +11 -3
- package/examples/jsm/animation/CCDIKSolver.js +7 -3
- package/examples/jsm/controls/ArcballControls.js +7 -4
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +58 -54
- 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 +34 -2
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +152 -9
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- 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/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +67 -8
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +203 -88
- package/examples/jsm/inspector/RendererInspector.js +14 -4
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- 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 +41 -7
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +51 -3
- package/examples/jsm/inspector/tabs/Performance.js +4 -4
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +107 -5
- package/examples/jsm/inspector/ui/Graph.js +2 -2
- package/examples/jsm/inspector/ui/List.js +1 -1
- package/examples/jsm/inspector/ui/Profiler.js +1936 -34
- package/examples/jsm/inspector/ui/Style.js +1044 -31
- package/examples/jsm/inspector/ui/Tab.js +222 -3
- package/examples/jsm/inspector/ui/Values.js +55 -2
- package/examples/jsm/inspector/ui/utils.js +13 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- package/examples/jsm/lines/LineMaterial.js +7 -1
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- 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 +5 -5
- package/examples/jsm/loaders/EXRLoader.js +687 -48
- 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 +1 -2
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +27 -5
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- package/examples/jsm/loaders/LWOLoader.js +7 -39
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- 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 +450 -363
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4594 -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/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -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/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- 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/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
- 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/AnamorphicNode.js +12 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- 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 +1 -1
- 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 +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +6 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
- package/examples/jsm/tsl/display/GodraysNode.js +615 -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 +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- 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 +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +8 -24
- package/examples/jsm/tsl/display/SSRNode.js +8 -8
- package/examples/jsm/tsl/display/SSSNode.js +6 -4
- 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/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/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/utils/BufferGeometryUtils.js +2 -3
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/LDrawUtils.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/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +24 -30
- package/src/Three.Core.js +3 -1
- package/src/Three.TSL.js +25 -11
- package/src/Three.WebGPU.Nodes.js +5 -0
- package/src/Three.WebGPU.js +9 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- 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 +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/constants.js +90 -5
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +52 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +4 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- 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/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- 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 +6 -4
- package/src/loaders/FileLoader.js +2 -3
- package/src/loaders/ImageBitmapLoader.js +12 -9
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +46 -6
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +34 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +45 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +13 -9
- package/src/math/Matrix4.js +87 -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 +11 -7
- package/src/math/Vector3.js +15 -13
- package/src/math/Vector4.js +13 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +86 -68
- package/src/nodes/TSL.js +7 -7
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +107 -15
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +4 -4
- package/src/nodes/accessors/CubeTextureNode.js +27 -2
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +11 -11
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
- package/src/nodes/accessors/ReferenceNode.js +8 -8
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +14 -25
- package/src/nodes/accessors/StorageTextureNode.js +40 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +67 -23
- 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 +2 -3
- 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 +48 -2
- package/src/nodes/core/Node.js +112 -15
- package/src/nodes/core/NodeBuilder.js +284 -66
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +11 -9
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +66 -17
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +17 -3
- package/src/nodes/core/StructTypeNode.js +12 -18
- 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 +48 -23
- package/src/nodes/core/VaryingNode.js +2 -19
- package/src/nodes/display/BlendModes.js +0 -64
- package/src/nodes/display/ColorAdjustment.js +17 -0
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/NormalMapNode.js +39 -4
- package/src/nodes/display/PassNode.js +125 -16
- package/src/nodes/display/RenderOutputNode.js +7 -7
- 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/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 +4 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +7 -28
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +120 -42
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +3 -3
- package/src/nodes/math/MathNode.js +76 -41
- package/src/nodes/math/OperatorNode.js +3 -2
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +38 -17
- 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/EventNode.js +31 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
- 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 +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +3 -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/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +44 -16
- package/src/objects/InstancedMesh.js +30 -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/Skeleton.js +9 -0
- package/src/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +329 -145
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +29 -8
- 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 +29 -14
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- 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 +333 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Lighting.js +5 -21
- 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/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +17 -5
- 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 +481 -117
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +89 -4
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +62 -1
- package/src/renderers/common/XRManager.js +37 -29
- package/src/renderers/common/extras/PMREMGenerator.js +25 -23
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -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/envmap_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- 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 +2 -0
- 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_maps.glsl.js +7 -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 +1 -1
- 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} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -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 +270 -0
- package/src/renderers/webgl/WebGLProgram.js +49 -109
- package/src/renderers/webgl/WebGLPrograms.js +63 -51
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +75 -37
- package/src/renderers/webgl/WebGLTextures.js +215 -54
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
- 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 +68 -53
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +260 -140
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- 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 +61 -23
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
- 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/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/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -145
- 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,7 @@ class Renderer {
|
|
|
587
595
|
this.onDeviceLost = this._onDeviceLost;
|
|
588
596
|
|
|
589
597
|
/**
|
|
590
|
-
* Defines the type of
|
|
598
|
+
* Defines the type of output buffers. The default `HalfFloatType` is recommend for
|
|
591
599
|
* best quality. To save memory and bandwidth, `UnsignedByteType` might be used.
|
|
592
600
|
* This will reduce rendering quality though.
|
|
593
601
|
*
|
|
@@ -595,7 +603,7 @@ class Renderer {
|
|
|
595
603
|
* @type {number}
|
|
596
604
|
* @default HalfFloatType
|
|
597
605
|
*/
|
|
598
|
-
this.
|
|
606
|
+
this._outputBufferType = outputBufferType;
|
|
599
607
|
|
|
600
608
|
/**
|
|
601
609
|
* A cache for shadow nodes per material
|
|
@@ -614,6 +622,16 @@ class Renderer {
|
|
|
614
622
|
*/
|
|
615
623
|
this._initialized = false;
|
|
616
624
|
|
|
625
|
+
/**
|
|
626
|
+
* The call depth of the renderer. Counts the number of
|
|
627
|
+
* nested render calls.
|
|
628
|
+
*
|
|
629
|
+
* @private
|
|
630
|
+
* @type {number}
|
|
631
|
+
* @default - 1
|
|
632
|
+
*/
|
|
633
|
+
this._callDepth = - 1;
|
|
634
|
+
|
|
617
635
|
/**
|
|
618
636
|
* A reference to the promise which initializes the renderer.
|
|
619
637
|
*
|
|
@@ -652,6 +670,7 @@ class Renderer {
|
|
|
652
670
|
* Shadow map configuration
|
|
653
671
|
* @typedef {Object} ShadowMapConfig
|
|
654
672
|
* @property {boolean} enabled - Whether to globally enable shadows or not.
|
|
673
|
+
* @property {boolean} transmitted - Whether to enable light transmission through non-opaque materials.
|
|
655
674
|
* @property {number} type - The shadow map type.
|
|
656
675
|
*/
|
|
657
676
|
|
|
@@ -662,6 +681,7 @@ class Renderer {
|
|
|
662
681
|
*/
|
|
663
682
|
this.shadowMap = {
|
|
664
683
|
enabled: false,
|
|
684
|
+
transmitted: false,
|
|
665
685
|
type: PCFShadowMap
|
|
666
686
|
};
|
|
667
687
|
|
|
@@ -699,7 +719,7 @@ class Renderer {
|
|
|
699
719
|
await this.compileAsync( scene, camera );
|
|
700
720
|
|
|
701
721
|
const renderList = this._renderLists.get( scene, camera );
|
|
702
|
-
const renderContext = this._renderContexts.get(
|
|
722
|
+
const renderContext = this._renderContexts.get( this._renderTarget, this._mrt );
|
|
703
723
|
|
|
704
724
|
const material = scene.overrideMaterial || object.material;
|
|
705
725
|
|
|
@@ -763,18 +783,18 @@ class Renderer {
|
|
|
763
783
|
|
|
764
784
|
}
|
|
765
785
|
|
|
766
|
-
this._nodes = new
|
|
786
|
+
this._nodes = new NodeManager( this, backend );
|
|
767
787
|
this._animation = new Animation( this, this._nodes, this.info );
|
|
768
|
-
this._attributes = new Attributes( backend );
|
|
788
|
+
this._attributes = new Attributes( backend, this.info );
|
|
769
789
|
this._background = new Background( this, this._nodes );
|
|
770
790
|
this._geometries = new Geometries( this._attributes, this.info );
|
|
771
791
|
this._textures = new Textures( this, backend, this.info );
|
|
772
|
-
this._pipelines = new Pipelines( backend, this._nodes );
|
|
792
|
+
this._pipelines = new Pipelines( backend, this._nodes, this.info );
|
|
773
793
|
this._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );
|
|
774
794
|
this._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );
|
|
775
795
|
this._renderLists = new RenderLists( this.lighting );
|
|
776
796
|
this._bundles = new RenderBundles();
|
|
777
|
-
this._renderContexts = new RenderContexts();
|
|
797
|
+
this._renderContexts = new RenderContexts( this );
|
|
778
798
|
|
|
779
799
|
//
|
|
780
800
|
|
|
@@ -835,7 +855,7 @@ class Renderer {
|
|
|
835
855
|
* @param {Object3D} scene - The scene or 3D object to precompile.
|
|
836
856
|
* @param {Camera} camera - The camera that is used to render the scene.
|
|
837
857
|
* @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
|
|
858
|
+
* @return {Promise} A Promise that resolves when the compile has been finished.
|
|
839
859
|
*/
|
|
840
860
|
async compileAsync( scene, camera, targetScene = null ) {
|
|
841
861
|
|
|
@@ -850,16 +870,21 @@ class Renderer {
|
|
|
850
870
|
const previousRenderId = nodeFrame.renderId;
|
|
851
871
|
const previousRenderContext = this._currentRenderContext;
|
|
852
872
|
const previousRenderObjectFunction = this._currentRenderObjectFunction;
|
|
873
|
+
const previousHandleObjectFunction = this._handleObjectFunction;
|
|
853
874
|
const previousCompilationPromises = this._compilationPromises;
|
|
854
875
|
|
|
855
876
|
//
|
|
856
877
|
|
|
857
|
-
const sceneRef = ( scene.isScene === true ) ? scene : _scene;
|
|
858
|
-
|
|
859
878
|
if ( targetScene === null ) targetScene = scene;
|
|
860
879
|
|
|
861
|
-
|
|
862
|
-
|
|
880
|
+
// Use the actual scene for caching when compiling individual objects
|
|
881
|
+
// This ensures cache keys match between compileAsync and render
|
|
882
|
+
const sceneRef = ( scene.isScene === true ) ? scene : ( targetScene.isScene === true ) ? targetScene : _scene;
|
|
883
|
+
|
|
884
|
+
// Match render()'s logic: use frameBufferTarget when needsFrameBufferTarget is true
|
|
885
|
+
const useFrameBufferTarget = this.needsFrameBufferTarget && this._renderTarget === null;
|
|
886
|
+
const renderTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : ( this._renderTarget || this._outputRenderTarget );
|
|
887
|
+
const renderContext = this._renderContexts.get( renderTarget, this._mrt );
|
|
863
888
|
const activeMipmapLevel = this._activeMipmapLevel;
|
|
864
889
|
|
|
865
890
|
const compilationPromises = [];
|
|
@@ -891,7 +916,8 @@ class Renderer {
|
|
|
891
916
|
|
|
892
917
|
//
|
|
893
918
|
|
|
894
|
-
|
|
919
|
+
// Use sceneRef for render list to ensure lightsNode matches between compileAsync and render
|
|
920
|
+
const renderList = this._renderLists.get( sceneRef, camera );
|
|
895
921
|
renderList.begin();
|
|
896
922
|
|
|
897
923
|
this._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );
|
|
@@ -933,9 +959,17 @@ class Renderer {
|
|
|
933
959
|
|
|
934
960
|
//
|
|
935
961
|
|
|
936
|
-
|
|
962
|
+
if ( targetScene !== scene ) {
|
|
937
963
|
|
|
938
|
-
|
|
964
|
+
this._background.update( targetScene, renderList, renderContext );
|
|
965
|
+
|
|
966
|
+
} else {
|
|
967
|
+
|
|
968
|
+
this._background.update( sceneRef, renderList, renderContext );
|
|
969
|
+
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
// process render lists - _createObjectPipeline will push async promises to _compilationPromises
|
|
939
973
|
|
|
940
974
|
const opaqueObjects = renderList.opaque;
|
|
941
975
|
const transparentObjects = renderList.transparent;
|
|
@@ -951,13 +985,42 @@ class Renderer {
|
|
|
951
985
|
|
|
952
986
|
this._currentRenderContext = previousRenderContext;
|
|
953
987
|
this._currentRenderObjectFunction = previousRenderObjectFunction;
|
|
988
|
+
this._handleObjectFunction = previousHandleObjectFunction;
|
|
954
989
|
this._compilationPromises = previousCompilationPromises;
|
|
955
990
|
|
|
956
|
-
|
|
991
|
+
// Process compilation work items sequentially to avoid freezing
|
|
992
|
+
// Yields between objects to keep animation smooth
|
|
993
|
+
|
|
994
|
+
for ( const item of compilationPromises ) {
|
|
995
|
+
|
|
996
|
+
const renderObject = this._objects.get( item.object, item.material, item.scene, item.camera, item.lightsNode, item.renderContext, item.clippingContext, item.passId );
|
|
997
|
+
renderObject.drawRange = item.object.geometry.drawRange;
|
|
998
|
+
renderObject.group = item.group;
|
|
999
|
+
|
|
1000
|
+
this._geometries.updateForRender( renderObject );
|
|
1001
|
+
|
|
1002
|
+
// Use async node building to yield to main thread
|
|
1003
|
+
await this._nodes.getForRenderAsync( renderObject );
|
|
1004
|
+
|
|
1005
|
+
this._nodes.updateBefore( renderObject );
|
|
1006
|
+
this._nodes.updateForRender( renderObject );
|
|
1007
|
+
this._bindings.updateForRender( renderObject );
|
|
1008
|
+
|
|
1009
|
+
// Wait for pipeline creation
|
|
1010
|
+
const pipelinePromises = [];
|
|
1011
|
+
this._pipelines.getForRender( renderObject, pipelinePromises );
|
|
1012
|
+
if ( pipelinePromises.length > 0 ) {
|
|
1013
|
+
|
|
1014
|
+
await Promise.all( pipelinePromises );
|
|
1015
|
+
|
|
1016
|
+
}
|
|
957
1017
|
|
|
958
|
-
|
|
1018
|
+
this._nodes.updateAfter( renderObject );
|
|
959
1019
|
|
|
960
|
-
|
|
1020
|
+
// Yield between objects to allow animation frames
|
|
1021
|
+
await yieldToMain();
|
|
1022
|
+
|
|
1023
|
+
}
|
|
961
1024
|
|
|
962
1025
|
}
|
|
963
1026
|
|
|
@@ -996,11 +1059,6 @@ class Renderer {
|
|
|
996
1059
|
|
|
997
1060
|
//
|
|
998
1061
|
|
|
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
1062
|
set inspector( value ) {
|
|
1005
1063
|
|
|
1006
1064
|
if ( this._inspector !== null ) {
|
|
@@ -1014,6 +1072,11 @@ class Renderer {
|
|
|
1014
1072
|
|
|
1015
1073
|
}
|
|
1016
1074
|
|
|
1075
|
+
/**
|
|
1076
|
+
* The inspector instance. The inspector can be any class that extends from `InspectorBase`.
|
|
1077
|
+
*
|
|
1078
|
+
* @type {InspectorBase}
|
|
1079
|
+
*/
|
|
1017
1080
|
get inspector() {
|
|
1018
1081
|
|
|
1019
1082
|
return this._inspector;
|
|
@@ -1031,15 +1094,17 @@ class Renderer {
|
|
|
1031
1094
|
*/
|
|
1032
1095
|
set highPrecision( value ) {
|
|
1033
1096
|
|
|
1097
|
+
const contextNodeData = this.contextNode.value;
|
|
1098
|
+
|
|
1034
1099
|
if ( value === true ) {
|
|
1035
1100
|
|
|
1036
|
-
|
|
1037
|
-
|
|
1101
|
+
contextNodeData.modelViewMatrix = highpModelViewMatrix;
|
|
1102
|
+
contextNodeData.modelNormalViewMatrix = highpModelNormalViewMatrix;
|
|
1038
1103
|
|
|
1039
1104
|
} else if ( this.highPrecision ) {
|
|
1040
1105
|
|
|
1041
|
-
|
|
1042
|
-
|
|
1106
|
+
delete contextNodeData.modelViewMatrix;
|
|
1107
|
+
delete contextNodeData.modelNormalViewMatrix;
|
|
1043
1108
|
|
|
1044
1109
|
}
|
|
1045
1110
|
|
|
@@ -1053,7 +1118,9 @@ class Renderer {
|
|
|
1053
1118
|
*/
|
|
1054
1119
|
get highPrecision() {
|
|
1055
1120
|
|
|
1056
|
-
|
|
1121
|
+
const contextNodeData = this.contextNode.value;
|
|
1122
|
+
|
|
1123
|
+
return contextNodeData.modelViewMatrix === highpModelViewMatrix && contextNodeData.modelNormalViewMatrix === highpModelNormalViewMatrix;
|
|
1057
1124
|
|
|
1058
1125
|
}
|
|
1059
1126
|
|
|
@@ -1083,13 +1150,27 @@ class Renderer {
|
|
|
1083
1150
|
}
|
|
1084
1151
|
|
|
1085
1152
|
/**
|
|
1086
|
-
* Returns the
|
|
1153
|
+
* Returns the output buffer type.
|
|
1087
1154
|
*
|
|
1088
|
-
* @return {number} The
|
|
1155
|
+
* @return {number} The output buffer type.
|
|
1089
1156
|
*/
|
|
1090
|
-
|
|
1157
|
+
getOutputBufferType() {
|
|
1091
1158
|
|
|
1092
|
-
return this.
|
|
1159
|
+
return this._outputBufferType;
|
|
1160
|
+
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
/**
|
|
1164
|
+
* Returns the output buffer type.
|
|
1165
|
+
*
|
|
1166
|
+
* @deprecated since r182. Use `.getOutputBufferType()` instead.
|
|
1167
|
+
* @return {number} The output buffer type.
|
|
1168
|
+
*/
|
|
1169
|
+
getColorBufferType() { // @deprecated, r182
|
|
1170
|
+
|
|
1171
|
+
warnOnce( 'Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".' );
|
|
1172
|
+
|
|
1173
|
+
return this.getOutputBufferType();
|
|
1093
1174
|
|
|
1094
1175
|
}
|
|
1095
1176
|
|
|
@@ -1131,17 +1212,11 @@ class Renderer {
|
|
|
1131
1212
|
|
|
1132
1213
|
//
|
|
1133
1214
|
|
|
1134
|
-
const renderBundle = this._bundles.get( bundleGroup, camera );
|
|
1215
|
+
const renderBundle = this._bundles.get( bundleGroup, camera, renderContext );
|
|
1135
1216
|
const renderBundleData = this.backend.get( renderBundle );
|
|
1136
1217
|
|
|
1137
|
-
if ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();
|
|
1138
|
-
|
|
1139
|
-
//
|
|
1140
|
-
|
|
1141
1218
|
const needsUpdate = bundleGroup.version !== renderBundleData.version;
|
|
1142
|
-
const renderBundleNeedsUpdate = renderBundleData.
|
|
1143
|
-
|
|
1144
|
-
renderBundleData.renderContexts.add( renderContext );
|
|
1219
|
+
const renderBundleNeedsUpdate = needsUpdate || renderBundleData.bundleGPU === undefined;
|
|
1145
1220
|
|
|
1146
1221
|
if ( renderBundleNeedsUpdate ) {
|
|
1147
1222
|
|
|
@@ -1258,14 +1333,17 @@ class Renderer {
|
|
|
1258
1333
|
const { width, height } = this.getDrawingBufferSize( _drawingBufferSize );
|
|
1259
1334
|
const { depth, stencil } = this;
|
|
1260
1335
|
|
|
1261
|
-
|
|
1336
|
+
// TODO: Unify CanvasTarget and OutputRenderTarget
|
|
1337
|
+
const target = this._outputRenderTarget || this._canvasTarget;
|
|
1338
|
+
|
|
1339
|
+
let frameBufferTarget = this._frameBufferTargets.get( target );
|
|
1262
1340
|
|
|
1263
|
-
if ( frameBufferTarget ===
|
|
1341
|
+
if ( frameBufferTarget === undefined ) {
|
|
1264
1342
|
|
|
1265
1343
|
frameBufferTarget = new RenderTarget( width, height, {
|
|
1266
1344
|
depthBuffer: depth,
|
|
1267
1345
|
stencilBuffer: stencil,
|
|
1268
|
-
type: this.
|
|
1346
|
+
type: this._outputBufferType,
|
|
1269
1347
|
format: RGBAFormat,
|
|
1270
1348
|
colorSpace: ColorManagement.workingColorSpace,
|
|
1271
1349
|
generateMipmaps: false,
|
|
@@ -1276,7 +1354,19 @@ class Renderer {
|
|
|
1276
1354
|
|
|
1277
1355
|
frameBufferTarget.isPostProcessingRenderTarget = true;
|
|
1278
1356
|
|
|
1279
|
-
|
|
1357
|
+
const dispose = () => {
|
|
1358
|
+
|
|
1359
|
+
target.removeEventListener( 'dispose', dispose );
|
|
1360
|
+
|
|
1361
|
+
frameBufferTarget.dispose();
|
|
1362
|
+
|
|
1363
|
+
this._frameBufferTargets.delete( target );
|
|
1364
|
+
|
|
1365
|
+
};
|
|
1366
|
+
|
|
1367
|
+
target.addEventListener( 'dispose', dispose );
|
|
1368
|
+
|
|
1369
|
+
this._frameBufferTargets.set( target, frameBufferTarget );
|
|
1280
1370
|
|
|
1281
1371
|
}
|
|
1282
1372
|
|
|
@@ -1284,6 +1374,7 @@ class Renderer {
|
|
|
1284
1374
|
|
|
1285
1375
|
frameBufferTarget.depthBuffer = depth;
|
|
1286
1376
|
frameBufferTarget.stencilBuffer = stencil;
|
|
1377
|
+
|
|
1287
1378
|
if ( outputRenderTarget !== null ) {
|
|
1288
1379
|
|
|
1289
1380
|
frameBufferTarget.setSize( outputRenderTarget.width, outputRenderTarget.height, outputRenderTarget.depth );
|
|
@@ -1294,13 +1385,18 @@ class Renderer {
|
|
|
1294
1385
|
|
|
1295
1386
|
}
|
|
1296
1387
|
|
|
1297
|
-
|
|
1388
|
+
// RenderTarget || CanvasTarget
|
|
1389
|
+
|
|
1390
|
+
const viewport = this._outputRenderTarget ? this._outputRenderTarget.viewport : target._viewport;
|
|
1391
|
+
const scissor = this._outputRenderTarget ? this._outputRenderTarget.scissor : target._scissor;
|
|
1392
|
+
const pixelRatio = this._outputRenderTarget ? 1 : target._pixelRatio;
|
|
1393
|
+
const scissorTest = this._outputRenderTarget ? this._outputRenderTarget.scissorTest : target._scissorTest;
|
|
1298
1394
|
|
|
1299
|
-
frameBufferTarget.viewport.copy(
|
|
1300
|
-
frameBufferTarget.scissor.copy(
|
|
1301
|
-
frameBufferTarget.viewport.multiplyScalar(
|
|
1302
|
-
frameBufferTarget.scissor.multiplyScalar(
|
|
1303
|
-
frameBufferTarget.scissorTest =
|
|
1395
|
+
frameBufferTarget.viewport.copy( viewport );
|
|
1396
|
+
frameBufferTarget.scissor.copy( scissor );
|
|
1397
|
+
frameBufferTarget.viewport.multiplyScalar( pixelRatio );
|
|
1398
|
+
frameBufferTarget.scissor.multiplyScalar( pixelRatio );
|
|
1399
|
+
frameBufferTarget.scissorTest = scissorTest;
|
|
1304
1400
|
frameBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;
|
|
1305
1401
|
frameBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;
|
|
1306
1402
|
frameBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false;
|
|
@@ -1333,9 +1429,12 @@ class Renderer {
|
|
|
1333
1429
|
const previousRenderId = nodeFrame.renderId;
|
|
1334
1430
|
const previousRenderContext = this._currentRenderContext;
|
|
1335
1431
|
const previousRenderObjectFunction = this._currentRenderObjectFunction;
|
|
1432
|
+
const previousHandleObjectFunction = this._handleObjectFunction;
|
|
1336
1433
|
|
|
1337
1434
|
//
|
|
1338
1435
|
|
|
1436
|
+
this._callDepth ++;
|
|
1437
|
+
|
|
1339
1438
|
const sceneRef = ( scene.isScene === true ) ? scene : _scene;
|
|
1340
1439
|
|
|
1341
1440
|
const outputRenderTarget = this._renderTarget || this._outputRenderTarget;
|
|
@@ -1359,12 +1458,35 @@ class Renderer {
|
|
|
1359
1458
|
|
|
1360
1459
|
}
|
|
1361
1460
|
|
|
1461
|
+
// make sure a new render target has correct default depth values
|
|
1462
|
+
|
|
1463
|
+
if ( renderTarget !== null && renderTarget.depthBuffer === true ) {
|
|
1464
|
+
|
|
1465
|
+
const renderTargetData = this._textures.get( renderTarget );
|
|
1466
|
+
|
|
1467
|
+
if ( renderTargetData.depthInitialized !== true ) {
|
|
1468
|
+
|
|
1469
|
+
// we need a single manual clear if auto clear depth is disabled
|
|
1470
|
+
|
|
1471
|
+
if ( this.autoClear === false || ( this.autoClear === true && this.autoClearDepth === false ) ) {
|
|
1472
|
+
|
|
1473
|
+
this.clearDepth();
|
|
1474
|
+
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
renderTargetData.depthInitialized = true;
|
|
1478
|
+
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
}
|
|
1482
|
+
|
|
1362
1483
|
//
|
|
1363
1484
|
|
|
1364
|
-
const renderContext = this._renderContexts.get(
|
|
1485
|
+
const renderContext = this._renderContexts.get( renderTarget, this._mrt, this._callDepth );
|
|
1365
1486
|
|
|
1366
1487
|
this._currentRenderContext = renderContext;
|
|
1367
1488
|
this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;
|
|
1489
|
+
this._handleObjectFunction = this._renderObjectDirect;
|
|
1368
1490
|
|
|
1369
1491
|
//
|
|
1370
1492
|
|
|
@@ -1382,20 +1504,68 @@ class Renderer {
|
|
|
1382
1504
|
|
|
1383
1505
|
//
|
|
1384
1506
|
|
|
1385
|
-
|
|
1507
|
+
|
|
1386
1508
|
const xr = this.xr;
|
|
1387
1509
|
|
|
1388
|
-
if (
|
|
1510
|
+
if ( xr.isPresenting === false ) {
|
|
1511
|
+
|
|
1512
|
+
let projectionMatrixNeedsUpdate = false;
|
|
1513
|
+
|
|
1514
|
+
// reversed depth
|
|
1515
|
+
|
|
1516
|
+
if ( this.reversedDepthBuffer === true && camera.reversedDepth !== true ) {
|
|
1517
|
+
|
|
1518
|
+
camera._reversedDepth = true;
|
|
1519
|
+
|
|
1520
|
+
if ( camera.isArrayCamera ) {
|
|
1521
|
+
|
|
1522
|
+
for ( const subCamera of camera.cameras ) {
|
|
1523
|
+
|
|
1524
|
+
subCamera._reversedDepth = true;
|
|
1525
|
+
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
projectionMatrixNeedsUpdate = true;
|
|
1531
|
+
|
|
1532
|
+
}
|
|
1533
|
+
|
|
1534
|
+
// WebGPU/WebGL coordinate system
|
|
1535
|
+
|
|
1536
|
+
const coordinateSystem = this.coordinateSystem;
|
|
1537
|
+
|
|
1538
|
+
if ( camera.coordinateSystem !== coordinateSystem ) {
|
|
1539
|
+
|
|
1540
|
+
camera.coordinateSystem = coordinateSystem;
|
|
1541
|
+
|
|
1542
|
+
if ( camera.isArrayCamera ) {
|
|
1543
|
+
|
|
1544
|
+
for ( const subCamera of camera.cameras ) {
|
|
1545
|
+
|
|
1546
|
+
subCamera.coordinateSystem = coordinateSystem;
|
|
1547
|
+
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1552
|
+
projectionMatrixNeedsUpdate = true;
|
|
1389
1553
|
|
|
1390
|
-
|
|
1391
|
-
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
// camera update
|
|
1557
|
+
|
|
1558
|
+
if ( projectionMatrixNeedsUpdate === true ) {
|
|
1559
|
+
|
|
1560
|
+
camera.updateProjectionMatrix();
|
|
1392
1561
|
|
|
1393
|
-
|
|
1562
|
+
if ( camera.isArrayCamera ) {
|
|
1394
1563
|
|
|
1395
|
-
|
|
1564
|
+
for ( const subCamera of camera.cameras ) {
|
|
1396
1565
|
|
|
1397
|
-
|
|
1398
|
-
|
|
1566
|
+
subCamera.updateProjectionMatrix();
|
|
1567
|
+
|
|
1568
|
+
}
|
|
1399
1569
|
|
|
1400
1570
|
}
|
|
1401
1571
|
|
|
@@ -1564,9 +1734,12 @@ class Renderer {
|
|
|
1564
1734
|
|
|
1565
1735
|
this._currentRenderContext = previousRenderContext;
|
|
1566
1736
|
this._currentRenderObjectFunction = previousRenderObjectFunction;
|
|
1737
|
+
this._handleObjectFunction = previousHandleObjectFunction;
|
|
1567
1738
|
|
|
1568
1739
|
//
|
|
1569
1740
|
|
|
1741
|
+
this._callDepth --;
|
|
1742
|
+
|
|
1570
1743
|
if ( frameBufferTarget !== null ) {
|
|
1571
1744
|
|
|
1572
1745
|
this.setRenderTarget( outputRenderTarget, activeCubeFace, activeMipmapLevel );
|
|
@@ -1608,12 +1781,52 @@ class Renderer {
|
|
|
1608
1781
|
*/
|
|
1609
1782
|
_renderOutput( renderTarget ) {
|
|
1610
1783
|
|
|
1611
|
-
const
|
|
1784
|
+
const cacheKey = this._nodes.getOutputCacheKey();
|
|
1785
|
+
|
|
1786
|
+
let quadData = this._quadCache.get( renderTarget.texture );
|
|
1787
|
+
let quad;
|
|
1612
1788
|
|
|
1613
|
-
if (
|
|
1789
|
+
if ( quadData === undefined ) {
|
|
1790
|
+
|
|
1791
|
+
quad = new QuadMesh( new NodeMaterial() );
|
|
1792
|
+
quad.name = 'Output Color Transform';
|
|
1793
|
+
quad.material.name = 'outputColorTransform';
|
|
1614
1794
|
|
|
1615
1795
|
quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
|
|
1616
|
-
|
|
1796
|
+
|
|
1797
|
+
quadData = {
|
|
1798
|
+
quad,
|
|
1799
|
+
cacheKey
|
|
1800
|
+
};
|
|
1801
|
+
|
|
1802
|
+
this._quadCache.set( renderTarget.texture, quadData );
|
|
1803
|
+
|
|
1804
|
+
// dispose logic
|
|
1805
|
+
|
|
1806
|
+
const dispose = () => {
|
|
1807
|
+
|
|
1808
|
+
quad.material.dispose();
|
|
1809
|
+
|
|
1810
|
+
this._quadCache.delete( renderTarget.texture );
|
|
1811
|
+
|
|
1812
|
+
renderTarget.texture.removeEventListener( 'dispose', dispose );
|
|
1813
|
+
|
|
1814
|
+
};
|
|
1815
|
+
|
|
1816
|
+
renderTarget.texture.addEventListener( 'dispose', dispose );
|
|
1817
|
+
|
|
1818
|
+
} else {
|
|
1819
|
+
|
|
1820
|
+
quad = quadData.quad;
|
|
1821
|
+
|
|
1822
|
+
if ( quadData.cacheKey !== cacheKey ) {
|
|
1823
|
+
|
|
1824
|
+
quad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );
|
|
1825
|
+
quad.material.needsUpdate = true;
|
|
1826
|
+
|
|
1827
|
+
quadData.cacheKey = cacheKey;
|
|
1828
|
+
|
|
1829
|
+
}
|
|
1617
1830
|
|
|
1618
1831
|
}
|
|
1619
1832
|
|
|
@@ -1640,7 +1853,7 @@ class Renderer {
|
|
|
1640
1853
|
*/
|
|
1641
1854
|
getMaxAnisotropy() {
|
|
1642
1855
|
|
|
1643
|
-
return this.backend.getMaxAnisotropy();
|
|
1856
|
+
return this.backend.capabilities.getMaxAnisotropy();
|
|
1644
1857
|
|
|
1645
1858
|
}
|
|
1646
1859
|
|
|
@@ -1699,12 +1912,42 @@ class Renderer {
|
|
|
1699
1912
|
* from the GPU to the CPU in context of compute shaders.
|
|
1700
1913
|
*
|
|
1701
1914
|
* @async
|
|
1702
|
-
* @param {
|
|
1703
|
-
* @
|
|
1915
|
+
* @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
|
|
1916
|
+
* @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
|
|
1917
|
+
* @param {number} offset - The storage buffer attribute.
|
|
1918
|
+
* @param {number} count - The offset from which to start reading the
|
|
1919
|
+
* @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
|
|
1704
1920
|
*/
|
|
1705
|
-
async getArrayBufferAsync( attribute ) {
|
|
1921
|
+
async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
|
|
1922
|
+
|
|
1923
|
+
// tally the memory for this readback buffer
|
|
1924
|
+
if ( target !== null && target.isReadbackBuffer ) {
|
|
1925
|
+
|
|
1926
|
+
if ( this.info.memoryMap.has( target ) === false ) {
|
|
1927
|
+
|
|
1928
|
+
this.info.createReadbackBuffer( target );
|
|
1929
|
+
|
|
1930
|
+
const disposeInfo = () => {
|
|
1706
1931
|
|
|
1707
|
-
|
|
1932
|
+
target.removeEventListener( 'dispose', disposeInfo );
|
|
1933
|
+
|
|
1934
|
+
this.info.destroyReadbackBuffer( target );
|
|
1935
|
+
|
|
1936
|
+
};
|
|
1937
|
+
|
|
1938
|
+
target.addEventListener( 'dispose', disposeInfo );
|
|
1939
|
+
|
|
1940
|
+
}
|
|
1941
|
+
|
|
1942
|
+
}
|
|
1943
|
+
|
|
1944
|
+
if ( offset % 4 !== 0 || ( count > 0 && count % 4 !== 0 ) ) {
|
|
1945
|
+
|
|
1946
|
+
throw new Error( 'THREE.Renderer: "getArrayBufferAsync()" offset and count must be a multiple of 4.' );
|
|
1947
|
+
|
|
1948
|
+
}
|
|
1949
|
+
|
|
1950
|
+
return await this.backend.getArrayBufferAsync( attribute, target, offset, count );
|
|
1708
1951
|
|
|
1709
1952
|
}
|
|
1710
1953
|
|
|
@@ -1842,9 +2085,9 @@ class Renderer {
|
|
|
1842
2085
|
/**
|
|
1843
2086
|
* Defines the scissor rectangle.
|
|
1844
2087
|
*
|
|
1845
|
-
* @param {number | Vector4} x - The horizontal coordinate for the
|
|
2088
|
+
* @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the box in logical pixel unit.
|
|
1846
2089
|
* Instead of passing four arguments, the method also works with a single four-dimensional vector.
|
|
1847
|
-
* @param {number} y - The vertical coordinate for the
|
|
2090
|
+
* @param {number} y - The vertical coordinate for the upper left corner of the box in logical pixel unit.
|
|
1848
2091
|
* @param {number} width - The width of the scissor box in logical pixel unit.
|
|
1849
2092
|
* @param {number} height - The height of the scissor box in logical pixel unit.
|
|
1850
2093
|
*/
|
|
@@ -1895,8 +2138,8 @@ class Renderer {
|
|
|
1895
2138
|
/**
|
|
1896
2139
|
* Defines the viewport.
|
|
1897
2140
|
*
|
|
1898
|
-
* @param {number | Vector4} x - The horizontal coordinate for the
|
|
1899
|
-
* @param {number} y - The vertical coordinate for the
|
|
2141
|
+
* @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the viewport origin in logical pixel unit.
|
|
2142
|
+
* @param {number} y - The vertical coordinate for the upper left corner of the viewport origin in logical pixel unit.
|
|
1900
2143
|
* @param {number} width - The width of the viewport in logical pixel unit.
|
|
1901
2144
|
* @param {number} height - The height of the viewport in logical pixel unit.
|
|
1902
2145
|
* @param {number} minDepth - The minimum depth value of the viewport. WebGPU only.
|
|
@@ -1962,7 +2205,7 @@ class Renderer {
|
|
|
1962
2205
|
*/
|
|
1963
2206
|
getClearDepth() {
|
|
1964
2207
|
|
|
1965
|
-
return this._clearDepth;
|
|
2208
|
+
return ( this.reversedDepthBuffer === true ) ? 1 - this._clearDepth : this._clearDepth;
|
|
1966
2209
|
|
|
1967
2210
|
}
|
|
1968
2211
|
|
|
@@ -2040,7 +2283,7 @@ class Renderer {
|
|
|
2040
2283
|
|
|
2041
2284
|
const renderTargetData = this._textures.get( renderTarget );
|
|
2042
2285
|
|
|
2043
|
-
renderContext = this._renderContexts.
|
|
2286
|
+
renderContext = this._renderContexts.get( renderTarget, null, - 1 ); // using - 1 for the call depth to get a render context for the clear operation
|
|
2044
2287
|
renderContext.textures = renderTargetData.textures;
|
|
2045
2288
|
renderContext.depthTexture = renderTargetData.depthTexture;
|
|
2046
2289
|
renderContext.width = renderTargetData.width;
|
|
@@ -2049,10 +2292,18 @@ class Renderer {
|
|
|
2049
2292
|
renderContext.depth = renderTarget.depthBuffer;
|
|
2050
2293
|
renderContext.stencil = renderTarget.stencilBuffer;
|
|
2051
2294
|
// #30329
|
|
2052
|
-
|
|
2295
|
+
const color = this.backend.getClearColor();
|
|
2296
|
+
renderContext.clearColorValue.r = color.r;
|
|
2297
|
+
renderContext.clearColorValue.g = color.g;
|
|
2298
|
+
renderContext.clearColorValue.b = color.b;
|
|
2299
|
+
renderContext.clearColorValue.a = color.a;
|
|
2300
|
+
renderContext.clearDepthValue = this.getClearDepth();
|
|
2301
|
+
renderContext.clearStencilValue = this.getClearStencil();
|
|
2053
2302
|
renderContext.activeCubeFace = this.getActiveCubeFace();
|
|
2054
2303
|
renderContext.activeMipmapLevel = this.getActiveMipmapLevel();
|
|
2055
2304
|
|
|
2305
|
+
if ( renderTarget.depthBuffer === true ) renderTargetData.depthInitialized = true;
|
|
2306
|
+
|
|
2056
2307
|
}
|
|
2057
2308
|
|
|
2058
2309
|
this.backend.clear( color, depth, stencil, renderContext );
|
|
@@ -2266,7 +2517,11 @@ class Renderer {
|
|
|
2266
2517
|
this._renderContexts.dispose();
|
|
2267
2518
|
this._textures.dispose();
|
|
2268
2519
|
|
|
2269
|
-
|
|
2520
|
+
for ( const canvasTarget of this._frameBufferTargets.keys() ) {
|
|
2521
|
+
|
|
2522
|
+
canvasTarget.dispose();
|
|
2523
|
+
|
|
2524
|
+
}
|
|
2270
2525
|
|
|
2271
2526
|
Object.values( this.backend.timestampQueryPool ).forEach( queryPool => {
|
|
2272
2527
|
|
|
@@ -2312,7 +2567,7 @@ class Renderer {
|
|
|
2312
2567
|
/**
|
|
2313
2568
|
* Sets the output render target for the renderer.
|
|
2314
2569
|
*
|
|
2315
|
-
* @param {
|
|
2570
|
+
* @param {?RenderTarget} renderTarget - The render target to set as the output target.
|
|
2316
2571
|
*/
|
|
2317
2572
|
setOutputRenderTarget( renderTarget ) {
|
|
2318
2573
|
|
|
@@ -2360,6 +2615,7 @@ class Renderer {
|
|
|
2360
2615
|
/**
|
|
2361
2616
|
* Resets the renderer to the initial state before WebXR started.
|
|
2362
2617
|
*
|
|
2618
|
+
* @private
|
|
2363
2619
|
*/
|
|
2364
2620
|
_resetXRState() {
|
|
2365
2621
|
|
|
@@ -2367,8 +2623,11 @@ class Renderer {
|
|
|
2367
2623
|
this.setOutputRenderTarget( null );
|
|
2368
2624
|
this.setRenderTarget( null );
|
|
2369
2625
|
|
|
2370
|
-
this.
|
|
2371
|
-
|
|
2626
|
+
for ( const canvasTarget of this._frameBufferTargets.keys() ) {
|
|
2627
|
+
|
|
2628
|
+
canvasTarget.dispose();
|
|
2629
|
+
|
|
2630
|
+
}
|
|
2372
2631
|
|
|
2373
2632
|
}
|
|
2374
2633
|
|
|
@@ -2641,6 +2900,37 @@ class Renderer {
|
|
|
2641
2900
|
|
|
2642
2901
|
}
|
|
2643
2902
|
|
|
2903
|
+
/**
|
|
2904
|
+
* Initializes the given render target.
|
|
2905
|
+
*
|
|
2906
|
+
* @param {RenderTarget} renderTarget - The render target to intialize.
|
|
2907
|
+
*/
|
|
2908
|
+
initRenderTarget( renderTarget ) {
|
|
2909
|
+
|
|
2910
|
+
if ( this._initialized === false ) {
|
|
2911
|
+
|
|
2912
|
+
throw new Error( 'Renderer: .initRenderTarget() called before the backend is initialized. Use "await renderer.init();" before before using this method.' );
|
|
2913
|
+
|
|
2914
|
+
}
|
|
2915
|
+
|
|
2916
|
+
this._textures.updateRenderTarget( renderTarget );
|
|
2917
|
+
|
|
2918
|
+
const renderTargetData = this._textures.get( renderTarget );
|
|
2919
|
+
|
|
2920
|
+
const renderContext = this._renderContexts.get( renderTarget );
|
|
2921
|
+
|
|
2922
|
+
renderContext.textures = renderTargetData.textures;
|
|
2923
|
+
renderContext.depthTexture = renderTargetData.depthTexture;
|
|
2924
|
+
renderContext.width = renderTargetData.width;
|
|
2925
|
+
renderContext.height = renderTargetData.height;
|
|
2926
|
+
renderContext.renderTarget = renderTarget;
|
|
2927
|
+
renderContext.depth = renderTarget.depthBuffer;
|
|
2928
|
+
renderContext.stencil = renderTarget.stencilBuffer;
|
|
2929
|
+
|
|
2930
|
+
this.backend.initRenderTarget( renderContext );
|
|
2931
|
+
|
|
2932
|
+
}
|
|
2933
|
+
|
|
2644
2934
|
/**
|
|
2645
2935
|
* Copies the current bound framebuffer into the given texture.
|
|
2646
2936
|
*
|
|
@@ -2750,6 +3040,7 @@ class Renderer {
|
|
|
2750
3040
|
* Analyzes the given 3D object's hierarchy and builds render lists from the
|
|
2751
3041
|
* processed hierarchy.
|
|
2752
3042
|
*
|
|
3043
|
+
* @private
|
|
2753
3044
|
* @param {Object3D} object - The 3D object to process (usually a scene).
|
|
2754
3045
|
* @param {Camera} camera - The camera the object is rendered with.
|
|
2755
3046
|
* @param {number} groupOrder - The group order is derived from the `renderOrder` of groups and is used to group 3D objects within groups.
|
|
@@ -2975,6 +3266,7 @@ class Renderer {
|
|
|
2975
3266
|
* Retrieves shadow nodes for the given material. This is used to setup shadow passes.
|
|
2976
3267
|
* The result is cached per material and updated when the material's version changes.
|
|
2977
3268
|
*
|
|
3269
|
+
* @private
|
|
2978
3270
|
* @param {Material} material
|
|
2979
3271
|
* @returns {Object} - The shadow nodes for the material.
|
|
2980
3272
|
*/
|
|
@@ -2989,12 +3281,13 @@ class Renderer {
|
|
|
2989
3281
|
const hasMap = material.map !== null;
|
|
2990
3282
|
const hasColorNode = material.colorNode && material.colorNode.isNode;
|
|
2991
3283
|
const hasCastShadowNode = material.castShadowNode && material.castShadowNode.isNode;
|
|
3284
|
+
const hasMaskNode = ( material.maskShadowNode && material.maskShadowNode.isNode ) || ( material.maskNode && material.maskNode.isNode );
|
|
2992
3285
|
|
|
2993
3286
|
let positionNode = null;
|
|
2994
3287
|
let colorNode = null;
|
|
2995
3288
|
let depthNode = null;
|
|
2996
3289
|
|
|
2997
|
-
if ( hasMap || hasColorNode || hasCastShadowNode ) {
|
|
3290
|
+
if ( hasMap || hasColorNode || hasCastShadowNode || hasMaskNode ) {
|
|
2998
3291
|
|
|
2999
3292
|
let shadowRGB;
|
|
3000
3293
|
let shadowAlpha;
|
|
@@ -3004,6 +3297,12 @@ class Renderer {
|
|
|
3004
3297
|
shadowRGB = material.castShadowNode.rgb;
|
|
3005
3298
|
shadowAlpha = material.castShadowNode.a;
|
|
3006
3299
|
|
|
3300
|
+
if ( this.shadowMap.transmitted !== true ) {
|
|
3301
|
+
|
|
3302
|
+
warnOnce( 'Renderer: `shadowMap.transmitted` needs to be set to `true` when using `material.castShadowNode`.' );
|
|
3303
|
+
|
|
3304
|
+
}
|
|
3305
|
+
|
|
3007
3306
|
} else {
|
|
3008
3307
|
|
|
3009
3308
|
shadowRGB = vec3( 0 );
|
|
@@ -3025,6 +3324,20 @@ class Renderer {
|
|
|
3025
3324
|
|
|
3026
3325
|
colorNode = vec4( shadowRGB, shadowAlpha );
|
|
3027
3326
|
|
|
3327
|
+
if ( hasMaskNode ) {
|
|
3328
|
+
|
|
3329
|
+
const maskNode = material.maskShadowNode || material.maskNode;
|
|
3330
|
+
|
|
3331
|
+
colorNode = Fn( ( [ color ] ) => {
|
|
3332
|
+
|
|
3333
|
+
maskNode.not().discard();
|
|
3334
|
+
|
|
3335
|
+
return color;
|
|
3336
|
+
|
|
3337
|
+
} )( colorNode );
|
|
3338
|
+
|
|
3339
|
+
}
|
|
3340
|
+
|
|
3028
3341
|
}
|
|
3029
3342
|
|
|
3030
3343
|
if ( material.depthNode && material.depthNode.isNode ) {
|
|
@@ -3093,9 +3406,9 @@ class Renderer {
|
|
|
3093
3406
|
materialOverride = true;
|
|
3094
3407
|
|
|
3095
3408
|
// store original nodes
|
|
3096
|
-
materialColorNode =
|
|
3097
|
-
materialDepthNode =
|
|
3098
|
-
materialPositionNode =
|
|
3409
|
+
materialColorNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.colorNode : null;
|
|
3410
|
+
materialDepthNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.depthNode : null;
|
|
3411
|
+
materialPositionNode = ( overrideMaterial.isNodeMaterial ) ? overrideMaterial.positionNode : null;
|
|
3099
3412
|
materialSide = scene.overrideMaterial.side;
|
|
3100
3413
|
|
|
3101
3414
|
if ( material.positionNode && material.positionNode.isNode ) {
|
|
@@ -3114,7 +3427,15 @@ class Renderer {
|
|
|
3114
3427
|
|
|
3115
3428
|
const { colorNode, depthNode, positionNode } = this._getShadowNodes( material );
|
|
3116
3429
|
|
|
3117
|
-
|
|
3430
|
+
if ( this.shadowMap.type === VSMShadowMap ) {
|
|
3431
|
+
|
|
3432
|
+
overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;
|
|
3433
|
+
|
|
3434
|
+
} else {
|
|
3435
|
+
|
|
3436
|
+
overrideMaterial.side = ( material.shadowSide !== null ) ? material.shadowSide : _shadowSide[ material.side ];
|
|
3437
|
+
|
|
3438
|
+
}
|
|
3118
3439
|
|
|
3119
3440
|
if ( colorNode !== null ) overrideMaterial.colorNode = colorNode;
|
|
3120
3441
|
if ( depthNode !== null ) overrideMaterial.depthNode = depthNode;
|
|
@@ -3161,6 +3482,24 @@ class Renderer {
|
|
|
3161
3482
|
|
|
3162
3483
|
}
|
|
3163
3484
|
|
|
3485
|
+
/**
|
|
3486
|
+
* Checks if the given compatibility is supported by the selected backend.
|
|
3487
|
+
*
|
|
3488
|
+
* @param {string} name - The compatibility's name.
|
|
3489
|
+
* @return {boolean} Whether the compatibility is supported or not.
|
|
3490
|
+
*/
|
|
3491
|
+
hasCompatibility( name ) {
|
|
3492
|
+
|
|
3493
|
+
if ( this._initialized === false ) {
|
|
3494
|
+
|
|
3495
|
+
throw new Error( 'Renderer: .hasCompatibility() called before the backend is initialized. Use "await renderer.init();" before using this method.' );
|
|
3496
|
+
|
|
3497
|
+
}
|
|
3498
|
+
|
|
3499
|
+
return this.backend.hasCompatibility( name );
|
|
3500
|
+
|
|
3501
|
+
}
|
|
3502
|
+
|
|
3164
3503
|
/**
|
|
3165
3504
|
* This method represents the default `_handleObjectFunction` implementation which creates
|
|
3166
3505
|
* a render object from the given data and performs the draw command with the selected backend.
|
|
@@ -3181,6 +3520,16 @@ class Renderer {
|
|
|
3181
3520
|
renderObject.drawRange = object.geometry.drawRange;
|
|
3182
3521
|
renderObject.group = group;
|
|
3183
3522
|
|
|
3523
|
+
if ( this._currentRenderBundle !== null ) {
|
|
3524
|
+
|
|
3525
|
+
const renderBundleData = this.backend.get( this._currentRenderBundle );
|
|
3526
|
+
|
|
3527
|
+
renderBundleData.renderObjects.push( renderObject );
|
|
3528
|
+
|
|
3529
|
+
renderObject.bundle = this._currentRenderBundle.bundleGroup;
|
|
3530
|
+
|
|
3531
|
+
}
|
|
3532
|
+
|
|
3184
3533
|
//
|
|
3185
3534
|
|
|
3186
3535
|
const needsRefresh = this._nodes.needsRefresh( renderObject );
|
|
@@ -3200,20 +3549,14 @@ class Renderer {
|
|
|
3200
3549
|
|
|
3201
3550
|
//
|
|
3202
3551
|
|
|
3203
|
-
if ( this.
|
|
3204
|
-
|
|
3205
|
-
const renderBundleData = this.backend.get( this._currentRenderBundle );
|
|
3552
|
+
if ( this._pipelines.isReady( renderObject ) ) {
|
|
3206
3553
|
|
|
3207
|
-
|
|
3554
|
+
this.backend.draw( renderObject, this.info );
|
|
3208
3555
|
|
|
3209
|
-
|
|
3556
|
+
if ( needsRefresh ) this._nodes.updateAfter( renderObject );
|
|
3210
3557
|
|
|
3211
3558
|
}
|
|
3212
3559
|
|
|
3213
|
-
this.backend.draw( renderObject, this.info );
|
|
3214
|
-
|
|
3215
|
-
if ( needsRefresh ) this._nodes.updateAfter( renderObject );
|
|
3216
|
-
|
|
3217
3560
|
}
|
|
3218
3561
|
|
|
3219
3562
|
/**
|
|
@@ -3232,6 +3575,27 @@ class Renderer {
|
|
|
3232
3575
|
*/
|
|
3233
3576
|
_createObjectPipeline( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {
|
|
3234
3577
|
|
|
3578
|
+
// If in async compilation mode, queue the work for sequential execution
|
|
3579
|
+
if ( this._compilationPromises !== null ) {
|
|
3580
|
+
|
|
3581
|
+
// Store work items instead of promises - will be processed sequentially
|
|
3582
|
+
this._compilationPromises.push( {
|
|
3583
|
+
object,
|
|
3584
|
+
material,
|
|
3585
|
+
scene,
|
|
3586
|
+
camera,
|
|
3587
|
+
lightsNode,
|
|
3588
|
+
group,
|
|
3589
|
+
clippingContext,
|
|
3590
|
+
passId,
|
|
3591
|
+
renderContext: this._currentRenderContext
|
|
3592
|
+
} );
|
|
3593
|
+
|
|
3594
|
+
return;
|
|
3595
|
+
|
|
3596
|
+
}
|
|
3597
|
+
|
|
3598
|
+
// Sync path
|
|
3235
3599
|
const renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );
|
|
3236
3600
|
renderObject.drawRange = object.geometry.drawRange;
|
|
3237
3601
|
renderObject.group = group;
|