super-three 0.171.0 → 0.172.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/three.cjs +157 -49
- package/build/three.core.js +104 -42
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +53 -8
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +10 -5
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +21191 -1008
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +21189 -1008
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/jsm/Addons.js +0 -5
- package/examples/jsm/animation/CCDIKSolver.js +3 -2
- package/examples/jsm/controls/ArcballControls.js +28 -19
- package/examples/jsm/controls/OrbitControls.js +5 -4
- package/examples/jsm/csm/CSMShadowNode.js +16 -11
- package/examples/jsm/curves/NURBSCurve.js +1 -1
- package/examples/jsm/curves/NURBSUtils.js +3 -0
- package/examples/jsm/effects/OutlineEffect.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +11 -7
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/PLYExporter.js +2 -2
- package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
- package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
- package/examples/jsm/lights/LightProbeGenerator.js +3 -3
- package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
- package/examples/jsm/loaders/3MFLoader.js +6 -3
- package/examples/jsm/loaders/BVHLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +5 -5
- package/examples/jsm/loaders/DDSLoader.js +42 -0
- package/examples/jsm/loaders/GCodeLoader.js +1 -1
- package/examples/jsm/loaders/GLTFLoader.js +22 -2
- package/examples/jsm/loaders/KTX2Loader.js +6 -1
- package/examples/jsm/loaders/KTXLoader.js +4 -4
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LottieLoader.js +1 -1
- package/examples/jsm/loaders/MTLLoader.js +1 -0
- package/examples/jsm/loaders/NRRDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +7 -7
- package/examples/jsm/loaders/PVRLoader.js +1 -1
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TDSLoader.js +1 -1
- package/examples/jsm/loaders/VRMLLoader.js +7 -7
- package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
- package/examples/jsm/math/ConvexHull.js +1 -1
- package/examples/jsm/math/OBB.js +17 -0
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +10 -10
- package/examples/jsm/misc/Volume.js +20 -12
- package/examples/jsm/misc/VolumeSlice.js +2 -2
- package/examples/jsm/modifiers/CurveModifier.js +10 -8
- package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
- package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
- package/examples/jsm/objects/GroundedSkybox.js +4 -4
- package/examples/jsm/objects/Sky.js +2 -2
- package/examples/jsm/objects/SkyMesh.js +3 -3
- package/examples/jsm/objects/Water2.js +1 -1
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/objects/WaterMesh.js +4 -4
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/EffectComposer.js +1 -2
- package/examples/jsm/postprocessing/OutlinePass.js +4 -4
- package/examples/jsm/postprocessing/SAOPass.js +1 -2
- package/examples/jsm/postprocessing/SMAAPass.js +1 -3
- package/examples/jsm/postprocessing/SSAOPass.js +2 -4
- package/examples/jsm/postprocessing/SSRPass.js +2 -4
- package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
- package/examples/jsm/renderers/SVGRenderer.js +6 -4
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/GodRaysShader.js +3 -3
- package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
- package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
- package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
- package/examples/jsm/tsl/display/BleachBypass.js +10 -0
- package/examples/jsm/tsl/display/BloomNode.js +233 -26
- package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
- package/examples/jsm/tsl/display/FXAANode.js +52 -3
- package/examples/jsm/tsl/display/FilmNode.js +47 -1
- package/examples/jsm/tsl/display/GTAONode.js +210 -14
- package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
- package/examples/jsm/tsl/display/LensflareNode.js +131 -13
- package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
- package/examples/jsm/tsl/display/MotionBlur.js +12 -2
- package/examples/jsm/tsl/display/OutlineNode.js +343 -26
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
- package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
- package/examples/jsm/tsl/display/SMAANode.js +187 -46
- package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
- package/examples/jsm/tsl/display/SSRNode.js +194 -21
- package/examples/jsm/tsl/display/Sepia.js +9 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
- package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
- package/examples/jsm/tsl/display/TransitionNode.js +71 -6
- package/examples/jsm/tsl/display/hashBlur.js +14 -3
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/CameraUtils.js +4 -1
- package/examples/jsm/utils/GeometryUtils.js +22 -19
- package/examples/jsm/utils/SceneUtils.js +2 -2
- package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
- package/examples/jsm/webxr/XREstimatedLight.js +1 -1
- package/package.json +8 -3
- package/src/Three.Core.js +2 -0
- package/src/Three.Legacy.js +0 -21
- package/src/Three.TSL.js +9 -4
- package/src/Three.WebGPU.Nodes.js +2 -2
- package/src/Three.WebGPU.js +2 -2
- package/src/animation/PropertyBinding.js +2 -2
- package/src/cameras/PerspectiveCamera.js +18 -2
- package/src/constants.js +1 -1
- package/src/core/RenderTarget.js +18 -0
- package/src/core/RenderTarget3D.js +22 -0
- package/src/core/RenderTargetArray.js +22 -0
- package/src/extras/Earcut.js +1 -1
- package/src/extras/PMREMGenerator.js +20 -0
- package/src/extras/TextureUtils.js +6 -0
- package/src/helpers/CameraHelper.js +16 -13
- package/src/loaders/nodes/NodeLoader.js +59 -0
- package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
- package/src/loaders/nodes/NodeObjectLoader.js +61 -0
- package/src/materials/nodes/InstancedPointsNodeMaterial.js +72 -19
- package/src/materials/nodes/Line2NodeMaterial.js +128 -34
- package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
- package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
- package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
- package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
- package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
- package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
- package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
- package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
- package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
- package/src/materials/nodes/NodeMaterial.js +474 -21
- package/src/materials/nodes/PointsNodeMaterial.js +22 -13
- package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
- package/src/materials/nodes/SpriteNodeMaterial.js +77 -19
- package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
- package/src/materials/nodes/manager/NodeMaterialObserver.js +87 -0
- package/src/nodes/Nodes.js +1 -6
- package/src/nodes/TSL.js +2 -3
- package/src/nodes/accessors/AccessorsUtils.js +27 -0
- package/src/nodes/accessors/Arrays.js +24 -5
- package/src/nodes/accessors/BatchNode.js +39 -3
- package/src/nodes/accessors/Bitangent.js +37 -0
- package/src/nodes/accessors/BufferAttributeNode.js +178 -5
- package/src/nodes/accessors/BufferNode.js +63 -0
- package/src/nodes/accessors/BuiltinNode.js +38 -0
- package/src/nodes/accessors/Camera.js +49 -0
- package/src/nodes/accessors/ClippingNode.js +71 -2
- package/src/nodes/accessors/CubeTextureNode.js +64 -0
- package/src/nodes/accessors/InstanceNode.js +85 -2
- package/src/nodes/accessors/InstancedMeshNode.js +28 -3
- package/src/nodes/accessors/InstancedPointsMaterialNode.js +13 -0
- package/src/nodes/accessors/Lights.js +50 -1
- package/src/nodes/accessors/MaterialNode.js +302 -8
- package/src/nodes/accessors/MaterialProperties.js +7 -0
- package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
- package/src/nodes/accessors/ModelNode.js +100 -5
- package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
- package/src/nodes/accessors/MorphNode.js +48 -4
- package/src/nodes/accessors/Normal.js +59 -3
- package/src/nodes/accessors/Object3DNode.js +102 -1
- package/src/nodes/accessors/PointUVNode.js +26 -0
- package/src/nodes/accessors/Position.js +53 -4
- package/src/nodes/accessors/ReferenceBaseNode.js +188 -0
- package/src/nodes/accessors/ReferenceNode.js +202 -2
- package/src/nodes/accessors/ReflectVector.js +24 -0
- package/src/nodes/accessors/RendererReferenceNode.js +46 -1
- package/src/nodes/accessors/SceneNode.js +54 -0
- package/src/nodes/accessors/SkinningNode.js +127 -1
- package/src/nodes/accessors/StorageBufferNode.js +168 -4
- package/src/nodes/accessors/StorageTextureNode.js +118 -0
- package/src/nodes/accessors/Tangent.js +36 -0
- package/src/nodes/accessors/Texture3DNode.js +89 -5
- package/src/nodes/accessors/TextureBicubic.js +12 -2
- package/src/nodes/accessors/TextureNode.js +309 -10
- package/src/nodes/accessors/TextureSizeNode.js +42 -0
- package/src/nodes/accessors/UV.js +10 -1
- package/src/nodes/accessors/UniformArrayNode.js +223 -23
- package/src/nodes/accessors/UserDataNode.js +46 -0
- package/src/nodes/accessors/VelocityNode.js +82 -0
- package/src/nodes/accessors/VertexColorNode.js +39 -2
- package/src/nodes/code/CodeNode.js +95 -1
- package/src/nodes/code/ExpressionNode.js +28 -0
- package/src/nodes/code/FunctionCallNode.js +37 -0
- package/src/nodes/code/FunctionNode.js +45 -0
- package/src/nodes/code/ScriptableNode.js +223 -1
- package/src/nodes/code/ScriptableValueNode.js +85 -1
- package/src/nodes/core/AssignNode.js +48 -2
- package/src/nodes/core/AttributeNode.js +43 -0
- package/src/nodes/core/BypassNode.js +47 -2
- package/src/nodes/core/CacheNode.js +53 -2
- package/src/nodes/core/ConstNode.js +24 -0
- package/src/nodes/core/ContextNode.js +65 -0
- package/src/nodes/core/IndexNode.js +68 -7
- package/src/nodes/core/InputNode.js +48 -0
- package/src/nodes/core/LightingModel.js +60 -0
- package/src/nodes/core/MRTNode.js +66 -0
- package/src/nodes/core/Node.js +337 -12
- package/src/nodes/core/NodeAttribute.js +38 -0
- package/src/nodes/core/NodeBuilder.js +945 -15
- package/src/nodes/core/NodeCache.js +41 -2
- package/src/nodes/core/NodeCode.js +31 -0
- package/src/nodes/core/NodeFrame.js +123 -2
- package/src/nodes/core/NodeFunction.js +46 -0
- package/src/nodes/core/NodeFunctionInput.js +44 -0
- package/src/nodes/core/NodeParser.js +11 -0
- package/src/nodes/core/NodeUniform.js +52 -0
- package/src/nodes/core/NodeUtils.js +141 -0
- package/src/nodes/core/NodeVar.js +30 -0
- package/src/nodes/core/NodeVarying.js +28 -0
- package/src/nodes/core/OutputStructNode.js +33 -2
- package/src/nodes/core/ParameterNode.js +28 -0
- package/src/nodes/core/PropertyNode.js +232 -0
- package/src/nodes/core/StackNode.js +78 -0
- package/src/nodes/core/StructTypeNode.js +39 -1
- package/src/nodes/core/TempNode.js +30 -4
- package/src/nodes/core/UniformGroupNode.js +82 -7
- package/src/nodes/core/UniformNode.js +66 -0
- package/src/nodes/core/VarNode.js +52 -0
- package/src/nodes/core/VaryingNode.js +83 -2
- package/src/nodes/core/constants.js +36 -0
- package/src/nodes/display/BumpMapNode.js +37 -0
- package/src/nodes/display/ColorAdjustment.js +53 -11
- package/src/nodes/display/ColorSpaceFunctions.js +16 -0
- package/src/nodes/display/ColorSpaceNode.js +82 -0
- package/src/nodes/display/FrontFacingNode.js +29 -0
- package/src/nodes/display/NormalMapNode.js +43 -0
- package/src/nodes/display/PassNode.js +298 -7
- package/src/nodes/display/PosterizeNode.js +33 -0
- package/src/nodes/display/RenderOutputNode.js +66 -1
- package/src/nodes/display/ScreenNode.js +87 -0
- package/src/nodes/display/ToneMappingFunctions.js +58 -10
- package/src/nodes/display/ToneMappingNode.js +55 -2
- package/src/nodes/display/ToonOutlinePassNode.js +73 -0
- package/src/nodes/display/ViewportDepthNode.js +122 -8
- package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
- package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
- package/src/nodes/display/ViewportTextureNode.js +57 -0
- package/src/nodes/fog/Fog.js +93 -0
- package/src/nodes/functions/BasicLightingModel.js +24 -0
- package/src/nodes/functions/PhongLightingModel.js +34 -2
- package/src/nodes/functions/PhysicalLightingModel.js +167 -8
- package/src/nodes/functions/ShadowMaskModel.js +23 -0
- package/src/nodes/functions/ToonLightingModel.js +20 -0
- package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
- package/src/nodes/geometry/RangeNode.js +54 -2
- package/src/nodes/gpgpu/AtomicFunctionNode.js +157 -1
- package/src/nodes/gpgpu/BarrierNode.js +47 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +126 -0
- package/src/nodes/gpgpu/ComputeNode.js +106 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
- package/src/nodes/lighting/AONode.js +18 -0
- package/src/nodes/lighting/AmbientLightNode.js +10 -0
- package/src/nodes/lighting/AnalyticLightNode.js +97 -2
- package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
- package/src/nodes/lighting/BasicLightMapNode.js +17 -0
- package/src/nodes/lighting/DirectionalLightNode.js +10 -0
- package/src/nodes/lighting/EnvironmentNode.js +18 -0
- package/src/nodes/lighting/HemisphereLightNode.js +31 -0
- package/src/nodes/lighting/IESSpotLightNode.js +11 -0
- package/src/nodes/lighting/IrradianceNode.js +17 -0
- package/src/nodes/lighting/LightProbeNode.js +20 -0
- package/src/nodes/lighting/LightUtils.js +12 -0
- package/src/nodes/lighting/LightingContextNode.js +48 -0
- package/src/nodes/lighting/LightingNode.js +15 -6
- package/src/nodes/lighting/LightsNode.js +132 -1
- package/src/nodes/lighting/PointLightNode.js +32 -1
- package/src/nodes/lighting/PointShadowNode.js +54 -1
- package/src/nodes/lighting/RectAreaLightNode.js +44 -6
- package/src/nodes/lighting/ShadowBaseNode.js +93 -0
- package/src/nodes/lighting/ShadowNode.js +240 -34
- package/src/nodes/lighting/SpotLightNode.js +43 -0
- package/src/nodes/math/ConditionalNode.js +70 -3
- package/src/nodes/math/Hash.js +9 -0
- package/src/nodes/math/MathNode.js +614 -11
- package/src/nodes/math/MathUtils.js +45 -1
- package/src/nodes/math/OperatorNode.js +233 -0
- package/src/nodes/math/TriNoise3D.js +18 -7
- package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
- package/src/nodes/parsers/GLSLNodeParser.js +11 -0
- package/src/nodes/pmrem/PMREMNode.js +133 -0
- package/src/nodes/pmrem/PMREMUtils.js +1 -1
- package/src/nodes/procedural/Checker.js +9 -0
- package/src/nodes/tsl/TSLBase.js +2 -2
- package/src/nodes/utils/ArrayElementNode.js +38 -2
- package/src/nodes/utils/ConvertNode.js +31 -0
- package/src/nodes/utils/CubeMapNode.js +78 -0
- package/src/nodes/utils/Discard.js +16 -0
- package/src/nodes/utils/EquirectUVNode.js +31 -1
- package/src/nodes/utils/FlipNode.js +38 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
- package/src/nodes/utils/JoinNode.js +25 -0
- package/src/nodes/utils/LoopNode.js +74 -1
- package/src/nodes/utils/MatcapUVNode.js +17 -0
- package/src/nodes/utils/MaxMipLevelNode.js +49 -0
- package/src/nodes/utils/Oscillators.js +33 -0
- package/src/nodes/utils/Packing.js +17 -0
- package/src/nodes/utils/PostProcessingUtils.js +28 -23
- package/src/nodes/utils/RTTNode.js +123 -2
- package/src/nodes/utils/ReflectorNode.js +174 -4
- package/src/nodes/utils/RemapNode.js +79 -0
- package/src/nodes/utils/RotateNode.js +41 -0
- package/src/nodes/utils/SetNode.js +44 -1
- package/src/nodes/utils/SplitNode.js +55 -3
- package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
- package/src/nodes/utils/SpriteUtils.js +17 -0
- package/src/nodes/utils/StorageArrayElementNode.js +40 -0
- package/src/nodes/utils/Timer.js +19 -0
- package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
- package/src/nodes/utils/UVUtils.js +20 -0
- package/src/nodes/utils/ViewportUtils.js +13 -0
- package/src/objects/BatchedMesh.js +1 -2
- package/src/objects/ClippingGroup.js +49 -0
- package/src/renderers/WebGLRenderer.js +23 -4
- package/src/renderers/common/Animation.js +63 -0
- package/src/renderers/common/Attributes.js +36 -0
- package/src/renderers/common/Backend.js +467 -52
- package/src/renderers/common/Background.js +34 -1
- package/src/renderers/common/BindGroup.js +43 -0
- package/src/renderers/common/Binding.js +35 -0
- package/src/renderers/common/Bindings.js +93 -1
- package/src/renderers/common/Buffer.js +49 -0
- package/src/renderers/common/BufferUtils.js +27 -0
- package/src/renderers/common/BundleGroup.js +57 -0
- package/src/renderers/common/ChainMap.js +38 -1
- package/src/renderers/common/ClippingContext.js +107 -14
- package/src/renderers/common/Color4.js +36 -0
- package/src/renderers/common/ComputePipeline.js +24 -0
- package/src/renderers/common/CubeRenderTarget.js +13 -0
- package/src/renderers/common/DataMap.js +37 -1
- package/src/renderers/common/Geometries.js +98 -0
- package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
- package/src/renderers/common/Info.js +87 -0
- package/src/renderers/common/Lighting.js +26 -0
- package/src/renderers/common/Pipeline.js +22 -0
- package/src/renderers/common/Pipelines.js +148 -5
- package/src/renderers/common/PostProcessing.js +75 -3
- package/src/renderers/common/ProgrammableStage.js +60 -2
- package/src/renderers/common/QuadMesh.js +54 -5
- package/src/renderers/common/RenderBundle.js +14 -8
- package/src/renderers/common/RenderBundles.js +33 -10
- package/src/renderers/common/RenderContext.js +169 -4
- package/src/renderers/common/RenderContexts.js +42 -2
- package/src/renderers/common/RenderList.js +178 -0
- package/src/renderers/common/RenderLists.js +31 -0
- package/src/renderers/common/RenderObject.js +328 -4
- package/src/renderers/common/RenderObjects.js +101 -7
- package/src/renderers/common/RenderPipeline.js +24 -0
- package/src/renderers/common/Renderer.js +1096 -31
- package/src/renderers/common/RendererUtils.js +193 -0
- package/src/renderers/common/SampledTexture.js +121 -0
- package/src/renderers/common/Sampler.js +30 -0
- package/src/renderers/common/StorageBuffer.js +24 -0
- package/src/renderers/common/StorageBufferAttribute.js +31 -2
- package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
- package/src/renderers/common/StorageTexture.js +38 -0
- package/src/renderers/common/Textures.js +83 -0
- package/src/renderers/common/Uniform.js +188 -2
- package/src/renderers/common/UniformBuffer.js +19 -0
- package/src/renderers/common/UniformsGroup.js +139 -2
- package/src/renderers/common/extras/PMREMGenerator.js +24 -3
- package/src/renderers/common/nodes/NodeBuilderState.js +95 -1
- package/src/renderers/common/nodes/NodeLibrary.js +89 -0
- package/src/renderers/common/nodes/NodeSampledTexture.js +91 -2
- package/src/renderers/common/nodes/NodeSampler.js +28 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
- package/src/renderers/common/nodes/NodeUniform.js +189 -0
- package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
- package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
- package/src/renderers/common/nodes/Nodes.js +327 -60
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +547 -29
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +0 -1
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +1 -1
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +1 -1
- package/src/renderers/webgpu/WebGPUBackend.js +480 -49
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +34 -0
- package/src/renderers/webgpu/WebGPURenderer.js +35 -0
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +59 -11
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
- package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +10 -8
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +9 -1
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +5 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +30 -0
- package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
- package/src/renderers/webxr/WebXRManager.js +7 -1
- package/src/textures/Data3DTexture.js +2 -2
- package/src/textures/Texture.js +4 -0
- package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
- package/examples/jsm/animation/MMDPhysics.js +0 -1408
- package/examples/jsm/exporters/MMDExporter.js +0 -223
- package/examples/jsm/libs/mmdparser.module.js +0 -11530
- package/examples/jsm/loaders/MMDLoader.js +0 -2298
- package/examples/jsm/shaders/MMDToonShader.js +0 -134
- package/src/nodes/core/UniformGroup.js +0 -13
- package/src/nodes/fog/FogExp2Node.js +0 -35
- package/src/nodes/fog/FogNode.js +0 -50
- package/src/nodes/fog/FogRangeNode.js +0 -36
- package/src/renderers/common/PostProcessingUtils.js +0 -86
|
@@ -3,8 +3,28 @@ import WebGLBackend from '../webgl-fallback/WebGLBackend.js';
|
|
|
3
3
|
import WebGPUBackend from './WebGPUBackend.js';
|
|
4
4
|
import BasicNodeLibrary from './nodes/BasicNodeLibrary.js';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* This alternative version of {@link WebGPURenderer} only supports node materials.
|
|
8
|
+
* So classes like `MeshBasicMaterial` are not compatible.
|
|
9
|
+
*
|
|
10
|
+
* @augments module:Renderer~Renderer
|
|
11
|
+
*/
|
|
6
12
|
class WebGPURenderer extends Renderer {
|
|
7
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Constructs a new WebGPU renderer.
|
|
16
|
+
*
|
|
17
|
+
* @param {Object} parameters - The configuration parameter.
|
|
18
|
+
* @param {Boolean} [parameters.logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
|
|
19
|
+
* @param {Boolean} [parameters.alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
|
|
20
|
+
* @param {Boolean} [parameters.depth=true] - Whether the default framebuffer should have a depth buffer or not.
|
|
21
|
+
* @param {Boolean} [parameters.stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
|
|
22
|
+
* @param {Boolean} [parameters.antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
|
|
23
|
+
* @param {Number} [parameters.samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0
|
|
24
|
+
* to overwrite the default.
|
|
25
|
+
* @param {Boolean} [parameters.forceWebGL=false] - If set to `true`, the renderer uses it
|
|
26
|
+
* WebGL 2 backend no matter if WebGPU is supported or not.
|
|
27
|
+
*/
|
|
8
28
|
constructor( parameters = {} ) {
|
|
9
29
|
|
|
10
30
|
let BackendClass;
|
|
@@ -31,8 +51,22 @@ class WebGPURenderer extends Renderer {
|
|
|
31
51
|
|
|
32
52
|
super( backend, parameters );
|
|
33
53
|
|
|
54
|
+
/**
|
|
55
|
+
* The generic default value is overwritten with the
|
|
56
|
+
* standard node library for type mapping. Material
|
|
57
|
+
* mapping is not supported with this version.
|
|
58
|
+
*
|
|
59
|
+
* @type {BasicNodeLibrary}
|
|
60
|
+
*/
|
|
34
61
|
this.library = new BasicNodeLibrary();
|
|
35
62
|
|
|
63
|
+
/**
|
|
64
|
+
* This flag can be used for type testing.
|
|
65
|
+
*
|
|
66
|
+
* @type {Boolean}
|
|
67
|
+
* @readonly
|
|
68
|
+
* @default true
|
|
69
|
+
*/
|
|
36
70
|
this.isWebGPURenderer = true;
|
|
37
71
|
|
|
38
72
|
}
|
|
@@ -16,8 +16,30 @@ const debugHandler = {
|
|
|
16
16
|
|
|
17
17
|
};
|
|
18
18
|
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* This renderer is the new alternative of `WebGLRenderer`. `WebGPURenderer` has the ability
|
|
22
|
+
* to target different backends. By default, the renderer tries to use a WebGPU backend if the
|
|
23
|
+
* browser supports WebGPU. If not, `WebGPURenderer` falls backs to a WebGL 2 backend.
|
|
24
|
+
*
|
|
25
|
+
* @augments module:Renderer~Renderer
|
|
26
|
+
*/
|
|
19
27
|
class WebGPURenderer extends Renderer {
|
|
20
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Constructs a new WebGPU renderer.
|
|
31
|
+
*
|
|
32
|
+
* @param {Object} parameters - The configuration parameter.
|
|
33
|
+
* @param {Boolean} [parameters.logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
|
|
34
|
+
* @param {Boolean} [parameters.alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
|
|
35
|
+
* @param {Boolean} [parameters.depth=true] - Whether the default framebuffer should have a depth buffer or not.
|
|
36
|
+
* @param {Boolean} [parameters.stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
|
|
37
|
+
* @param {Boolean} [parameters.antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
|
|
38
|
+
* @param {Number} [parameters.samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0
|
|
39
|
+
* to overwrite the default.
|
|
40
|
+
* @param {Boolean} [parameters.forceWebGL=false] - If set to `true`, the renderer uses it
|
|
41
|
+
* WebGL 2 backend no matter if WebGPU is supported or not.
|
|
42
|
+
*/
|
|
21
43
|
constructor( parameters = {} ) {
|
|
22
44
|
|
|
23
45
|
let BackendClass;
|
|
@@ -45,8 +67,21 @@ class WebGPURenderer extends Renderer {
|
|
|
45
67
|
//super( new Proxy( backend, debugHandler ) );
|
|
46
68
|
super( backend, parameters );
|
|
47
69
|
|
|
70
|
+
/**
|
|
71
|
+
* The generic default value is overwritten with the
|
|
72
|
+
* standard node library for type mapping.
|
|
73
|
+
*
|
|
74
|
+
* @type {StandardNodeLibrary}
|
|
75
|
+
*/
|
|
48
76
|
this.library = new StandardNodeLibrary();
|
|
49
77
|
|
|
78
|
+
/**
|
|
79
|
+
* This flag can be used for type testing.
|
|
80
|
+
*
|
|
81
|
+
* @type {Boolean}
|
|
82
|
+
* @readonly
|
|
83
|
+
* @default true
|
|
84
|
+
*/
|
|
50
85
|
this.isWebGPURenderer = true;
|
|
51
86
|
|
|
52
87
|
}
|
|
@@ -2,28 +2,40 @@ import NodeLibrary from '../../common/nodes/NodeLibrary.js';
|
|
|
2
2
|
|
|
3
3
|
// Lights
|
|
4
4
|
import { PointLight } from '../../../lights/PointLight.js';
|
|
5
|
-
import { PointLightNode } from '../../../nodes/Nodes.js';
|
|
6
5
|
import { DirectionalLight } from '../../../lights/DirectionalLight.js';
|
|
7
|
-
import { DirectionalLightNode } from '../../../nodes/Nodes.js';
|
|
8
6
|
import { RectAreaLight } from '../../../lights/RectAreaLight.js';
|
|
9
|
-
import { RectAreaLightNode } from '../../../nodes/Nodes.js';
|
|
10
7
|
import { SpotLight } from '../../../lights/SpotLight.js';
|
|
11
|
-
import { SpotLightNode } from '../../../nodes/Nodes.js';
|
|
12
8
|
import { AmbientLight } from '../../../lights/AmbientLight.js';
|
|
13
|
-
import { AmbientLightNode } from '../../../nodes/Nodes.js';
|
|
14
9
|
import { HemisphereLight } from '../../../lights/HemisphereLight.js';
|
|
15
|
-
import { HemisphereLightNode } from '../../../nodes/Nodes.js';
|
|
16
10
|
import { LightProbe } from '../../../lights/LightProbe.js';
|
|
17
|
-
import { LightProbeNode } from '../../../nodes/Nodes.js';
|
|
18
11
|
import IESSpotLight from '../../../lights/webgpu/IESSpotLight.js';
|
|
19
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
PointLightNode,
|
|
14
|
+
DirectionalLightNode,
|
|
15
|
+
RectAreaLightNode,
|
|
16
|
+
SpotLightNode,
|
|
17
|
+
AmbientLightNode,
|
|
18
|
+
HemisphereLightNode,
|
|
19
|
+
LightProbeNode,
|
|
20
|
+
IESSpotLightNode
|
|
21
|
+
} from '../../../nodes/Nodes.js';
|
|
20
22
|
|
|
21
23
|
// Tone Mapping
|
|
22
24
|
import { LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping, NeutralToneMapping } from '../../../constants.js';
|
|
23
25
|
import { linearToneMapping, reinhardToneMapping, cineonToneMapping, acesFilmicToneMapping, agxToneMapping, neutralToneMapping } from '../../../nodes/display/ToneMappingFunctions.js';
|
|
24
26
|
|
|
27
|
+
/**
|
|
28
|
+
* This version of a node library represents a basic version
|
|
29
|
+
* just focusing on lights and tone mapping techniques.
|
|
30
|
+
*
|
|
31
|
+
* @private
|
|
32
|
+
* @augments NodeLibrary
|
|
33
|
+
*/
|
|
25
34
|
class BasicNodeLibrary extends NodeLibrary {
|
|
26
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Constructs a new basic node library.
|
|
38
|
+
*/
|
|
27
39
|
constructor() {
|
|
28
40
|
|
|
29
41
|
super();
|
|
@@ -21,28 +21,41 @@ import ShadowNodeMaterial from '../../../materials/nodes/ShadowNodeMaterial.js';
|
|
|
21
21
|
|
|
22
22
|
// Lights
|
|
23
23
|
import { PointLight } from '../../../lights/PointLight.js';
|
|
24
|
-
import { PointLightNode } from '../../../nodes/Nodes.js';
|
|
25
24
|
import { DirectionalLight } from '../../../lights/DirectionalLight.js';
|
|
26
|
-
import { DirectionalLightNode } from '../../../nodes/Nodes.js';
|
|
27
25
|
import { RectAreaLight } from '../../../lights/RectAreaLight.js';
|
|
28
|
-
import { RectAreaLightNode } from '../../../nodes/Nodes.js';
|
|
29
26
|
import { SpotLight } from '../../../lights/SpotLight.js';
|
|
30
|
-
import { SpotLightNode } from '../../../nodes/Nodes.js';
|
|
31
27
|
import { AmbientLight } from '../../../lights/AmbientLight.js';
|
|
32
|
-
import { AmbientLightNode } from '../../../nodes/Nodes.js';
|
|
33
28
|
import { HemisphereLight } from '../../../lights/HemisphereLight.js';
|
|
34
|
-
import { HemisphereLightNode } from '../../../nodes/Nodes.js';
|
|
35
29
|
import { LightProbe } from '../../../lights/LightProbe.js';
|
|
36
|
-
import { LightProbeNode } from '../../../nodes/Nodes.js';
|
|
37
30
|
import IESSpotLight from '../../../lights/webgpu/IESSpotLight.js';
|
|
38
|
-
import {
|
|
31
|
+
import {
|
|
32
|
+
PointLightNode,
|
|
33
|
+
DirectionalLightNode,
|
|
34
|
+
RectAreaLightNode,
|
|
35
|
+
SpotLightNode,
|
|
36
|
+
AmbientLightNode,
|
|
37
|
+
HemisphereLightNode,
|
|
38
|
+
LightProbeNode,
|
|
39
|
+
IESSpotLightNode
|
|
40
|
+
} from '../../../nodes/Nodes.js';
|
|
39
41
|
|
|
40
42
|
// Tone Mapping
|
|
41
43
|
import { LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping, NeutralToneMapping } from '../../../constants.js';
|
|
42
44
|
import { linearToneMapping, reinhardToneMapping, cineonToneMapping, acesFilmicToneMapping, agxToneMapping, neutralToneMapping } from '../../../nodes/display/ToneMappingFunctions.js';
|
|
43
45
|
|
|
46
|
+
/**
|
|
47
|
+
* This version of a node library represents the standard version
|
|
48
|
+
* used in {@link WebGPURenderer}. It maps lights, tone mapping
|
|
49
|
+
* techniques and materials to node-based implementations.
|
|
50
|
+
*
|
|
51
|
+
* @private
|
|
52
|
+
* @augments NodeLibrary
|
|
53
|
+
*/
|
|
44
54
|
class StandardNodeLibrary extends NodeLibrary {
|
|
45
55
|
|
|
56
|
+
/**
|
|
57
|
+
* Constructs a new standard node library.
|
|
58
|
+
*/
|
|
46
59
|
constructor() {
|
|
47
60
|
|
|
48
61
|
super();
|
|
@@ -223,7 +223,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
223
223
|
|
|
224
224
|
_generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) {
|
|
225
225
|
|
|
226
|
-
if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false ) {
|
|
226
|
+
if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false ) {
|
|
227
227
|
|
|
228
228
|
return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;
|
|
229
229
|
|
|
@@ -241,7 +241,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
241
241
|
|
|
242
242
|
generateWrapFunction( texture ) {
|
|
243
243
|
|
|
244
|
-
const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }T`;
|
|
244
|
+
const functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${texture.isData3DTexture ? '3d' : '2d'}T`;
|
|
245
245
|
|
|
246
246
|
let nodeCode = wgslCodeCache[ functionName ];
|
|
247
247
|
|
|
@@ -249,7 +249,9 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
249
249
|
|
|
250
250
|
const includes = [];
|
|
251
251
|
|
|
252
|
-
|
|
252
|
+
// For 3D textures, use vec3f; for texture arrays, keep vec2f since array index is separate
|
|
253
|
+
const coordType = texture.isData3DTexture ? 'vec3f' : 'vec2f';
|
|
254
|
+
let code = `fn ${functionName}( coord : ${coordType} ) -> ${coordType} {\n\n\treturn ${coordType}(\n`;
|
|
253
255
|
|
|
254
256
|
const addWrapSnippet = ( wrap, axis ) => {
|
|
255
257
|
|
|
@@ -287,6 +289,13 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
287
289
|
|
|
288
290
|
addWrapSnippet( texture.wrapT, 'y' );
|
|
289
291
|
|
|
292
|
+
if ( texture.isData3DTexture ) {
|
|
293
|
+
|
|
294
|
+
code += ',\n';
|
|
295
|
+
addWrapSnippet( texture.wrapR, 'z' );
|
|
296
|
+
|
|
297
|
+
}
|
|
298
|
+
|
|
290
299
|
code += '\n\t);\n\n}\n';
|
|
291
300
|
|
|
292
301
|
wgslCodeCache[ functionName ] = nodeCode = new CodeNode( code, includes );
|
|
@@ -310,21 +319,57 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
310
319
|
if ( textureData.dimensionsSnippet[ levelSnippet ] === undefined ) {
|
|
311
320
|
|
|
312
321
|
let textureDimensionsParams;
|
|
322
|
+
let dimensionType;
|
|
323
|
+
|
|
324
|
+
const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
|
|
325
|
+
const isMultisampled = primarySamples > 1;
|
|
326
|
+
|
|
327
|
+
if ( texture.isData3DTexture ) {
|
|
313
328
|
|
|
314
|
-
|
|
329
|
+
dimensionType = 'vec3<u32>';
|
|
330
|
+
|
|
331
|
+
} else {
|
|
332
|
+
|
|
333
|
+
// Regular 2D textures, depth textures, etc.
|
|
334
|
+
dimensionType = 'vec2<u32>';
|
|
335
|
+
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Build parameters string based on texture type and multisampling
|
|
339
|
+
if ( isMultisampled || texture.isVideoTexture || texture.isStorageTexture ) {
|
|
315
340
|
|
|
316
341
|
textureDimensionsParams = textureProperty;
|
|
317
342
|
|
|
318
343
|
} else {
|
|
319
344
|
|
|
320
|
-
textureDimensionsParams = `${
|
|
345
|
+
textureDimensionsParams = `${textureProperty}${levelSnippet ? `, u32( ${ levelSnippet } )` : ''}`;
|
|
321
346
|
|
|
322
347
|
}
|
|
323
348
|
|
|
324
|
-
textureDimensionNode = new VarNode( new ExpressionNode( `textureDimensions( ${ textureDimensionsParams } )`,
|
|
349
|
+
textureDimensionNode = new VarNode( new ExpressionNode( `textureDimensions( ${ textureDimensionsParams } )`, dimensionType ) );
|
|
325
350
|
|
|
326
351
|
textureData.dimensionsSnippet[ levelSnippet ] = textureDimensionNode;
|
|
327
352
|
|
|
353
|
+
if ( texture.isDataArrayTexture || texture.isData3DTexture ) {
|
|
354
|
+
|
|
355
|
+
textureData.arrayLayerCount = new VarNode(
|
|
356
|
+
new ExpressionNode(
|
|
357
|
+
`textureNumLayers(${textureProperty})`,
|
|
358
|
+
'u32'
|
|
359
|
+
)
|
|
360
|
+
);
|
|
361
|
+
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// For cube textures, we know it's always 6 faces
|
|
365
|
+
if ( texture.isTextureCube ) {
|
|
366
|
+
|
|
367
|
+
textureData.cubeFaceCount = new VarNode(
|
|
368
|
+
new ExpressionNode( '6u', 'u32' )
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
|
|
328
373
|
}
|
|
329
374
|
|
|
330
375
|
return textureDimensionNode.build( this );
|
|
@@ -347,7 +392,8 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
347
392
|
const wrapFunction = this.generateWrapFunction( texture );
|
|
348
393
|
const textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );
|
|
349
394
|
|
|
350
|
-
const
|
|
395
|
+
const vecType = texture.isData3DTexture ? 'vec3' : 'vec2';
|
|
396
|
+
const coordSnippet = `${vecType}<u32>(${wrapFunction}(${uvSnippet}) * ${vecType}<f32>(${textureDimension}))`;
|
|
351
397
|
|
|
352
398
|
return this.generateTextureLoad( texture, textureProperty, coordSnippet, depthSnippet, levelSnippet );
|
|
353
399
|
|
|
@@ -388,7 +434,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
388
434
|
return this.getComponentTypeFromTexture( texture ) !== 'float' ||
|
|
389
435
|
( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) ||
|
|
390
436
|
( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||
|
|
391
|
-
texture.
|
|
437
|
+
this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1;
|
|
392
438
|
|
|
393
439
|
}
|
|
394
440
|
|
|
@@ -590,7 +636,7 @@ class WGSLNodeBuilder extends NodeBuilder {
|
|
|
590
636
|
texture.store = node.isStorageTextureNode === true;
|
|
591
637
|
texture.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
592
638
|
|
|
593
|
-
if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) {
|
|
639
|
+
if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( node.value ) === false && texture.store === false ) {
|
|
594
640
|
|
|
595
641
|
const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node, group );
|
|
596
642
|
sampler.setVisibility( gpuShaderStageLib[ shaderStage ] );
|
|
@@ -1102,7 +1148,7 @@ ${ flowData.code }
|
|
|
1102
1148
|
|
|
1103
1149
|
const texture = uniform.node.value;
|
|
1104
1150
|
|
|
1105
|
-
if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {
|
|
1151
|
+
if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {
|
|
1106
1152
|
|
|
1107
1153
|
if ( this.isSampleCompare( texture ) ) {
|
|
1108
1154
|
|
|
@@ -1120,7 +1166,9 @@ ${ flowData.code }
|
|
|
1120
1166
|
|
|
1121
1167
|
let multisampled = '';
|
|
1122
1168
|
|
|
1123
|
-
|
|
1169
|
+
const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );
|
|
1170
|
+
|
|
1171
|
+
if ( primarySamples > 1 ) {
|
|
1124
1172
|
|
|
1125
1173
|
multisampled = '_multisampled';
|
|
1126
1174
|
|
|
@@ -58,6 +58,7 @@ const wgslTypeLib = {
|
|
|
58
58
|
'texture_multisampled_2d': 'cubeTexture',
|
|
59
59
|
|
|
60
60
|
'texture_depth_2d': 'depthTexture',
|
|
61
|
+
'texture_depth_multisampled_2d': 'depthTexture',
|
|
61
62
|
|
|
62
63
|
'texture_3d': 'texture3D',
|
|
63
64
|
|
|
@@ -140,8 +141,18 @@ const parse = ( source ) => {
|
|
|
140
141
|
|
|
141
142
|
};
|
|
142
143
|
|
|
144
|
+
/**
|
|
145
|
+
* This class represents a WSL node function.
|
|
146
|
+
*
|
|
147
|
+
* @augments NodeFunction
|
|
148
|
+
*/
|
|
143
149
|
class WGSLNodeFunction extends NodeFunction {
|
|
144
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Constructs a new WGSL node function.
|
|
153
|
+
*
|
|
154
|
+
* @param {String} source - The WGSL source.
|
|
155
|
+
*/
|
|
145
156
|
constructor( source ) {
|
|
146
157
|
|
|
147
158
|
const { type, inputs, name, inputsCode, blockCode, outputType } = parse( source );
|
|
@@ -154,6 +165,12 @@ class WGSLNodeFunction extends NodeFunction {
|
|
|
154
165
|
|
|
155
166
|
}
|
|
156
167
|
|
|
168
|
+
/**
|
|
169
|
+
* This method returns the WGSL code of the node function.
|
|
170
|
+
*
|
|
171
|
+
* @param {String} [name=this.name] - The function's name.
|
|
172
|
+
* @return {String} The shader code.
|
|
173
|
+
*/
|
|
157
174
|
getCode( name = this.name ) {
|
|
158
175
|
|
|
159
176
|
const outputType = this.outputType !== 'void' ? '-> ' + this.outputType : '';
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import NodeParser from '../../../nodes/core/NodeParser.js';
|
|
2
2
|
import WGSLNodeFunction from './WGSLNodeFunction.js';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* A WGSL node parser.
|
|
6
|
+
*
|
|
7
|
+
* @augments NodeParser
|
|
8
|
+
*/
|
|
4
9
|
class WGSLNodeParser extends NodeParser {
|
|
5
10
|
|
|
11
|
+
/**
|
|
12
|
+
* The method parses the given WGSL code an returns a node function.
|
|
13
|
+
*
|
|
14
|
+
* @param {String} source - The WGSL code.
|
|
15
|
+
* @return {WGSLNodeFunction} A node function.
|
|
16
|
+
*/
|
|
6
17
|
parseFunction( source ) {
|
|
7
18
|
|
|
8
19
|
return new WGSLNodeFunction( source );
|
|
@@ -227,18 +227,18 @@ class WebGPUAttributeUtils {
|
|
|
227
227
|
const device = backend.device;
|
|
228
228
|
|
|
229
229
|
const data = backend.get( this._getBufferAttribute( attribute ) );
|
|
230
|
-
|
|
231
230
|
const bufferGPU = data.buffer;
|
|
232
231
|
const size = bufferGPU.size;
|
|
233
232
|
|
|
234
233
|
const readBufferGPU = device.createBuffer( {
|
|
235
|
-
label: attribute.name
|
|
234
|
+
label: `${ attribute.name }_readback`,
|
|
236
235
|
size,
|
|
237
236
|
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
|
|
238
237
|
} );
|
|
239
238
|
|
|
240
|
-
|
|
241
|
-
|
|
239
|
+
const cmdEncoder = device.createCommandEncoder( {
|
|
240
|
+
label: `readback_encoder_${ attribute.name }`
|
|
241
|
+
} );
|
|
242
242
|
|
|
243
243
|
cmdEncoder.copyBufferToBuffer(
|
|
244
244
|
bufferGPU,
|
|
@@ -248,8 +248,6 @@ class WebGPUAttributeUtils {
|
|
|
248
248
|
size
|
|
249
249
|
);
|
|
250
250
|
|
|
251
|
-
readBufferGPU.unmap();
|
|
252
|
-
|
|
253
251
|
const gpuCommands = cmdEncoder.finish();
|
|
254
252
|
device.queue.submit( [ gpuCommands ] );
|
|
255
253
|
|
|
@@ -257,7 +255,11 @@ class WebGPUAttributeUtils {
|
|
|
257
255
|
|
|
258
256
|
const arrayBuffer = readBufferGPU.getMappedRange();
|
|
259
257
|
|
|
260
|
-
|
|
258
|
+
const dstBuffer = new attribute.array.constructor( arrayBuffer.slice( 0 ) );
|
|
259
|
+
|
|
260
|
+
readBufferGPU.unmap();
|
|
261
|
+
|
|
262
|
+
return dstBuffer.buffer;
|
|
261
263
|
|
|
262
264
|
}
|
|
263
265
|
|
|
@@ -269,7 +271,7 @@ class WebGPUAttributeUtils {
|
|
|
269
271
|
|
|
270
272
|
let format;
|
|
271
273
|
|
|
272
|
-
if ( itemSize
|
|
274
|
+
if ( itemSize === 1 ) {
|
|
273
275
|
|
|
274
276
|
format = typeArraysToVertexFormatPrefixForItemSize1.get( ArrayType );
|
|
275
277
|
|
|
@@ -107,10 +107,18 @@ class WebGPUBindingUtils {
|
|
|
107
107
|
|
|
108
108
|
const texture = {}; // GPUTextureBindingLayout
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
const { primarySamples } = backend.utils.getTextureSampleData( binding.texture );
|
|
111
|
+
|
|
112
|
+
if ( primarySamples > 1 ) {
|
|
111
113
|
|
|
112
114
|
texture.multisampled = true;
|
|
113
115
|
|
|
116
|
+
if ( ! binding.texture.isDepthTexture ) {
|
|
117
|
+
|
|
118
|
+
texture.sampleType = GPUTextureSampleType.UnfilterableFloat;
|
|
119
|
+
|
|
120
|
+
}
|
|
121
|
+
|
|
114
122
|
}
|
|
115
123
|
|
|
116
124
|
if ( binding.texture.isDepthTexture ) {
|
|
@@ -146,11 +146,7 @@ class WebGPUTextureUtils {
|
|
|
146
146
|
|
|
147
147
|
textureData.format = format;
|
|
148
148
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
sampleCount = backend.utils.getSampleCount( sampleCount );
|
|
152
|
-
|
|
153
|
-
const primarySampleCount = texture.isRenderTargetTexture && ! texture.isMultisampleRenderTargetTexture ? 1 : sampleCount;
|
|
149
|
+
const { samples, primarySamples, isMSAA } = backend.utils.getTextureSampleData( texture );
|
|
154
150
|
|
|
155
151
|
let usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC;
|
|
156
152
|
|
|
@@ -174,7 +170,7 @@ class WebGPUTextureUtils {
|
|
|
174
170
|
depthOrArrayLayers: depth,
|
|
175
171
|
},
|
|
176
172
|
mipLevelCount: levels,
|
|
177
|
-
sampleCount:
|
|
173
|
+
sampleCount: primarySamples,
|
|
178
174
|
dimension: dimension,
|
|
179
175
|
format: format,
|
|
180
176
|
usage: usage
|
|
@@ -208,12 +204,12 @@ class WebGPUTextureUtils {
|
|
|
208
204
|
|
|
209
205
|
}
|
|
210
206
|
|
|
211
|
-
if (
|
|
207
|
+
if ( isMSAA ) {
|
|
212
208
|
|
|
213
209
|
const msaaTextureDescriptorGPU = Object.assign( {}, textureDescriptorGPU );
|
|
214
210
|
|
|
215
211
|
msaaTextureDescriptorGPU.label = msaaTextureDescriptorGPU.label + '-msaa';
|
|
216
|
-
msaaTextureDescriptorGPU.sampleCount =
|
|
212
|
+
msaaTextureDescriptorGPU.sampleCount = samples;
|
|
217
213
|
|
|
218
214
|
textureData.msaaTexture = backend.device.createTexture( msaaTextureDescriptorGPU );
|
|
219
215
|
|
|
@@ -336,7 +332,7 @@ class WebGPUTextureUtils {
|
|
|
336
332
|
depthTexture.image.width = width;
|
|
337
333
|
depthTexture.image.height = height;
|
|
338
334
|
|
|
339
|
-
this.createTexture( depthTexture, {
|
|
335
|
+
this.createTexture( depthTexture, { width, height } );
|
|
340
336
|
|
|
341
337
|
return backend.get( depthTexture ).texture;
|
|
342
338
|
|
|
@@ -36,6 +36,36 @@ class WebGPUUtils {
|
|
|
36
36
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
getTextureSampleData( texture ) {
|
|
40
|
+
|
|
41
|
+
let samples;
|
|
42
|
+
|
|
43
|
+
if ( texture.isFramebufferTexture ) {
|
|
44
|
+
|
|
45
|
+
samples = 1;
|
|
46
|
+
|
|
47
|
+
} else if ( texture.isDepthTexture && ! texture.renderTarget ) {
|
|
48
|
+
|
|
49
|
+
const renderer = this.backend.renderer;
|
|
50
|
+
const renderTarget = renderer.getRenderTarget();
|
|
51
|
+
|
|
52
|
+
samples = renderTarget ? renderTarget.samples : renderer.samples;
|
|
53
|
+
|
|
54
|
+
} else if ( texture.renderTarget ) {
|
|
55
|
+
|
|
56
|
+
samples = texture.renderTarget.samples;
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
samples = samples || 1;
|
|
61
|
+
|
|
62
|
+
const isMSAA = samples > 1 && texture.renderTarget !== null && ( texture.isDepthTexture !== true && texture.isFramebufferTexture !== true );
|
|
63
|
+
const primarySamples = isMSAA ? 1 : samples;
|
|
64
|
+
|
|
65
|
+
return { samples, primarySamples, isMSAA };
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
39
69
|
getCurrentColorFormat( renderContext ) {
|
|
40
70
|
|
|
41
71
|
let format;
|
|
@@ -52,7 +52,7 @@ class WebXRDepthSensing {
|
|
|
52
52
|
const texProps = renderer.properties.get( texture );
|
|
53
53
|
texProps.__webglTexture = depthData.texture;
|
|
54
54
|
|
|
55
|
-
if ( ( depthData.depthNear
|
|
55
|
+
if ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {
|
|
56
56
|
|
|
57
57
|
this.depthNear = depthData.depthNear;
|
|
58
58
|
this.depthFar = depthData.depthFar;
|
|
@@ -286,7 +286,9 @@ class WebXRManager extends EventDispatcher {
|
|
|
286
286
|
currentPixelRatio = renderer.getPixelRatio();
|
|
287
287
|
renderer.getSize( currentSize );
|
|
288
288
|
|
|
289
|
-
|
|
289
|
+
const useLayers = session.enabledFeatures !== undefined && session.enabledFeatures.includes( 'layers' );
|
|
290
|
+
|
|
291
|
+
if ( ! useLayers ) {
|
|
290
292
|
|
|
291
293
|
const layerInit = {
|
|
292
294
|
antialias: attributes.antialias,
|
|
@@ -511,6 +513,10 @@ class WebXRManager extends EventDispatcher {
|
|
|
511
513
|
* the cameras' projection and world matrices have already been set.
|
|
512
514
|
* And that near and far planes are identical for both cameras.
|
|
513
515
|
* Visualization of this technique: https://computergraphics.stackexchange.com/a/4765
|
|
516
|
+
*
|
|
517
|
+
* @param {ArrayCamera} camera - The camera to update.
|
|
518
|
+
* @param {PerspectiveCamera} cameraL - The left camera.
|
|
519
|
+
* @param {PerspectiveCamera} cameraR - The right camera.
|
|
514
520
|
*/
|
|
515
521
|
function setProjectionFromUnion( camera, cameraL, cameraR ) {
|
|
516
522
|
|
|
@@ -6,9 +6,9 @@ class Data3DTexture extends Texture {
|
|
|
6
6
|
constructor( data = null, width = 1, height = 1, depth = 1 ) {
|
|
7
7
|
|
|
8
8
|
// We're going to add .setXXX() methods for setting properties later.
|
|
9
|
-
// Users can still set in
|
|
9
|
+
// Users can still set in Data3DTexture directly.
|
|
10
10
|
//
|
|
11
|
-
// const texture = new THREE.
|
|
11
|
+
// const texture = new THREE.Data3DTexture( data, width, height, depth );
|
|
12
12
|
// texture.anisotropy = 16;
|
|
13
13
|
//
|
|
14
14
|
// See #14839
|
package/src/textures/Texture.js
CHANGED
|
@@ -69,6 +69,7 @@ class Texture extends EventDispatcher {
|
|
|
69
69
|
this.version = 0;
|
|
70
70
|
this.onUpdate = null;
|
|
71
71
|
|
|
72
|
+
this.renderTarget = null; // assign texture to a render target
|
|
72
73
|
this.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not
|
|
73
74
|
this.pmremVersion = 0; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)
|
|
74
75
|
|
|
@@ -134,6 +135,9 @@ class Texture extends EventDispatcher {
|
|
|
134
135
|
this.unpackAlignment = source.unpackAlignment;
|
|
135
136
|
this.colorSpace = source.colorSpace;
|
|
136
137
|
|
|
138
|
+
this.renderTarget = source.renderTarget;
|
|
139
|
+
this.isRenderTargetTexture = source.isRenderTargetTexture;
|
|
140
|
+
|
|
137
141
|
this.userData = JSON.parse( JSON.stringify( source.userData ) );
|
|
138
142
|
|
|
139
143
|
this.needsUpdate = true;
|