@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,5 +1,4 @@
|
|
|
1
1
|
import UniformNode from '../core/UniformNode.js';
|
|
2
|
-
import { nodeObject } from '../tsl/TSLBase.js';
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* A special type of uniform node which represents array-like data
|
|
@@ -58,6 +57,34 @@ class BufferNode extends UniformNode {
|
|
|
58
57
|
*/
|
|
59
58
|
this.bufferCount = bufferCount;
|
|
60
59
|
|
|
60
|
+
/**
|
|
61
|
+
* An array of update ranges.
|
|
62
|
+
*
|
|
63
|
+
* @type {Array<{start: number, count: number}>}
|
|
64
|
+
*/
|
|
65
|
+
this.updateRanges = [];
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Adds a range of data in the data array to be updated on the GPU.
|
|
71
|
+
*
|
|
72
|
+
* @param {number} start - Position at which to start update.
|
|
73
|
+
* @param {number} count - The number of components to update.
|
|
74
|
+
*/
|
|
75
|
+
addUpdateRange( start, count ) {
|
|
76
|
+
|
|
77
|
+
this.updateRanges.push( { start, count } );
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Clears the update ranges.
|
|
83
|
+
*/
|
|
84
|
+
clearUpdateRanges() {
|
|
85
|
+
|
|
86
|
+
this.updateRanges.length = 0;
|
|
87
|
+
|
|
61
88
|
}
|
|
62
89
|
|
|
63
90
|
/**
|
|
@@ -98,4 +125,4 @@ export default BufferNode;
|
|
|
98
125
|
* @param {number} count - The count of buffer elements.
|
|
99
126
|
* @returns {BufferNode}
|
|
100
127
|
*/
|
|
101
|
-
export const buffer = ( value, type, count ) =>
|
|
128
|
+
export const buffer = ( value, type, count ) => new BufferNode( value, type, count );
|
|
@@ -6,6 +6,29 @@ import { uniformArray } from './UniformArrayNode.js';
|
|
|
6
6
|
import { builtin } from './BuiltinNode.js';
|
|
7
7
|
import { screenSize } from '../display/ScreenNode.js';
|
|
8
8
|
|
|
9
|
+
// Cache node uniforms
|
|
10
|
+
|
|
11
|
+
let _cameraProjectionMatrixBase = null;
|
|
12
|
+
let _cameraProjectionMatrixArray = null;
|
|
13
|
+
|
|
14
|
+
let _cameraProjectionMatrixInverseBase = null;
|
|
15
|
+
let _cameraProjectionMatrixInverseArray = null;
|
|
16
|
+
|
|
17
|
+
let _cameraViewMatrixBase = null;
|
|
18
|
+
let _cameraViewMatrixArray = null;
|
|
19
|
+
|
|
20
|
+
let _cameraWorldMatrixBase = null;
|
|
21
|
+
let _cameraWorldMatrixArray = null;
|
|
22
|
+
|
|
23
|
+
let _cameraNormalMatrixBase = null;
|
|
24
|
+
let _cameraNormalMatrixArray = null;
|
|
25
|
+
|
|
26
|
+
let _cameraPositionBase = null;
|
|
27
|
+
let _cameraPositionArray = null;
|
|
28
|
+
|
|
29
|
+
let _cameraViewportBase = null;
|
|
30
|
+
let _cameraViewportArray = null;
|
|
31
|
+
|
|
9
32
|
/**
|
|
10
33
|
* TSL object that represents the current `index` value of the camera if used ArrayCamera.
|
|
11
34
|
*
|
|
@@ -50,13 +73,27 @@ export const cameraProjectionMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {
|
|
|
50
73
|
|
|
51
74
|
}
|
|
52
75
|
|
|
53
|
-
|
|
76
|
+
if ( _cameraProjectionMatrixArray === null ) {
|
|
77
|
+
|
|
78
|
+
_cameraProjectionMatrixArray = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraProjectionMatrices' );
|
|
54
79
|
|
|
55
|
-
|
|
80
|
+
} else {
|
|
81
|
+
|
|
82
|
+
_cameraProjectionMatrixArray.array = matrices;
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
cameraProjectionMatrix = _cameraProjectionMatrixArray.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraProjectionMatrix' );
|
|
56
87
|
|
|
57
88
|
} else {
|
|
58
89
|
|
|
59
|
-
|
|
90
|
+
if ( _cameraProjectionMatrixBase === null ) {
|
|
91
|
+
|
|
92
|
+
_cameraProjectionMatrixBase = uniform( camera.projectionMatrix ).setName( 'cameraProjectionMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.projectionMatrix );
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
cameraProjectionMatrix = _cameraProjectionMatrixBase;
|
|
60
97
|
|
|
61
98
|
}
|
|
62
99
|
|
|
@@ -84,13 +121,27 @@ export const cameraProjectionMatrixInverse = /*@__PURE__*/ ( Fn( ( { camera } )
|
|
|
84
121
|
|
|
85
122
|
}
|
|
86
123
|
|
|
87
|
-
|
|
124
|
+
if ( _cameraProjectionMatrixInverseArray === null ) {
|
|
125
|
+
|
|
126
|
+
_cameraProjectionMatrixInverseArray = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraProjectionMatricesInverse' );
|
|
88
127
|
|
|
89
|
-
|
|
128
|
+
} else {
|
|
129
|
+
|
|
130
|
+
_cameraProjectionMatrixInverseArray.array = matrices;
|
|
131
|
+
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
cameraProjectionMatrixInverse = _cameraProjectionMatrixInverseArray.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraProjectionMatrixInverse' );
|
|
90
135
|
|
|
91
136
|
} else {
|
|
92
137
|
|
|
93
|
-
|
|
138
|
+
if ( _cameraProjectionMatrixInverseBase === null ) {
|
|
139
|
+
|
|
140
|
+
_cameraProjectionMatrixInverseBase = uniform( camera.projectionMatrixInverse ).setName( 'cameraProjectionMatrixInverse' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.projectionMatrixInverse );
|
|
141
|
+
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
cameraProjectionMatrixInverse = _cameraProjectionMatrixInverseBase;
|
|
94
145
|
|
|
95
146
|
}
|
|
96
147
|
|
|
@@ -118,13 +169,27 @@ export const cameraViewMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {
|
|
|
118
169
|
|
|
119
170
|
}
|
|
120
171
|
|
|
121
|
-
|
|
172
|
+
if ( _cameraViewMatrixArray === null ) {
|
|
173
|
+
|
|
174
|
+
_cameraViewMatrixArray = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraViewMatrices' );
|
|
122
175
|
|
|
123
|
-
|
|
176
|
+
} else {
|
|
177
|
+
|
|
178
|
+
_cameraViewMatrixArray.array = matrices;
|
|
179
|
+
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
cameraViewMatrix = _cameraViewMatrixArray.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraViewMatrix' );
|
|
124
183
|
|
|
125
184
|
} else {
|
|
126
185
|
|
|
127
|
-
|
|
186
|
+
if ( _cameraViewMatrixBase === null ) {
|
|
187
|
+
|
|
188
|
+
_cameraViewMatrixBase = uniform( camera.matrixWorldInverse ).setName( 'cameraViewMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.matrixWorldInverse );
|
|
189
|
+
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
cameraViewMatrix = _cameraViewMatrixBase;
|
|
128
193
|
|
|
129
194
|
}
|
|
130
195
|
|
|
@@ -152,13 +217,27 @@ export const cameraWorldMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {
|
|
|
152
217
|
|
|
153
218
|
}
|
|
154
219
|
|
|
155
|
-
|
|
220
|
+
if ( _cameraWorldMatrixArray === null ) {
|
|
221
|
+
|
|
222
|
+
_cameraWorldMatrixArray = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraWorldMatrices' );
|
|
156
223
|
|
|
157
|
-
|
|
224
|
+
} else {
|
|
225
|
+
|
|
226
|
+
_cameraWorldMatrixArray.array = matrices;
|
|
227
|
+
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
cameraWorldMatrix = _cameraWorldMatrixArray.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraWorldMatrix' );
|
|
158
231
|
|
|
159
232
|
} else {
|
|
160
233
|
|
|
161
|
-
|
|
234
|
+
if ( _cameraWorldMatrixBase === null ) {
|
|
235
|
+
|
|
236
|
+
_cameraWorldMatrixBase = uniform( camera.matrixWorld ).setName( 'cameraWorldMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.matrixWorld );
|
|
237
|
+
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
cameraWorldMatrix = _cameraWorldMatrixBase;
|
|
162
241
|
|
|
163
242
|
}
|
|
164
243
|
|
|
@@ -186,13 +265,27 @@ export const cameraNormalMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {
|
|
|
186
265
|
|
|
187
266
|
}
|
|
188
267
|
|
|
189
|
-
|
|
268
|
+
if ( _cameraNormalMatrixArray === null ) {
|
|
269
|
+
|
|
270
|
+
_cameraNormalMatrixArray = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraNormalMatrices' );
|
|
190
271
|
|
|
191
|
-
|
|
272
|
+
} else {
|
|
273
|
+
|
|
274
|
+
_cameraNormalMatrixArray.array = matrices;
|
|
275
|
+
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
cameraNormalMatrix = _cameraNormalMatrixArray.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraNormalMatrix' );
|
|
192
279
|
|
|
193
280
|
} else {
|
|
194
281
|
|
|
195
|
-
|
|
282
|
+
if ( _cameraNormalMatrixBase === null ) {
|
|
283
|
+
|
|
284
|
+
_cameraNormalMatrixBase = uniform( camera.normalMatrix ).setName( 'cameraNormalMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.normalMatrix );
|
|
285
|
+
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
cameraNormalMatrix = _cameraNormalMatrixBase;
|
|
196
289
|
|
|
197
290
|
}
|
|
198
291
|
|
|
@@ -220,24 +313,38 @@ export const cameraPosition = /*@__PURE__*/ ( Fn( ( { camera } ) => {
|
|
|
220
313
|
|
|
221
314
|
}
|
|
222
315
|
|
|
223
|
-
|
|
316
|
+
if ( _cameraPositionArray === null ) {
|
|
317
|
+
|
|
318
|
+
_cameraPositionArray = uniformArray( positions ).setGroup( renderGroup ).setName( 'cameraPositions' ).onRenderUpdate( ( { camera }, self ) => {
|
|
224
319
|
|
|
225
|
-
|
|
226
|
-
|
|
320
|
+
const subCameras = camera.cameras;
|
|
321
|
+
const array = self.array;
|
|
227
322
|
|
|
228
|
-
|
|
323
|
+
for ( let i = 0, l = subCameras.length; i < l; i ++ ) {
|
|
229
324
|
|
|
230
|
-
|
|
325
|
+
array[ i ].setFromMatrixPosition( subCameras[ i ].matrixWorld );
|
|
231
326
|
|
|
232
|
-
|
|
327
|
+
}
|
|
233
328
|
|
|
234
|
-
|
|
329
|
+
} );
|
|
235
330
|
|
|
236
|
-
|
|
331
|
+
} else {
|
|
332
|
+
|
|
333
|
+
_cameraPositionArray.array = positions;
|
|
334
|
+
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
cameraPosition = _cameraPositionArray.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraPosition' );
|
|
237
338
|
|
|
238
339
|
} else {
|
|
239
340
|
|
|
240
|
-
|
|
341
|
+
if ( _cameraPositionBase === null ) {
|
|
342
|
+
|
|
343
|
+
_cameraPositionBase = uniform( new Vector3() ).setName( 'cameraPosition' ).setGroup( renderGroup ).onRenderUpdate( ( { camera }, self ) => self.value.setFromMatrixPosition( camera.matrixWorld ) );
|
|
344
|
+
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
cameraPosition = _cameraPositionBase;
|
|
241
348
|
|
|
242
349
|
}
|
|
243
350
|
|
|
@@ -266,14 +373,28 @@ export const cameraViewport = /*@__PURE__*/ ( Fn( ( { camera } ) => {
|
|
|
266
373
|
|
|
267
374
|
}
|
|
268
375
|
|
|
269
|
-
|
|
376
|
+
if ( _cameraViewportArray === null ) {
|
|
377
|
+
|
|
378
|
+
_cameraViewportArray = uniformArray( viewports, 'vec4' ).setGroup( renderGroup ).setName( 'cameraViewports' );
|
|
270
379
|
|
|
271
|
-
|
|
380
|
+
} else {
|
|
381
|
+
|
|
382
|
+
_cameraViewportArray.array = viewports;
|
|
383
|
+
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
cameraViewport = _cameraViewportArray.element( cameraIndex ).toConst( 'cameraViewport' );
|
|
272
387
|
|
|
273
388
|
} else {
|
|
274
389
|
|
|
275
|
-
|
|
276
|
-
|
|
390
|
+
if ( _cameraViewportBase === null ) {
|
|
391
|
+
|
|
392
|
+
// Fallback for single camera
|
|
393
|
+
_cameraViewportBase = vec4( 0, 0, screenSize.x, screenSize.y ).toConst( 'cameraViewport' );
|
|
394
|
+
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
cameraViewport = _cameraViewportBase;
|
|
277
398
|
|
|
278
399
|
}
|
|
279
400
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
import Node from '../core/Node.js';
|
|
3
|
-
import {
|
|
3
|
+
import { Fn, bool, float } from '../tsl/TSLBase.js';
|
|
4
4
|
import { positionView } from './Position.js';
|
|
5
5
|
import { diffuseColor } from '../core/PropertyNode.js';
|
|
6
6
|
import { Loop } from '../utils/LoopNode.js';
|
|
@@ -234,7 +234,7 @@ export default ClippingNode;
|
|
|
234
234
|
* @function
|
|
235
235
|
* @returns {ClippingNode}
|
|
236
236
|
*/
|
|
237
|
-
export const clipping = () =>
|
|
237
|
+
export const clipping = () => new ClippingNode();
|
|
238
238
|
|
|
239
239
|
/**
|
|
240
240
|
* TSL function for setting up alpha to coverage.
|
|
@@ -243,7 +243,7 @@ export const clipping = () => nodeObject( new ClippingNode() );
|
|
|
243
243
|
* @function
|
|
244
244
|
* @returns {ClippingNode}
|
|
245
245
|
*/
|
|
246
|
-
export const clippingAlpha = () =>
|
|
246
|
+
export const clippingAlpha = () => new ClippingNode( ClippingNode.ALPHA_TO_COVERAGE );
|
|
247
247
|
|
|
248
248
|
/**
|
|
249
249
|
* TSL function for setting up hardware-based clipping.
|
|
@@ -252,4 +252,4 @@ export const clippingAlpha = () => nodeObject( new ClippingNode( ClippingNode.AL
|
|
|
252
252
|
* @function
|
|
253
253
|
* @returns {ClippingNode}
|
|
254
254
|
*/
|
|
255
|
-
export const hardwareClipping = () =>
|
|
255
|
+
export const hardwareClipping = () => new ClippingNode( ClippingNode.HARDWARE );
|
|
@@ -47,13 +47,19 @@ class CubeTextureNode extends TextureNode {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
|
-
* Overwrites the default implementation to return
|
|
50
|
+
* Overwrites the default implementation to return the appropriate cube texture type.
|
|
51
51
|
*
|
|
52
52
|
* @param {NodeBuilder} builder - The current node builder.
|
|
53
53
|
* @return {string} The input type.
|
|
54
54
|
*/
|
|
55
55
|
getInputType( /*builder*/ ) {
|
|
56
56
|
|
|
57
|
+
if ( this.value.isDepthTexture === true ) {
|
|
58
|
+
|
|
59
|
+
return 'cubeDepthTexture';
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
57
63
|
return 'cubeTexture';
|
|
58
64
|
|
|
59
65
|
}
|
|
@@ -105,6 +111,19 @@ class CubeTextureNode extends TextureNode {
|
|
|
105
111
|
|
|
106
112
|
const texture = this.value;
|
|
107
113
|
|
|
114
|
+
// Depth textures (shadow maps) - no environment rotation, Y flip for WebGPU
|
|
115
|
+
if ( texture.isDepthTexture === true ) {
|
|
116
|
+
|
|
117
|
+
if ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem ) {
|
|
118
|
+
|
|
119
|
+
return vec3( uvNode.x, uvNode.y.negate(), uvNode.z );
|
|
120
|
+
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return uvNode;
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
108
127
|
if ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem || ! texture.isRenderTargetTexture ) {
|
|
109
128
|
|
|
110
129
|
uvNode = vec3( uvNode.x.negate(), uvNode.yz );
|
|
@@ -2,10 +2,11 @@ import Node from '../core/Node.js';
|
|
|
2
2
|
import { varyingProperty } from '../core/PropertyNode.js';
|
|
3
3
|
import { instancedBufferAttribute, instancedDynamicBufferAttribute } from './BufferAttributeNode.js';
|
|
4
4
|
import { normalLocal, transformNormal } from './Normal.js';
|
|
5
|
-
import { positionLocal } from './Position.js';
|
|
5
|
+
import { positionLocal, positionPrevious } from './Position.js';
|
|
6
6
|
import { nodeProxy, vec3, mat4 } from '../tsl/TSLBase.js';
|
|
7
7
|
import { NodeUpdateType } from '../core/constants.js';
|
|
8
8
|
import { buffer } from '../accessors/BufferNode.js';
|
|
9
|
+
import { storage } from './StorageBufferNode.js';
|
|
9
10
|
import { instanceIndex } from '../core/IndexNode.js';
|
|
10
11
|
|
|
11
12
|
import { InstancedInterleavedBuffer } from '../../core/InstancedInterleavedBuffer.js';
|
|
@@ -32,8 +33,8 @@ class InstanceNode extends Node {
|
|
|
32
33
|
* Constructs a new instance node.
|
|
33
34
|
*
|
|
34
35
|
* @param {number} count - The number of instances.
|
|
35
|
-
* @param {InstancedBufferAttribute} instanceMatrix - Instanced buffer attribute representing the instance transformations.
|
|
36
|
-
* @param {?InstancedBufferAttribute} instanceColor - Instanced buffer attribute representing the instance colors.
|
|
36
|
+
* @param {InstancedBufferAttribute|StorageInstancedBufferAttribute} instanceMatrix - Instanced buffer attribute representing the instance transformations.
|
|
37
|
+
* @param {?InstancedBufferAttribute|StorageInstancedBufferAttribute} instanceColor - Instanced buffer attribute representing the instance colors.
|
|
37
38
|
*/
|
|
38
39
|
constructor( count, instanceMatrix, instanceColor = null ) {
|
|
39
40
|
|
|
@@ -98,6 +99,40 @@ class InstanceNode extends Node {
|
|
|
98
99
|
*/
|
|
99
100
|
this.bufferColor = null;
|
|
100
101
|
|
|
102
|
+
/**
|
|
103
|
+
* The previous instance matrices. Required for computing motion vectors.
|
|
104
|
+
*
|
|
105
|
+
* @type {?Node}
|
|
106
|
+
* @default null
|
|
107
|
+
*/
|
|
108
|
+
this.previousInstanceMatrixNode = null;
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Tracks whether the matrix data is provided via a storage buffer.
|
|
114
|
+
*
|
|
115
|
+
* @type {boolean}
|
|
116
|
+
*/
|
|
117
|
+
get isStorageMatrix() {
|
|
118
|
+
|
|
119
|
+
const { instanceMatrix } = this;
|
|
120
|
+
|
|
121
|
+
return instanceMatrix && instanceMatrix.isStorageInstancedBufferAttribute === true;
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Tracks whether the color data is provided via a storage buffer.
|
|
127
|
+
*
|
|
128
|
+
* @type {boolean}
|
|
129
|
+
*/
|
|
130
|
+
get isStorageColor() {
|
|
131
|
+
|
|
132
|
+
const { instanceColor } = this;
|
|
133
|
+
|
|
134
|
+
return instanceColor && instanceColor.isStorageInstancedBufferAttribute === true;
|
|
135
|
+
|
|
101
136
|
}
|
|
102
137
|
|
|
103
138
|
/**
|
|
@@ -109,53 +144,39 @@ class InstanceNode extends Node {
|
|
|
109
144
|
*/
|
|
110
145
|
setup( builder ) {
|
|
111
146
|
|
|
112
|
-
const { instanceMatrix, instanceColor } = this;
|
|
113
|
-
|
|
114
|
-
const { count } = instanceMatrix;
|
|
115
|
-
|
|
116
147
|
let { instanceMatrixNode, instanceColorNode } = this;
|
|
117
148
|
|
|
118
|
-
|
|
149
|
+
// instance matrix
|
|
119
150
|
|
|
120
|
-
|
|
151
|
+
if ( instanceMatrixNode === null ) {
|
|
121
152
|
|
|
122
|
-
|
|
153
|
+
instanceMatrixNode = this._createInstanceMatrixNode( true, builder );
|
|
123
154
|
|
|
124
|
-
|
|
155
|
+
this.instanceMatrixNode = instanceMatrixNode;
|
|
125
156
|
|
|
126
|
-
|
|
157
|
+
}
|
|
127
158
|
|
|
128
|
-
|
|
159
|
+
// instance color
|
|
129
160
|
|
|
130
|
-
|
|
161
|
+
const { instanceColor, isStorageColor } = this;
|
|
131
162
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const instanceBuffers = [
|
|
135
|
-
// F.Signature -> bufferAttribute( array, type, stride, offset )
|
|
136
|
-
bufferFn( buffer, 'vec4', 16, 0 ),
|
|
137
|
-
bufferFn( buffer, 'vec4', 16, 4 ),
|
|
138
|
-
bufferFn( buffer, 'vec4', 16, 8 ),
|
|
139
|
-
bufferFn( buffer, 'vec4', 16, 12 )
|
|
140
|
-
];
|
|
163
|
+
if ( instanceColor && instanceColorNode === null ) {
|
|
141
164
|
|
|
142
|
-
|
|
165
|
+
if ( isStorageColor ) {
|
|
143
166
|
|
|
144
|
-
|
|
167
|
+
instanceColorNode = storage( instanceColor, 'vec3', Math.max( instanceColor.count, 1 ) ).element( instanceIndex );
|
|
145
168
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}
|
|
169
|
+
} else {
|
|
149
170
|
|
|
150
|
-
|
|
171
|
+
const bufferAttribute = new InstancedBufferAttribute( instanceColor.array, 3 );
|
|
151
172
|
|
|
152
|
-
|
|
173
|
+
const bufferFn = instanceColor.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
|
|
153
174
|
|
|
154
|
-
|
|
175
|
+
this.bufferColor = bufferAttribute;
|
|
155
176
|
|
|
156
|
-
|
|
177
|
+
instanceColorNode = vec3( bufferFn( bufferAttribute, 'vec3', 3, 0 ) );
|
|
157
178
|
|
|
158
|
-
|
|
179
|
+
}
|
|
159
180
|
|
|
160
181
|
this.instanceColorNode = instanceColorNode;
|
|
161
182
|
|
|
@@ -166,6 +187,12 @@ class InstanceNode extends Node {
|
|
|
166
187
|
const instancePosition = instanceMatrixNode.mul( positionLocal ).xyz;
|
|
167
188
|
positionLocal.assign( instancePosition );
|
|
168
189
|
|
|
190
|
+
if ( builder.needsPreviousData() ) {
|
|
191
|
+
|
|
192
|
+
positionPrevious.assign( this.getPreviousInstancedPosition( builder ) );
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
169
196
|
// NORMAL
|
|
170
197
|
|
|
171
198
|
if ( builder.hasGeometryAttribute( 'normal' ) ) {
|
|
@@ -189,22 +216,20 @@ class InstanceNode extends Node {
|
|
|
189
216
|
}
|
|
190
217
|
|
|
191
218
|
/**
|
|
192
|
-
* Checks if the internal buffers
|
|
219
|
+
* Checks if the internal buffers require an update.
|
|
193
220
|
*
|
|
194
221
|
* @param {NodeFrame} frame - The current node frame.
|
|
195
222
|
*/
|
|
196
|
-
update(
|
|
197
|
-
|
|
198
|
-
if ( this.buffer !== null ) {
|
|
223
|
+
update( frame ) {
|
|
199
224
|
|
|
200
|
-
|
|
225
|
+
if ( this.buffer !== null && this.isStorageMatrix !== true ) {
|
|
201
226
|
|
|
202
227
|
this.buffer.clearUpdateRanges();
|
|
203
228
|
this.buffer.updateRanges.push( ... this.instanceMatrix.updateRanges );
|
|
204
229
|
|
|
205
230
|
// update version if necessary
|
|
206
231
|
|
|
207
|
-
if ( this.instanceMatrix.
|
|
232
|
+
if ( this.instanceMatrix.version !== this.buffer.version ) {
|
|
208
233
|
|
|
209
234
|
this.buffer.version = this.instanceMatrix.version;
|
|
210
235
|
|
|
@@ -212,12 +237,12 @@ class InstanceNode extends Node {
|
|
|
212
237
|
|
|
213
238
|
}
|
|
214
239
|
|
|
215
|
-
if ( this.instanceColor && this.bufferColor !== null ) {
|
|
240
|
+
if ( this.instanceColor && this.bufferColor !== null && this.isStorageColor !== true ) {
|
|
216
241
|
|
|
217
242
|
this.bufferColor.clearUpdateRanges();
|
|
218
243
|
this.bufferColor.updateRanges.push( ... this.instanceColor.updateRanges );
|
|
219
244
|
|
|
220
|
-
if ( this.instanceColor.
|
|
245
|
+
if ( this.instanceColor.version !== this.bufferColor.version ) {
|
|
221
246
|
|
|
222
247
|
this.bufferColor.version = this.instanceColor.version;
|
|
223
248
|
|
|
@@ -225,6 +250,86 @@ class InstanceNode extends Node {
|
|
|
225
250
|
|
|
226
251
|
}
|
|
227
252
|
|
|
253
|
+
if ( this.previousInstanceMatrixNode !== null ) {
|
|
254
|
+
|
|
255
|
+
frame.object.previousInstanceMatrix.array.set( this.instanceMatrix.array );
|
|
256
|
+
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Computes the transformed/instanced vertex position of the previous frame.
|
|
263
|
+
*
|
|
264
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
265
|
+
* @return {Node<vec3>} The instanced position from the previous frame.
|
|
266
|
+
*/
|
|
267
|
+
getPreviousInstancedPosition( builder ) {
|
|
268
|
+
|
|
269
|
+
const instancedMesh = builder.object;
|
|
270
|
+
|
|
271
|
+
if ( this.previousInstanceMatrixNode === null ) {
|
|
272
|
+
|
|
273
|
+
instancedMesh.previousInstanceMatrix = this.instanceMatrix.clone();
|
|
274
|
+
|
|
275
|
+
this.previousInstanceMatrixNode = this._createInstanceMatrixNode( false, builder );
|
|
276
|
+
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return this.previousInstanceMatrixNode.mul( positionPrevious ).xyz;
|
|
280
|
+
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Creates a node representing the instance matrix data.
|
|
285
|
+
*
|
|
286
|
+
* @private
|
|
287
|
+
* @param {boolean} assignBuffer - Whether the created interleaved buffer should be assigned to the `buffer` member or not.
|
|
288
|
+
* @param {NodeBuilder} builder - A reference to the current node builder.
|
|
289
|
+
* @return {Node} The instance matrix node.
|
|
290
|
+
*/
|
|
291
|
+
_createInstanceMatrixNode( assignBuffer, builder ) {
|
|
292
|
+
|
|
293
|
+
let instanceMatrixNode;
|
|
294
|
+
|
|
295
|
+
const { instanceMatrix } = this;
|
|
296
|
+
const { count } = instanceMatrix;
|
|
297
|
+
|
|
298
|
+
if ( this.isStorageMatrix ) {
|
|
299
|
+
|
|
300
|
+
instanceMatrixNode = storage( instanceMatrix, 'mat4', Math.max( count, 1 ) ).element( instanceIndex );
|
|
301
|
+
|
|
302
|
+
} else {
|
|
303
|
+
|
|
304
|
+
const uniformBufferSize = count * 16 * 4; // count * 16 components * 4 bytes (float)
|
|
305
|
+
|
|
306
|
+
if ( uniformBufferSize <= builder.getUniformBufferLimit() ) {
|
|
307
|
+
|
|
308
|
+
instanceMatrixNode = buffer( instanceMatrix.array, 'mat4', Math.max( count, 1 ) ).element( instanceIndex );
|
|
309
|
+
|
|
310
|
+
} else {
|
|
311
|
+
|
|
312
|
+
const interleaved = new InstancedInterleavedBuffer( instanceMatrix.array, 16, 1 );
|
|
313
|
+
|
|
314
|
+
if ( assignBuffer === true ) this.buffer = interleaved;
|
|
315
|
+
|
|
316
|
+
const bufferFn = instanceMatrix.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
|
|
317
|
+
|
|
318
|
+
const instanceBuffers = [
|
|
319
|
+
bufferFn( interleaved, 'vec4', 16, 0 ),
|
|
320
|
+
bufferFn( interleaved, 'vec4', 16, 4 ),
|
|
321
|
+
bufferFn( interleaved, 'vec4', 16, 8 ),
|
|
322
|
+
bufferFn( interleaved, 'vec4', 16, 12 )
|
|
323
|
+
];
|
|
324
|
+
|
|
325
|
+
instanceMatrixNode = mat4( ...instanceBuffers );
|
|
326
|
+
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return instanceMatrixNode;
|
|
332
|
+
|
|
228
333
|
}
|
|
229
334
|
|
|
230
335
|
}
|
|
@@ -237,8 +342,8 @@ export default InstanceNode;
|
|
|
237
342
|
* @tsl
|
|
238
343
|
* @function
|
|
239
344
|
* @param {number} count - The number of instances.
|
|
240
|
-
* @param {InstancedBufferAttribute} instanceMatrix - Instanced buffer attribute representing the instance transformations.
|
|
241
|
-
* @param {?InstancedBufferAttribute} instanceColor - Instanced buffer attribute representing the instance colors.
|
|
345
|
+
* @param {InstancedBufferAttribute|StorageInstancedBufferAttribute} instanceMatrix - Instanced buffer attribute representing the instance transformations.
|
|
346
|
+
* @param {?InstancedBufferAttribute|StorageInstancedBufferAttribute} instanceColor - Instanced buffer attribute representing the instance colors.
|
|
242
347
|
* @returns {InstanceNode}
|
|
243
348
|
*/
|
|
244
349
|
export const instance = /*@__PURE__*/ nodeProxy( InstanceNode ).setParameterLength( 2, 3 );
|