@plastic-software/three 0.181.3 → 0.183.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 +11330 -10017
- package/build/three.core.js +10011 -9493
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1414 -631
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +21 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +8007 -5427
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +8005 -5426
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +0 -3
- package/examples/jsm/animation/CCDIKSolver.js +2 -2
- package/examples/jsm/controls/ArcballControls.js +3 -3
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +109 -6
- package/examples/jsm/controls/TrackballControls.js +6 -6
- package/examples/jsm/csm/CSM.js +2 -1
- 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 +131 -4
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -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/Inspector.js +74 -14
- package/examples/jsm/inspector/RendererInspector.js +12 -2
- package/examples/jsm/inspector/tabs/Console.js +41 -7
- package/examples/jsm/inspector/tabs/Parameters.js +18 -2
- package/examples/jsm/inspector/tabs/Performance.js +2 -2
- package/examples/jsm/inspector/tabs/Viewer.js +4 -4
- package/examples/jsm/inspector/ui/Profiler.js +1836 -31
- package/examples/jsm/inspector/ui/Style.js +973 -14
- package/examples/jsm/inspector/ui/Tab.js +188 -1
- package/examples/jsm/inspector/ui/Values.js +17 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
- package/examples/jsm/lines/LineMaterial.js +6 -0
- 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 +5 -5
- package/examples/jsm/loaders/FBXLoader.js +2 -4
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +122 -171
- package/examples/jsm/loaders/HDRLoader.js +0 -1
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +19 -3
- package/examples/jsm/loaders/LDrawLoader.js +2 -3
- 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 +1 -1
- 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 +37 -24
- package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
- package/examples/jsm/loaders/usd/USDAParser.js +447 -366
- package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4041 -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/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Sky.js +76 -4
- package/examples/jsm/objects/SkyMesh.js +127 -10
- 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 +268 -30
- package/examples/jsm/renderers/SVGRenderer.js +193 -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 +61 -4
- 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/display/AfterImageNode.js +1 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- 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/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +5 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
- package/examples/jsm/tsl/display/GodraysNode.js +624 -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 +3 -3
- 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 -20
- 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/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/TRAANode.js +273 -125
- 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/math/Bayer.js +40 -1
- 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/WebGPUTextureUtils.js +1 -1
- package/package.json +20 -26
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +19 -11
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +3 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +1 -1
- 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/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/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +56 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +3 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- 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/Cache.js +28 -0
- package/src/loaders/FileLoader.js +1 -1
- package/src/loaders/ImageBitmapLoader.js +8 -3
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +2 -1
- package/src/loaders/ObjectLoader.js +21 -2
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +7 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +72 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
- package/src/math/Line3.js +3 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix4.js +74 -65
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Vector3.js +3 -5
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +87 -68
- package/src/nodes/TSL.js +6 -6
- 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 +98 -12
- 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 +20 -1
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- 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/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
- package/src/nodes/accessors/ReferenceNode.js +4 -4
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +53 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +4 -21
- package/src/nodes/accessors/StorageTextureNode.js +37 -1
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +58 -22
- package/src/nodes/accessors/UniformArrayNode.js +4 -2
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionNode.js +1 -2
- package/src/nodes/core/ArrayNode.js +20 -1
- package/src/nodes/core/AssignNode.js +2 -2
- package/src/nodes/core/AttributeNode.js +2 -2
- package/src/nodes/core/ContextNode.js +103 -4
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +29 -3
- package/src/nodes/core/NodeBuilder.js +170 -53
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +10 -8
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +3 -3
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +65 -16
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +16 -2
- package/src/nodes/core/StructTypeNode.js +11 -17
- package/src/nodes/core/SubBuildNode.js +1 -1
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +47 -22
- package/src/nodes/core/VaryingNode.js +1 -18
- 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 +98 -9
- package/src/nodes/display/RenderOutputNode.js +3 -3
- package/src/nodes/display/ScreenNode.js +3 -1
- 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/ViewportTextureNode.js +21 -4
- 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 +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +4 -2
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
- package/src/nodes/gpgpu/ComputeNode.js +5 -4
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
- 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 +2 -2
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +97 -41
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +2 -2
- package/src/nodes/math/MathNode.js +3 -40
- package/src/nodes/math/OperatorNode.js +2 -1
- 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/TSLCore.js +17 -14
- package/src/nodes/utils/ArrayElementNode.js +13 -0
- package/src/nodes/utils/DebugNode.js +11 -11
- package/src/nodes/utils/EventNode.js +1 -2
- package/src/nodes/utils/JoinNode.js +2 -2
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +1 -1
- 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/SampleNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +27 -14
- package/src/objects/InstancedMesh.js +11 -0
- 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/renderers/WebGLRenderer.js +178 -92
- package/src/renderers/common/Backend.js +29 -0
- package/src/renderers/common/Background.js +24 -11
- package/src/renderers/common/BindGroup.js +1 -9
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +27 -12
- 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/CubeRenderTarget.js +50 -6
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +4 -4
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/RenderBundles.js +2 -1
- 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 +15 -3
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +18 -2
- package/src/renderers/common/RenderPipeline.js +203 -17
- package/src/renderers/common/Renderer.js +257 -72
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +17 -1
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +61 -0
- package/src/renderers/common/XRManager.js +3 -2
- package/src/renderers/common/extras/PMREMGenerator.js +2 -8
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
- 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_fragment.glsl.js +7 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- 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 +3 -3
- 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 -5
- package/src/renderers/shaders/UniformsLib.js +0 -3
- package/src/renderers/webgl/WebGLBackground.js +2 -2
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLCapabilities.js +3 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +12 -0
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +267 -0
- package/src/renderers/webgl/WebGLProgram.js +45 -109
- package/src/renderers/webgl/WebGLPrograms.js +45 -49
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +32 -37
- package/src/renderers/webgl/WebGLTextures.js +89 -28
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
- package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +119 -13
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -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 +65 -42
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/Source.js +1 -1
- package/src/textures/Texture.js +3 -3
- package/src/utils.js +258 -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/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
|
|
2
|
-
import { float, vec2, vec3, int, Fn
|
|
2
|
+
import { float, vec2, vec3, int, Fn } from '../tsl/TSLBase.js';
|
|
3
3
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
4
4
|
import { texture, textureLoad } from '../accessors/TextureNode.js';
|
|
5
|
+
import { cubeTexture } from '../accessors/CubeTextureNode.js';
|
|
5
6
|
import { normalWorld } from '../accessors/Normal.js';
|
|
6
7
|
import { mix, sqrt } from '../math/MathNode.js';
|
|
7
8
|
import { add } from '../math/OperatorNode.js';
|
|
@@ -10,15 +11,14 @@ import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
|
|
|
10
11
|
import QuadMesh from '../../renderers/common/QuadMesh.js';
|
|
11
12
|
import { Loop } from '../utils/LoopNode.js';
|
|
12
13
|
import { screenCoordinate } from '../display/ScreenNode.js';
|
|
13
|
-
import { HalfFloatType,
|
|
14
|
+
import { Compatibility, GreaterEqualCompare, HalfFloatType, LessEqualCompare, LinearFilter, NearestFilter, PCFShadowMap, PCFSoftShadowMap, RGFormat, VSMShadowMap } from '../../constants.js';
|
|
14
15
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
15
16
|
import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
|
|
16
17
|
import { lightShadowMatrix } from '../accessors/Lights.js';
|
|
17
18
|
import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../renderers/common/RendererUtils.js';
|
|
18
19
|
import { getDataFromObject } from '../core/NodeUtils.js';
|
|
19
|
-
import { getShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
|
|
20
|
+
import { getShadowMaterial, disposeShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
|
|
20
21
|
import ChainMap from '../../renderers/common/ChainMap.js';
|
|
21
|
-
import { warn } from '../../utils.js';
|
|
22
22
|
import { textureSize } from '../accessors/TextureSizeNode.js';
|
|
23
23
|
import { uv } from '../accessors/UV.js';
|
|
24
24
|
|
|
@@ -36,16 +36,7 @@ const _shadowRenderObjectKeys = [];
|
|
|
36
36
|
* @param {LightShadow} shadow - The light shadow object containing shadow properties.
|
|
37
37
|
* @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).
|
|
38
38
|
* @param {boolean} useVelocity - Whether to use velocity data for rendering.
|
|
39
|
-
* @return {
|
|
40
|
-
*
|
|
41
|
-
* The returned function has the following parameters:
|
|
42
|
-
* @param {Object3D} object - The 3D object to render.
|
|
43
|
-
* @param {Scene} scene - The scene containing the object.
|
|
44
|
-
* @param {Camera} _camera - The camera used for rendering.
|
|
45
|
-
* @param {BufferGeometry} geometry - The geometry of the object.
|
|
46
|
-
* @param {Material} material - The material of the object.
|
|
47
|
-
* @param {Group} group - The group the object belongs to.
|
|
48
|
-
* @param {...any} params - Additional parameters for rendering.
|
|
39
|
+
* @return {shadowRenderObjectFunction} A function that renders shadow objects.
|
|
49
40
|
*/
|
|
50
41
|
export const getShadowRenderObjectFunction = ( renderer, shadow, shadowType, useVelocity ) => {
|
|
51
42
|
|
|
@@ -93,6 +84,7 @@ export const getShadowRenderObjectFunction = ( renderer, shadow, shadowType, use
|
|
|
93
84
|
/**
|
|
94
85
|
* Represents the shader code for the first VSM render pass.
|
|
95
86
|
*
|
|
87
|
+
* @private
|
|
96
88
|
* @method
|
|
97
89
|
* @param {Object} inputs - The input parameter object.
|
|
98
90
|
* @param {Node<float>} inputs.samples - The number of samples
|
|
@@ -131,7 +123,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass,
|
|
|
131
123
|
mean.divAssign( samples );
|
|
132
124
|
squaredMean.divAssign( samples );
|
|
133
125
|
|
|
134
|
-
const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ) );
|
|
126
|
+
const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ).max( 0 ) );
|
|
135
127
|
return vec2( mean, std_dev );
|
|
136
128
|
|
|
137
129
|
} );
|
|
@@ -139,6 +131,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass,
|
|
|
139
131
|
/**
|
|
140
132
|
* Represents the shader code for the second VSM render pass.
|
|
141
133
|
*
|
|
134
|
+
* @private
|
|
142
135
|
* @method
|
|
143
136
|
* @param {Object} inputs - The input parameter object.
|
|
144
137
|
* @param {Node<float>} inputs.samples - The number of samples
|
|
@@ -175,7 +168,7 @@ const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPas
|
|
|
175
168
|
mean.divAssign( samples );
|
|
176
169
|
squaredMean.divAssign( samples );
|
|
177
170
|
|
|
178
|
-
const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ) );
|
|
171
|
+
const std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ).max( 0 ) );
|
|
179
172
|
return vec2( mean, std_dev );
|
|
180
173
|
|
|
181
174
|
} );
|
|
@@ -348,7 +341,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
348
341
|
const { shadow } = this;
|
|
349
342
|
const { renderer } = builder;
|
|
350
343
|
|
|
351
|
-
const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
|
|
344
|
+
const bias = shadow.biasNode || reference( 'bias', 'float', shadow ).setGroup( renderGroup );
|
|
352
345
|
|
|
353
346
|
let shadowCoord = shadowPosition;
|
|
354
347
|
let coordZ;
|
|
@@ -359,12 +352,6 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
359
352
|
|
|
360
353
|
coordZ = shadowCoord.z;
|
|
361
354
|
|
|
362
|
-
if ( renderer.coordinateSystem === WebGPUCoordinateSystem ) {
|
|
363
|
-
|
|
364
|
-
coordZ = coordZ.mul( 2 ).sub( 1 ); // WebGPU: Conversion [ 0, 1 ] to [ - 1, 1 ]
|
|
365
|
-
|
|
366
|
-
}
|
|
367
|
-
|
|
368
355
|
} else {
|
|
369
356
|
|
|
370
357
|
const w = shadowCoord.w;
|
|
@@ -383,7 +370,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
383
370
|
shadowCoord = vec3(
|
|
384
371
|
shadowCoord.x,
|
|
385
372
|
shadowCoord.y.oneMinus(), // follow webgpu standards
|
|
386
|
-
coordZ.add( bias )
|
|
373
|
+
renderer.reversedDepthBuffer ? coordZ.sub( bias ) : coordZ.add( bias )
|
|
387
374
|
);
|
|
388
375
|
|
|
389
376
|
return shadowCoord;
|
|
@@ -407,7 +394,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
407
394
|
|
|
408
395
|
const depthTexture = new DepthTexture( shadow.mapSize.width, shadow.mapSize.height );
|
|
409
396
|
depthTexture.name = 'ShadowDepthTexture';
|
|
410
|
-
depthTexture.compareFunction =
|
|
397
|
+
depthTexture.compareFunction = builder.renderer.reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare;
|
|
411
398
|
|
|
412
399
|
const shadowMap = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height );
|
|
413
400
|
shadowMap.texture.name = 'ShadowMap';
|
|
@@ -430,9 +417,22 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
430
417
|
|
|
431
418
|
const { light, shadow } = this;
|
|
432
419
|
|
|
420
|
+
const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder );
|
|
421
|
+
|
|
433
422
|
const shadowMapType = renderer.shadowMap.type;
|
|
423
|
+
const hasTextureCompare = renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE );
|
|
434
424
|
|
|
435
|
-
|
|
425
|
+
if ( ( shadowMapType === PCFShadowMap || shadowMapType === PCFSoftShadowMap ) && hasTextureCompare ) {
|
|
426
|
+
|
|
427
|
+
depthTexture.minFilter = LinearFilter;
|
|
428
|
+
depthTexture.magFilter = LinearFilter;
|
|
429
|
+
|
|
430
|
+
} else {
|
|
431
|
+
|
|
432
|
+
depthTexture.minFilter = NearestFilter;
|
|
433
|
+
depthTexture.magFilter = NearestFilter;
|
|
434
|
+
|
|
435
|
+
}
|
|
436
436
|
|
|
437
437
|
shadow.camera.coordinateSystem = camera.coordinateSystem;
|
|
438
438
|
shadow.camera.updateProjectionMatrix();
|
|
@@ -523,15 +523,42 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
523
523
|
|
|
524
524
|
const shadowNode = this.setupShadowFilter( builder, { filterFn, shadowTexture: shadowMap.texture, depthTexture: shadowDepthTexture, shadowCoord, shadow, depthLayer: this.depthLayer } );
|
|
525
525
|
|
|
526
|
-
let shadowColor
|
|
526
|
+
let shadowColor;
|
|
527
|
+
|
|
528
|
+
if ( renderer.shadowMap.transmitted === true ) {
|
|
529
|
+
|
|
530
|
+
if ( shadowMap.texture.isCubeTexture ) {
|
|
531
|
+
|
|
532
|
+
// For cube shadow maps (point lights), use cubeTexture with vec3 coordinates
|
|
533
|
+
shadowColor = cubeTexture( shadowMap.texture, shadowCoord.xyz );
|
|
534
|
+
|
|
535
|
+
} else {
|
|
536
|
+
|
|
537
|
+
shadowColor = texture( shadowMap.texture, shadowCoord );
|
|
527
538
|
|
|
528
|
-
|
|
539
|
+
if ( depthTexture.isArrayTexture ) {
|
|
529
540
|
|
|
530
|
-
|
|
541
|
+
shadowColor = shadowColor.depth( this.depthLayer );
|
|
542
|
+
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
}
|
|
531
546
|
|
|
532
547
|
}
|
|
533
548
|
|
|
534
|
-
|
|
549
|
+
//
|
|
550
|
+
|
|
551
|
+
let shadowOutput;
|
|
552
|
+
|
|
553
|
+
if ( shadowColor ) {
|
|
554
|
+
|
|
555
|
+
shadowOutput = mix( 1, shadowNode.rgb.mix( shadowColor, 1 ), shadowIntensity.mul( shadowColor.a ) ).toVar();
|
|
556
|
+
|
|
557
|
+
} else {
|
|
558
|
+
|
|
559
|
+
shadowOutput = mix( 1, shadowNode, shadowIntensity ).toVar();
|
|
560
|
+
|
|
561
|
+
}
|
|
535
562
|
|
|
536
563
|
this.shadowMap = shadowMap;
|
|
537
564
|
this.shadow.map = shadowMap;
|
|
@@ -540,13 +567,33 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
540
567
|
|
|
541
568
|
const inspectName = `${ this.light.type } Shadow [ ${ this.light.name || 'ID: ' + this.light.id } ]`;
|
|
542
569
|
|
|
543
|
-
|
|
570
|
+
if ( shadowColor ) {
|
|
571
|
+
|
|
572
|
+
shadowOutput.toInspector( `${ inspectName } / Color`, () => {
|
|
573
|
+
|
|
574
|
+
if ( this.shadowMap.texture.isCubeTexture ) {
|
|
575
|
+
|
|
576
|
+
return cubeTexture( this.shadowMap.texture );
|
|
577
|
+
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
return texture( this.shadowMap.texture );
|
|
581
|
+
|
|
582
|
+
} );
|
|
583
|
+
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
return shadowOutput.toInspector( `${ inspectName } / Depth`, () => {
|
|
587
|
+
|
|
588
|
+
// TODO: Use linear depth
|
|
589
|
+
|
|
590
|
+
if ( this.shadowMap.texture.isCubeTexture ) {
|
|
544
591
|
|
|
545
|
-
|
|
592
|
+
return cubeTexture( this.shadowMap.texture ).r.oneMinus();
|
|
546
593
|
|
|
547
|
-
|
|
594
|
+
}
|
|
548
595
|
|
|
549
|
-
return textureLoad( this.shadowMap.depthTexture, uv().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).
|
|
596
|
+
return textureLoad( this.shadowMap.depthTexture, uv().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).r.oneMinus();
|
|
550
597
|
|
|
551
598
|
} );
|
|
552
599
|
|
|
@@ -585,12 +632,6 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
585
632
|
|
|
586
633
|
}
|
|
587
634
|
|
|
588
|
-
if ( builder.material.shadowNode ) { // @deprecated, r171
|
|
589
|
-
|
|
590
|
-
warn( 'NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.' );
|
|
591
|
-
|
|
592
|
-
}
|
|
593
|
-
|
|
594
635
|
if ( builder.material.receivedShadowNode ) {
|
|
595
636
|
|
|
596
637
|
node = builder.material.receivedShadowNode( node );
|
|
@@ -729,6 +770,8 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
729
770
|
|
|
730
771
|
this._currentShadowType = null;
|
|
731
772
|
|
|
773
|
+
disposeShadowMaterial( this.light );
|
|
774
|
+
|
|
732
775
|
if ( this.shadowMap ) {
|
|
733
776
|
|
|
734
777
|
this.shadowMap.dispose();
|
|
@@ -799,6 +842,19 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
799
842
|
|
|
800
843
|
export default ShadowNode;
|
|
801
844
|
|
|
845
|
+
/**
|
|
846
|
+
* Shadow Render Object Function.
|
|
847
|
+
*
|
|
848
|
+
* @function shadowRenderObjectFunction
|
|
849
|
+
* @param {Object3D} object - The 3D object to render.
|
|
850
|
+
* @param {Scene} scene - The scene containing the object.
|
|
851
|
+
* @param {Camera} _camera - The camera used for rendering.
|
|
852
|
+
* @param {BufferGeometry} geometry - The geometry of the object.
|
|
853
|
+
* @param {Material} material - The material of the object.
|
|
854
|
+
* @param {Group} group - The group the object belongs to.
|
|
855
|
+
* @param {...any} params - Additional parameters for rendering.
|
|
856
|
+
*/
|
|
857
|
+
|
|
802
858
|
/**
|
|
803
859
|
* TSL function for creating an instance of `ShadowNode`.
|
|
804
860
|
*
|
|
@@ -808,4 +864,4 @@ export default ShadowNode;
|
|
|
808
864
|
* @param {?LightShadow} [shadow] - The light shadow.
|
|
809
865
|
* @return {ShadowNode} The created shadow node.
|
|
810
866
|
*/
|
|
811
|
-
export const shadow = ( light, shadow ) =>
|
|
867
|
+
export const shadow = ( light, shadow ) => new ShadowNode( light, shadow );
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { float, Fn, If, nodeProxyIntent, uint, int, uvec2, uvec3, uvec4, ivec2, ivec3, ivec4 } from '../tsl/TSLCore.js';
|
|
2
|
+
import { bitcast, floatBitsToUint } from './BitcastNode.js';
|
|
3
|
+
import MathNode, { negate } from './MathNode.js';
|
|
4
|
+
|
|
5
|
+
const registeredBitcountFunctions = {};
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* This node represents an operation that counts the bits of a piece of shader data.
|
|
9
|
+
*
|
|
10
|
+
* @augments MathNode
|
|
11
|
+
*/
|
|
12
|
+
class BitcountNode extends MathNode {
|
|
13
|
+
|
|
14
|
+
static get type() {
|
|
15
|
+
|
|
16
|
+
return 'BitcountNode';
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Constructs a new math node.
|
|
22
|
+
*
|
|
23
|
+
* @param {'countTrailingZeros'|'countLeadingZeros'|'countOneBits'} method - The method name.
|
|
24
|
+
* @param {Node} aNode - The first input.
|
|
25
|
+
*/
|
|
26
|
+
constructor( method, aNode ) {
|
|
27
|
+
|
|
28
|
+
super( method, aNode );
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* This flag can be used for type testing.
|
|
32
|
+
*
|
|
33
|
+
* @type {boolean}
|
|
34
|
+
* @readonly
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
37
|
+
this.isBitcountNode = true;
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Casts the input value of the function to an integer if necessary.
|
|
43
|
+
*
|
|
44
|
+
* @private
|
|
45
|
+
* @param {Node<uint>|Node<int>} inputNode - The input value.
|
|
46
|
+
* @param {Node<uint>} outputNode - The output value.
|
|
47
|
+
* @param {string} elementType - The type of the input value.
|
|
48
|
+
*/
|
|
49
|
+
_resolveElementType( inputNode, outputNode, elementType ) {
|
|
50
|
+
|
|
51
|
+
if ( elementType === 'int' ) {
|
|
52
|
+
|
|
53
|
+
outputNode.assign( bitcast( inputNode, 'uint' ) );
|
|
54
|
+
|
|
55
|
+
} else {
|
|
56
|
+
|
|
57
|
+
outputNode.assign( inputNode );
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
_returnDataNode( inputType ) {
|
|
64
|
+
|
|
65
|
+
switch ( inputType ) {
|
|
66
|
+
|
|
67
|
+
case 'uint': {
|
|
68
|
+
|
|
69
|
+
return uint;
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
case 'int': {
|
|
74
|
+
|
|
75
|
+
return int;
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
case 'uvec2': {
|
|
80
|
+
|
|
81
|
+
return uvec2;
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
case 'uvec3': {
|
|
86
|
+
|
|
87
|
+
return uvec3;
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
case 'uvec4': {
|
|
92
|
+
|
|
93
|
+
return uvec4;
|
|
94
|
+
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
case 'ivec2': {
|
|
98
|
+
|
|
99
|
+
return ivec2;
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
case 'ivec3': {
|
|
104
|
+
|
|
105
|
+
return ivec3;
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
case 'ivec4': {
|
|
110
|
+
|
|
111
|
+
return ivec4;
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Creates and registers a reusable GLSL function that emulates the behavior of countTrailingZeros.
|
|
121
|
+
*
|
|
122
|
+
* @private
|
|
123
|
+
* @param {string} method - The name of the function to create.
|
|
124
|
+
* @param {string} elementType - The type of the input value.
|
|
125
|
+
* @returns {Function} - The generated function
|
|
126
|
+
*/
|
|
127
|
+
_createTrailingZerosBaseLayout( method, elementType ) {
|
|
128
|
+
|
|
129
|
+
const outputConvertNode = this._returnDataNode( elementType );
|
|
130
|
+
|
|
131
|
+
const fnDef = Fn( ( [ value ] ) => {
|
|
132
|
+
|
|
133
|
+
const v = uint( 0.0 );
|
|
134
|
+
|
|
135
|
+
this._resolveElementType( value, v, elementType );
|
|
136
|
+
|
|
137
|
+
const f = float( v.bitAnd( negate( v ) ) );
|
|
138
|
+
const uintBits = floatBitsToUint( f );
|
|
139
|
+
|
|
140
|
+
const numTrailingZeros = ( uintBits.shiftRight( 23 ) ).sub( 127 );
|
|
141
|
+
|
|
142
|
+
return outputConvertNode( numTrailingZeros );
|
|
143
|
+
|
|
144
|
+
} ).setLayout( {
|
|
145
|
+
name: method,
|
|
146
|
+
type: elementType,
|
|
147
|
+
inputs: [
|
|
148
|
+
{ name: 'value', type: elementType }
|
|
149
|
+
]
|
|
150
|
+
} );
|
|
151
|
+
|
|
152
|
+
return fnDef;
|
|
153
|
+
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Creates and registers a reusable GLSL function that emulates the behavior of countLeadingZeros.
|
|
158
|
+
*
|
|
159
|
+
* @private
|
|
160
|
+
* @param {string} method - The name of the function to create.
|
|
161
|
+
* @param {string} elementType - The type of the input value.
|
|
162
|
+
* @returns {Function} - The generated function
|
|
163
|
+
*/
|
|
164
|
+
_createLeadingZerosBaseLayout( method, elementType ) {
|
|
165
|
+
|
|
166
|
+
const outputConvertNode = this._returnDataNode( elementType );
|
|
167
|
+
|
|
168
|
+
const fnDef = Fn( ( [ value ] ) => {
|
|
169
|
+
|
|
170
|
+
If( value.equal( uint( 0 ) ), () => {
|
|
171
|
+
|
|
172
|
+
return uint( 32 );
|
|
173
|
+
|
|
174
|
+
} );
|
|
175
|
+
|
|
176
|
+
const v = uint( 0 );
|
|
177
|
+
const n = uint( 0 );
|
|
178
|
+
this._resolveElementType( value, v, elementType );
|
|
179
|
+
|
|
180
|
+
If( v.shiftRight( 16 ).equal( 0 ), () => {
|
|
181
|
+
|
|
182
|
+
n.addAssign( 16 );
|
|
183
|
+
v.shiftLeftAssign( 16 );
|
|
184
|
+
|
|
185
|
+
} );
|
|
186
|
+
|
|
187
|
+
If( v.shiftRight( 24 ).equal( 0 ), () => {
|
|
188
|
+
|
|
189
|
+
n.addAssign( 8 );
|
|
190
|
+
v.shiftLeftAssign( 8 );
|
|
191
|
+
|
|
192
|
+
} );
|
|
193
|
+
|
|
194
|
+
If( v.shiftRight( 28 ).equal( 0 ), () => {
|
|
195
|
+
|
|
196
|
+
n.addAssign( 4 );
|
|
197
|
+
v.shiftLeftAssign( 4 );
|
|
198
|
+
|
|
199
|
+
} );
|
|
200
|
+
|
|
201
|
+
If( v.shiftRight( 30 ).equal( 0 ), () => {
|
|
202
|
+
|
|
203
|
+
n.addAssign( 2 );
|
|
204
|
+
v.shiftLeftAssign( 2 );
|
|
205
|
+
|
|
206
|
+
} );
|
|
207
|
+
|
|
208
|
+
If( v.shiftRight( 31 ).equal( 0 ), () => {
|
|
209
|
+
|
|
210
|
+
n.addAssign( 1 );
|
|
211
|
+
|
|
212
|
+
} );
|
|
213
|
+
|
|
214
|
+
return outputConvertNode( n );
|
|
215
|
+
|
|
216
|
+
} ).setLayout( {
|
|
217
|
+
name: method,
|
|
218
|
+
type: elementType,
|
|
219
|
+
inputs: [
|
|
220
|
+
{ name: 'value', type: elementType }
|
|
221
|
+
]
|
|
222
|
+
} );
|
|
223
|
+
|
|
224
|
+
return fnDef;
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Creates and registers a reusable GLSL function that emulates the behavior of countOneBits.
|
|
230
|
+
*
|
|
231
|
+
* @private
|
|
232
|
+
* @param {string} method - The name of the function to create.
|
|
233
|
+
* @param {string} elementType - The type of the input value.
|
|
234
|
+
* @returns {Function} - The generated function
|
|
235
|
+
*/
|
|
236
|
+
_createOneBitsBaseLayout( method, elementType ) {
|
|
237
|
+
|
|
238
|
+
const outputConvertNode = this._returnDataNode( elementType );
|
|
239
|
+
|
|
240
|
+
const fnDef = Fn( ( [ value ] ) => {
|
|
241
|
+
|
|
242
|
+
const v = uint( 0.0 );
|
|
243
|
+
|
|
244
|
+
this._resolveElementType( value, v, elementType );
|
|
245
|
+
|
|
246
|
+
v.assign( v.sub( v.shiftRight( uint( 1 ) ).bitAnd( uint( 0x55555555 ) ) ) );
|
|
247
|
+
v.assign( v.bitAnd( uint( 0x33333333 ) ).add( v.shiftRight( uint( 2 ) ).bitAnd( uint( 0x33333333 ) ) ) );
|
|
248
|
+
|
|
249
|
+
const numBits = v.add( v.shiftRight( uint( 4 ) ) ).bitAnd( uint( 0xF0F0F0F ) ).mul( uint( 0x1010101 ) ).shiftRight( uint( 24 ) );
|
|
250
|
+
|
|
251
|
+
return outputConvertNode( numBits );
|
|
252
|
+
|
|
253
|
+
} ).setLayout( {
|
|
254
|
+
name: method,
|
|
255
|
+
type: elementType,
|
|
256
|
+
inputs: [
|
|
257
|
+
{ name: 'value', type: elementType }
|
|
258
|
+
]
|
|
259
|
+
} );
|
|
260
|
+
|
|
261
|
+
return fnDef;
|
|
262
|
+
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Creates and registers a reusable GLSL function that emulates the behavior of the specified bitcount function.
|
|
267
|
+
* including considerations for component-wise bitcounts on vector type inputs.
|
|
268
|
+
*
|
|
269
|
+
* @private
|
|
270
|
+
* @param {string} method - The name of the function to create.
|
|
271
|
+
* @param {string} inputType - The type of the input value.
|
|
272
|
+
* @param {number} typeLength - The vec length of the input value.
|
|
273
|
+
* @param {Function} baseFn - The base function that operates on an individual component of the vector.
|
|
274
|
+
* @returns {Function} - The alias function for the specified bitcount method.
|
|
275
|
+
*/
|
|
276
|
+
_createMainLayout( method, inputType, typeLength, baseFn ) {
|
|
277
|
+
|
|
278
|
+
const outputConvertNode = this._returnDataNode( inputType );
|
|
279
|
+
|
|
280
|
+
const fnDef = Fn( ( [ value ] ) => {
|
|
281
|
+
|
|
282
|
+
if ( typeLength === 1 ) {
|
|
283
|
+
|
|
284
|
+
return outputConvertNode( baseFn( value ) );
|
|
285
|
+
|
|
286
|
+
} else {
|
|
287
|
+
|
|
288
|
+
const vec = outputConvertNode( 0 );
|
|
289
|
+
|
|
290
|
+
const components = [ 'x', 'y', 'z', 'w' ];
|
|
291
|
+
for ( let i = 0; i < typeLength; i ++ ) {
|
|
292
|
+
|
|
293
|
+
const component = components[ i ];
|
|
294
|
+
|
|
295
|
+
vec[ component ].assign( baseFn( value[ component ] ) );
|
|
296
|
+
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return vec;
|
|
300
|
+
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
} ).setLayout( {
|
|
304
|
+
name: method,
|
|
305
|
+
type: inputType,
|
|
306
|
+
inputs: [
|
|
307
|
+
{ name: 'value', type: inputType }
|
|
308
|
+
]
|
|
309
|
+
} );
|
|
310
|
+
|
|
311
|
+
return fnDef;
|
|
312
|
+
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
setup( builder ) {
|
|
316
|
+
|
|
317
|
+
const { method, aNode } = this;
|
|
318
|
+
|
|
319
|
+
const { renderer } = builder;
|
|
320
|
+
|
|
321
|
+
if ( renderer.backend.isWebGPUBackend ) {
|
|
322
|
+
|
|
323
|
+
// use built-in WGSL functions for WebGPU
|
|
324
|
+
|
|
325
|
+
return super.setup( builder );
|
|
326
|
+
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const inputType = this.getInputType( builder );
|
|
330
|
+
const elementType = builder.getElementType( inputType );
|
|
331
|
+
|
|
332
|
+
const typeLength = builder.getTypeLength( inputType );
|
|
333
|
+
|
|
334
|
+
const baseMethod = `${method}_base_${elementType}`;
|
|
335
|
+
const newMethod = `${method}_${inputType}`;
|
|
336
|
+
|
|
337
|
+
let baseFn = registeredBitcountFunctions[ baseMethod ];
|
|
338
|
+
|
|
339
|
+
if ( baseFn === undefined ) {
|
|
340
|
+
|
|
341
|
+
switch ( method ) {
|
|
342
|
+
|
|
343
|
+
case BitcountNode.COUNT_LEADING_ZEROS: {
|
|
344
|
+
|
|
345
|
+
baseFn = this._createLeadingZerosBaseLayout( baseMethod, elementType );
|
|
346
|
+
break;
|
|
347
|
+
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
case BitcountNode.COUNT_TRAILING_ZEROS: {
|
|
351
|
+
|
|
352
|
+
baseFn = this._createTrailingZerosBaseLayout( baseMethod, elementType );
|
|
353
|
+
break;
|
|
354
|
+
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
case BitcountNode.COUNT_ONE_BITS: {
|
|
358
|
+
|
|
359
|
+
baseFn = this._createOneBitsBaseLayout( baseMethod, elementType );
|
|
360
|
+
break;
|
|
361
|
+
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
registeredBitcountFunctions[ baseMethod ] = baseFn;
|
|
367
|
+
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
let fn = registeredBitcountFunctions[ newMethod ];
|
|
371
|
+
|
|
372
|
+
if ( fn === undefined ) {
|
|
373
|
+
|
|
374
|
+
fn = this._createMainLayout( newMethod, inputType, typeLength, baseFn );
|
|
375
|
+
registeredBitcountFunctions[ newMethod ] = fn;
|
|
376
|
+
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const output = Fn( () => {
|
|
380
|
+
|
|
381
|
+
return fn(
|
|
382
|
+
aNode,
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
} );
|
|
386
|
+
|
|
387
|
+
return output();
|
|
388
|
+
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
export default BitcountNode;
|
|
394
|
+
|
|
395
|
+
BitcountNode.COUNT_TRAILING_ZEROS = 'countTrailingZeros';
|
|
396
|
+
BitcountNode.COUNT_LEADING_ZEROS = 'countLeadingZeros';
|
|
397
|
+
BitcountNode.COUNT_ONE_BITS = 'countOneBits';
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Finds the number of consecutive 0 bits from the least significant bit of the input value,
|
|
401
|
+
* which is also the index of the least significant bit of the input value.
|
|
402
|
+
*
|
|
403
|
+
* Can only be used with {@link WebGPURenderer} and a WebGPU backend.
|
|
404
|
+
*
|
|
405
|
+
* @tsl
|
|
406
|
+
* @function
|
|
407
|
+
* @param {Node | number} x - The input value.
|
|
408
|
+
* @returns {Node}
|
|
409
|
+
*/
|
|
410
|
+
export const countTrailingZeros = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_TRAILING_ZEROS ).setParameterLength( 1 );
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Finds the number of consecutive 0 bits starting from the most significant bit of the input value.
|
|
414
|
+
*
|
|
415
|
+
* Can only be used with {@link WebGPURenderer} and a WebGPU backend.
|
|
416
|
+
*
|
|
417
|
+
* @tsl
|
|
418
|
+
* @function
|
|
419
|
+
* @param {Node | number} x - The input value.
|
|
420
|
+
* @returns {Node}
|
|
421
|
+
*/
|
|
422
|
+
export const countLeadingZeros = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_LEADING_ZEROS ).setParameterLength( 1 );
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Finds the number of '1' bits set in the input value
|
|
426
|
+
*
|
|
427
|
+
* Can only be used with {@link WebGPURenderer} and a WebGPU backend.
|
|
428
|
+
*
|
|
429
|
+
* @tsl
|
|
430
|
+
* @function
|
|
431
|
+
* @returns {Node}
|
|
432
|
+
*/
|
|
433
|
+
export const countOneBits = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_ONE_BITS ).setParameterLength( 1 );
|