@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,5 @@
|
|
|
1
|
-
import { Color } from 'three';
|
|
2
|
-
import { attribute, cameraProjectionMatrix, dot, float, Fn, modelViewMatrix, modelViewProjection,
|
|
1
|
+
import { Color, NodeMaterial } from 'three/webgpu';
|
|
2
|
+
import { attribute, cameraProjectionMatrix, dot, float, Fn, modelViewMatrix, modelViewProjection, normalize, positionGeometry, sign, uniform, varyingProperty, vec2, vec4 } from 'three/tsl';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* A special line material for meshes loaded via {@link LDrawLoader}.
|
|
@@ -297,7 +297,7 @@ const woodParams = {
|
|
|
297
297
|
teak: {
|
|
298
298
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
299
299
|
centerSize: 1.11, largeWarpScale: 0.32, largeGrainStretch: 0.24, smallWarpStrength: 0.059,
|
|
300
|
-
smallWarpScale: 2, fineWarpStrength: 0.006, fineWarpScale: 32.8, ringThickness: 1/34,
|
|
300
|
+
smallWarpScale: 2, fineWarpStrength: 0.006, fineWarpScale: 32.8, ringThickness: 1 / 34,
|
|
301
301
|
ringBias: 0.03, ringSizeVariance: 0.03, ringVarianceScale: 4.4, barkThickness: 0.3,
|
|
302
302
|
splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 910, cellSize: 0.1,
|
|
303
303
|
darkGrainColor: '#0c0504', lightGrainColor: '#926c50'
|
|
@@ -305,7 +305,7 @@ const woodParams = {
|
|
|
305
305
|
walnut: {
|
|
306
306
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
307
307
|
centerSize: 1.07, largeWarpScale: 0.42, largeGrainStretch: 0.34, smallWarpStrength: 0.016,
|
|
308
|
-
smallWarpScale: 10.3, fineWarpStrength: 0.028, fineWarpScale: 12.7, ringThickness: 1/32,
|
|
308
|
+
smallWarpScale: 10.3, fineWarpStrength: 0.028, fineWarpScale: 12.7, ringThickness: 1 / 32,
|
|
309
309
|
ringBias: 0.08, ringSizeVariance: 0.03, ringVarianceScale: 5.5, barkThickness: 0.98,
|
|
310
310
|
splotchScale: 1.84, splotchIntensity: 0.97, cellScale: 710, cellSize: 0.31,
|
|
311
311
|
darkGrainColor: '#311e13', lightGrainColor: '#523424'
|
|
@@ -313,7 +313,7 @@ const woodParams = {
|
|
|
313
313
|
white_oak: {
|
|
314
314
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
315
315
|
centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.21, smallWarpStrength: 0.034,
|
|
316
|
-
smallWarpScale: 2.44, fineWarpStrength: 0.01, fineWarpScale: 14.3, ringThickness: 1/34,
|
|
316
|
+
smallWarpScale: 2.44, fineWarpStrength: 0.01, fineWarpScale: 14.3, ringThickness: 1 / 34,
|
|
317
317
|
ringBias: 0.82, ringSizeVariance: 0.16, ringVarianceScale: 1.4, barkThickness: 0.7,
|
|
318
318
|
splotchScale: 0.2, splotchIntensity: 0.541, cellScale: 800, cellSize: 0.28,
|
|
319
319
|
darkGrainColor: '#8b4c21', lightGrainColor: '#c57e43'
|
|
@@ -321,7 +321,7 @@ const woodParams = {
|
|
|
321
321
|
pine: {
|
|
322
322
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
323
323
|
centerSize: 1.23, largeWarpScale: 0.21, largeGrainStretch: 0.18, smallWarpStrength: 0.041,
|
|
324
|
-
smallWarpScale: 2.44, fineWarpStrength: 0.006, fineWarpScale: 23.2, ringThickness: 1/24,
|
|
324
|
+
smallWarpScale: 2.44, fineWarpStrength: 0.006, fineWarpScale: 23.2, ringThickness: 1 / 24,
|
|
325
325
|
ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 5, barkThickness: 0.35,
|
|
326
326
|
splotchScale: 0.51, splotchIntensity: 3.32, cellScale: 1480, cellSize: 0.07,
|
|
327
327
|
darkGrainColor: '#c58355', lightGrainColor: '#d19d61'
|
|
@@ -329,7 +329,7 @@ const woodParams = {
|
|
|
329
329
|
poplar: {
|
|
330
330
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
331
331
|
centerSize: 1.43, largeWarpScale: 0.33, largeGrainStretch: 0.18, smallWarpStrength: 0.04,
|
|
332
|
-
smallWarpScale: 4.3, fineWarpStrength: 0.004, fineWarpScale: 33.6, ringThickness: 1/37,
|
|
332
|
+
smallWarpScale: 4.3, fineWarpStrength: 0.004, fineWarpScale: 33.6, ringThickness: 1 / 37,
|
|
333
333
|
ringBias: 0.07, ringSizeVariance: 0.03, ringVarianceScale: 3.8, barkThickness: 0.3,
|
|
334
334
|
splotchScale: 1.92, splotchIntensity: 0.71, cellScale: 830, cellSize: 0.04,
|
|
335
335
|
darkGrainColor: '#716347', lightGrainColor: '#998966'
|
|
@@ -337,7 +337,7 @@ const woodParams = {
|
|
|
337
337
|
maple: {
|
|
338
338
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
339
339
|
centerSize: 1.4, largeWarpScale: 0.38, largeGrainStretch: 0.25, smallWarpStrength: 0.067,
|
|
340
|
-
smallWarpScale: 2.5, fineWarpStrength: 0.005, fineWarpScale: 33.6, ringThickness: 1/35,
|
|
340
|
+
smallWarpScale: 2.5, fineWarpStrength: 0.005, fineWarpScale: 33.6, ringThickness: 1 / 35,
|
|
341
341
|
ringBias: 0.1, ringSizeVariance: 0.07, ringVarianceScale: 4.6, barkThickness: 0.61,
|
|
342
342
|
splotchScale: 0.46, splotchIntensity: 1.49, cellScale: 800, cellSize: 0.03,
|
|
343
343
|
darkGrainColor: '#b08969', lightGrainColor: '#bc9d7d'
|
|
@@ -345,7 +345,7 @@ const woodParams = {
|
|
|
345
345
|
red_oak: {
|
|
346
346
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
347
347
|
centerSize: 1.21, largeWarpScale: 0.24, largeGrainStretch: 0.25, smallWarpStrength: 0.044,
|
|
348
|
-
smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 14.5, ringThickness: 1/34,
|
|
348
|
+
smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 14.5, ringThickness: 1 / 34,
|
|
349
349
|
ringBias: 0.92, ringSizeVariance: 0.03, ringVarianceScale: 5.6, barkThickness: 1.01,
|
|
350
350
|
splotchScale: 0.28, splotchIntensity: 3.48, cellScale: 800, cellSize: 0.25,
|
|
351
351
|
darkGrainColor: '#af613b', lightGrainColor: '#e0a27a'
|
|
@@ -353,7 +353,7 @@ const woodParams = {
|
|
|
353
353
|
cherry: {
|
|
354
354
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
355
355
|
centerSize: 1.33, largeWarpScale: 0.11, largeGrainStretch: 0.33, smallWarpStrength: 0.024,
|
|
356
|
-
smallWarpScale: 2.48, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/36,
|
|
356
|
+
smallWarpScale: 2.48, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1 / 36,
|
|
357
357
|
ringBias: 0.02, ringSizeVariance: 0.04, ringVarianceScale: 6.5, barkThickness: 0.09,
|
|
358
358
|
splotchScale: 1.27, splotchIntensity: 1.24, cellScale: 1530, cellSize: 0.15,
|
|
359
359
|
darkGrainColor: '#913f27', lightGrainColor: '#b45837'
|
|
@@ -361,7 +361,7 @@ const woodParams = {
|
|
|
361
361
|
cedar: {
|
|
362
362
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
363
363
|
centerSize: 1.11, largeWarpScale: 0.39, largeGrainStretch: 0.12, smallWarpStrength: 0.061,
|
|
364
|
-
smallWarpScale: 1.9, fineWarpStrength: 0.006, fineWarpScale: 4.8, ringThickness: 1/25,
|
|
364
|
+
smallWarpScale: 1.9, fineWarpStrength: 0.006, fineWarpScale: 4.8, ringThickness: 1 / 25,
|
|
365
365
|
ringBias: 0.01, ringSizeVariance: 0.07, ringVarianceScale: 6.7, barkThickness: 0.1,
|
|
366
366
|
splotchScale: 0.61, splotchIntensity: 2.54, cellScale: 630, cellSize: 0.19,
|
|
367
367
|
darkGrainColor: '#9a5b49', lightGrainColor: '#ae745e'
|
|
@@ -369,7 +369,7 @@ const woodParams = {
|
|
|
369
369
|
mahogany: {
|
|
370
370
|
transformationMatrix: new THREE.Matrix4().identity(),
|
|
371
371
|
centerSize: 1.25, largeWarpScale: 0.26, largeGrainStretch: 0.29, smallWarpStrength: 0.044,
|
|
372
|
-
smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1/38,
|
|
372
|
+
smallWarpScale: 2.54, fineWarpStrength: 0.01, fineWarpScale: 15.3, ringThickness: 1 / 38,
|
|
373
373
|
ringBias: 0.01, ringSizeVariance: 0.33, ringVarianceScale: 1.2, barkThickness: 0.07,
|
|
374
374
|
splotchScale: 0.77, splotchIntensity: 1.39, cellScale: 1400, cellSize: 0.23,
|
|
375
375
|
darkGrainColor: '#501d12', lightGrainColor: '#6d3722'
|
|
@@ -433,7 +433,7 @@ uniforms.lightGrainColor = TSL.uniform( new THREE.Color( params.lightGrainColor
|
|
|
433
433
|
uniforms.transformationMatrix = TSL.uniform( new THREE.Matrix4().copy( params.transformationMatrix ) ).onObjectUpdate( ( { material } ) => material.transformationMatrix );
|
|
434
434
|
|
|
435
435
|
const colorNode = wood(
|
|
436
|
-
uniforms.transformationMatrix.mul( TSL.vec4(TSL.positionLocal, 1) ).xyz,
|
|
436
|
+
uniforms.transformationMatrix.mul( TSL.vec4( TSL.positionLocal, 1 ) ).xyz,
|
|
437
437
|
uniforms.centerSize,
|
|
438
438
|
uniforms.largeWarpScale,
|
|
439
439
|
uniforms.largeGrainStretch,
|
|
@@ -17,8 +17,10 @@ const _point2 = new Vector3();
|
|
|
17
17
|
const _plane = new Plane();
|
|
18
18
|
const _line1 = new Line3();
|
|
19
19
|
const _line2 = new Line3();
|
|
20
|
+
const _box = new Box3();
|
|
20
21
|
const _sphere = new Sphere();
|
|
21
22
|
const _capsule = new Capsule();
|
|
23
|
+
const _center = new Vector3();
|
|
22
24
|
|
|
23
25
|
const _temp1 = new Vector3();
|
|
24
26
|
const _temp2 = new Vector3();
|
|
@@ -373,6 +375,61 @@ class Octree {
|
|
|
373
375
|
|
|
374
376
|
}
|
|
375
377
|
|
|
378
|
+
/**
|
|
379
|
+
* Computes the intersection between the given bounding box and triangle.
|
|
380
|
+
*
|
|
381
|
+
* @param {Box3} box - The bounding box to test.
|
|
382
|
+
* @param {Triangle} triangle - The triangle to test.
|
|
383
|
+
* @return {Object|false} The intersection object. If no intersection
|
|
384
|
+
* is detected, the method returns `false`.
|
|
385
|
+
*/
|
|
386
|
+
triangleBoxIntersect( box, triangle ) {
|
|
387
|
+
|
|
388
|
+
// cheap check
|
|
389
|
+
|
|
390
|
+
if ( Math.max( triangle.a.x, triangle.b.x, triangle.c.x ) < box.min.x ||
|
|
391
|
+
Math.min( triangle.a.x, triangle.b.x, triangle.c.x ) > box.max.x ||
|
|
392
|
+
Math.max( triangle.a.y, triangle.b.y, triangle.c.y ) < box.min.y ||
|
|
393
|
+
Math.min( triangle.a.y, triangle.b.y, triangle.c.y ) > box.max.y ||
|
|
394
|
+
Math.max( triangle.a.z, triangle.b.z, triangle.c.z ) < box.min.z ||
|
|
395
|
+
Math.min( triangle.a.z, triangle.b.z, triangle.c.z ) > box.max.z ) {
|
|
396
|
+
|
|
397
|
+
return false;
|
|
398
|
+
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// expensive check
|
|
402
|
+
|
|
403
|
+
if ( ! box.intersectsTriangle( triangle ) ) return false;
|
|
404
|
+
|
|
405
|
+
// there is an intersection, now compute collision data
|
|
406
|
+
|
|
407
|
+
triangle.getPlane( _plane );
|
|
408
|
+
|
|
409
|
+
// determine which corner of the box is "deepest" into the plane
|
|
410
|
+
|
|
411
|
+
_v1.x = ( _plane.normal.x > 0 ) ? box.min.x : box.max.x;
|
|
412
|
+
_v1.y = ( _plane.normal.y > 0 ) ? box.min.y : box.max.y;
|
|
413
|
+
_v1.z = ( _plane.normal.z > 0 ) ? box.min.z : box.max.z;
|
|
414
|
+
|
|
415
|
+
// Calculate the distance from the plane to that corner (the distance will be negative
|
|
416
|
+
// because of the intersection)
|
|
417
|
+
|
|
418
|
+
const distance = _plane.distanceToPoint( _v1 );
|
|
419
|
+
|
|
420
|
+
const intersection = {
|
|
421
|
+
depth: - distance, // Flip sign so depth is positive
|
|
422
|
+
normal: _plane.normal.clone(),
|
|
423
|
+
point: _v1.clone()
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
// project the point onto the triangle surface
|
|
427
|
+
intersection.point.addScaledVector( intersection.normal, distance );
|
|
428
|
+
|
|
429
|
+
return intersection;
|
|
430
|
+
|
|
431
|
+
}
|
|
432
|
+
|
|
376
433
|
/**
|
|
377
434
|
* Computes the intersection between the given sphere and triangle.
|
|
378
435
|
*
|
|
@@ -455,6 +512,38 @@ class Octree {
|
|
|
455
512
|
|
|
456
513
|
}
|
|
457
514
|
|
|
515
|
+
/**
|
|
516
|
+
* Computes the triangles that potentially intersect with the given bounding box.
|
|
517
|
+
*
|
|
518
|
+
* @param {Box3} box - The bounding box.
|
|
519
|
+
* @param {Array<Triangle>} triangles - The target array that holds the triangles.
|
|
520
|
+
*/
|
|
521
|
+
getBoxTriangles( box, triangles ) {
|
|
522
|
+
|
|
523
|
+
for ( let i = 0; i < this.subTrees.length; i ++ ) {
|
|
524
|
+
|
|
525
|
+
const subTree = this.subTrees[ i ];
|
|
526
|
+
|
|
527
|
+
if ( ! box.intersectsBox( subTree.box ) ) continue;
|
|
528
|
+
|
|
529
|
+
if ( subTree.triangles.length > 0 ) {
|
|
530
|
+
|
|
531
|
+
for ( let j = 0; j < subTree.triangles.length; j ++ ) {
|
|
532
|
+
|
|
533
|
+
if ( triangles.indexOf( subTree.triangles[ j ] ) === - 1 ) triangles.push( subTree.triangles[ j ] );
|
|
534
|
+
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
} else {
|
|
538
|
+
|
|
539
|
+
subTree.getBoxTriangles( box, triangles );
|
|
540
|
+
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
}
|
|
546
|
+
|
|
458
547
|
/**
|
|
459
548
|
* Computes the triangles that potentially intersect with the given capsule.
|
|
460
549
|
*
|
|
@@ -487,6 +576,47 @@ class Octree {
|
|
|
487
576
|
|
|
488
577
|
}
|
|
489
578
|
|
|
579
|
+
/**
|
|
580
|
+
* Performs a bounding box intersection test with this Octree.
|
|
581
|
+
*
|
|
582
|
+
* @param {Box3} box - The bounding box to test.
|
|
583
|
+
* @return {Object|boolean} The intersection object. If no intersection
|
|
584
|
+
* is detected, the method returns `false`.
|
|
585
|
+
*/
|
|
586
|
+
boxIntersect( box ) {
|
|
587
|
+
|
|
588
|
+
_box.copy( box );
|
|
589
|
+
|
|
590
|
+
const triangles = [];
|
|
591
|
+
let result, hit = false;
|
|
592
|
+
|
|
593
|
+
this.getBoxTriangles( box, triangles );
|
|
594
|
+
|
|
595
|
+
for ( let i = 0; i < triangles.length; i ++ ) {
|
|
596
|
+
|
|
597
|
+
if ( result = this.triangleBoxIntersect( _box, triangles[ i ] ) ) {
|
|
598
|
+
|
|
599
|
+
hit = true;
|
|
600
|
+
|
|
601
|
+
_box.translate( result.normal.multiplyScalar( result.depth ) );
|
|
602
|
+
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
if ( hit ) {
|
|
608
|
+
|
|
609
|
+
const collisionVector = _box.getCenter( _center ).sub( box.getCenter( _v1 ) );
|
|
610
|
+
const depth = collisionVector.length();
|
|
611
|
+
|
|
612
|
+
return { normal: collisionVector.normalize(), depth: depth };
|
|
613
|
+
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
return false;
|
|
617
|
+
|
|
618
|
+
}
|
|
619
|
+
|
|
490
620
|
/**
|
|
491
621
|
* Performs a bounding sphere intersection test with this Octree.
|
|
492
622
|
*
|
|
@@ -558,7 +688,7 @@ class Octree {
|
|
|
558
688
|
|
|
559
689
|
if ( hit ) {
|
|
560
690
|
|
|
561
|
-
const collisionVector = _capsule.getCenter(
|
|
691
|
+
const collisionVector = _capsule.getCenter( _center ).sub( capsule.getCenter( _v1 ) );
|
|
562
692
|
const depth = collisionVector.length();
|
|
563
693
|
|
|
564
694
|
return { normal: collisionVector.normalize(), depth: depth };
|
|
@@ -215,7 +215,7 @@ class LensflareMesh extends Mesh {
|
|
|
215
215
|
|
|
216
216
|
renderer.getViewport( viewport );
|
|
217
217
|
|
|
218
|
-
viewport.multiplyScalar(
|
|
218
|
+
viewport.multiplyScalar( renderer.getPixelRatio() ).floor();
|
|
219
219
|
|
|
220
220
|
const renderTarget = renderer.getRenderTarget();
|
|
221
221
|
const type = ( renderTarget !== null ) ? renderTarget.texture.type : UnsignedByteType;
|
|
@@ -72,7 +72,13 @@ Sky.SkyShader = {
|
|
|
72
72
|
'mieCoefficient': { value: 0.005 },
|
|
73
73
|
'mieDirectionalG': { value: 0.8 },
|
|
74
74
|
'sunPosition': { value: new Vector3() },
|
|
75
|
-
'up': { value: new Vector3( 0, 1, 0 ) }
|
|
75
|
+
'up': { value: new Vector3( 0, 1, 0 ) },
|
|
76
|
+
'cloudScale': { value: 0.0002 },
|
|
77
|
+
'cloudSpeed': { value: 0.0001 },
|
|
78
|
+
'cloudCoverage': { value: 0.4 },
|
|
79
|
+
'cloudDensity': { value: 0.4 },
|
|
80
|
+
'cloudElevation': { value: 0.5 },
|
|
81
|
+
'time': { value: 0.0 }
|
|
76
82
|
},
|
|
77
83
|
|
|
78
84
|
vertexShader: /* glsl */`
|
|
@@ -150,13 +156,45 @@ Sky.SkyShader = {
|
|
|
150
156
|
fragmentShader: /* glsl */`
|
|
151
157
|
varying vec3 vWorldPosition;
|
|
152
158
|
varying vec3 vSunDirection;
|
|
153
|
-
varying float vSunfade;
|
|
154
159
|
varying vec3 vBetaR;
|
|
155
160
|
varying vec3 vBetaM;
|
|
156
161
|
varying float vSunE;
|
|
157
162
|
|
|
158
163
|
uniform float mieDirectionalG;
|
|
159
164
|
uniform vec3 up;
|
|
165
|
+
uniform float cloudScale;
|
|
166
|
+
uniform float cloudSpeed;
|
|
167
|
+
uniform float cloudCoverage;
|
|
168
|
+
uniform float cloudDensity;
|
|
169
|
+
uniform float cloudElevation;
|
|
170
|
+
uniform float time;
|
|
171
|
+
|
|
172
|
+
// Cloud noise functions
|
|
173
|
+
float hash( vec2 p ) {
|
|
174
|
+
return fract( sin( dot( p, vec2( 127.1, 311.7 ) ) ) * 43758.5453123 );
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
float noise( vec2 p ) {
|
|
178
|
+
vec2 i = floor( p );
|
|
179
|
+
vec2 f = fract( p );
|
|
180
|
+
f = f * f * ( 3.0 - 2.0 * f );
|
|
181
|
+
float a = hash( i );
|
|
182
|
+
float b = hash( i + vec2( 1.0, 0.0 ) );
|
|
183
|
+
float c = hash( i + vec2( 0.0, 1.0 ) );
|
|
184
|
+
float d = hash( i + vec2( 1.0, 1.0 ) );
|
|
185
|
+
return mix( mix( a, b, f.x ), mix( c, d, f.x ), f.y );
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
float fbm( vec2 p ) {
|
|
189
|
+
float value = 0.0;
|
|
190
|
+
float amplitude = 0.5;
|
|
191
|
+
for ( int i = 0; i < 5; i ++ ) {
|
|
192
|
+
value += amplitude * noise( p );
|
|
193
|
+
p *= 2.0;
|
|
194
|
+
amplitude *= 0.5;
|
|
195
|
+
}
|
|
196
|
+
return value;
|
|
197
|
+
}
|
|
160
198
|
|
|
161
199
|
// constants for atmospheric scattering
|
|
162
200
|
const float pi = 3.141592653589793238462643383279502884197169;
|
|
@@ -223,9 +261,43 @@ Sky.SkyShader = {
|
|
|
223
261
|
|
|
224
262
|
vec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );
|
|
225
263
|
|
|
226
|
-
|
|
264
|
+
// Clouds
|
|
265
|
+
if ( direction.y > 0.0 && cloudCoverage > 0.0 ) {
|
|
266
|
+
|
|
267
|
+
// Project to cloud plane (higher elevation = clouds appear lower/closer)
|
|
268
|
+
float elevation = mix( 1.0, 0.1, cloudElevation );
|
|
269
|
+
vec2 cloudUV = direction.xz / ( direction.y * elevation );
|
|
270
|
+
cloudUV *= cloudScale;
|
|
271
|
+
cloudUV += time * cloudSpeed;
|
|
272
|
+
|
|
273
|
+
// Multi-octave noise for fluffy clouds
|
|
274
|
+
float cloudNoise = fbm( cloudUV * 1000.0 );
|
|
275
|
+
cloudNoise += 0.5 * fbm( cloudUV * 2000.0 + 3.7 );
|
|
276
|
+
cloudNoise = cloudNoise * 0.5 + 0.5;
|
|
277
|
+
|
|
278
|
+
// Apply coverage threshold
|
|
279
|
+
float cloudMask = smoothstep( 1.0 - cloudCoverage, 1.0 - cloudCoverage + 0.3, cloudNoise );
|
|
280
|
+
|
|
281
|
+
// Fade clouds near horizon (adjusted by elevation)
|
|
282
|
+
float horizonFade = smoothstep( 0.0, 0.1 + 0.2 * cloudElevation, direction.y );
|
|
283
|
+
cloudMask *= horizonFade;
|
|
284
|
+
|
|
285
|
+
// Cloud lighting based on sun position
|
|
286
|
+
float sunInfluence = dot( direction, vSunDirection ) * 0.5 + 0.5;
|
|
287
|
+
float daylight = max( 0.0, vSunDirection.y * 2.0 );
|
|
288
|
+
|
|
289
|
+
// Base cloud color affected by atmosphere
|
|
290
|
+
vec3 atmosphereColor = Lin * 0.04;
|
|
291
|
+
vec3 cloudColor = mix( vec3( 0.3 ), vec3( 1.0 ), daylight );
|
|
292
|
+
cloudColor = mix( cloudColor, atmosphereColor + vec3( 1.0 ), sunInfluence * 0.5 );
|
|
293
|
+
cloudColor *= vSunE * 0.00002;
|
|
294
|
+
|
|
295
|
+
// Blend clouds with sky
|
|
296
|
+
texColor = mix( texColor, cloudColor, cloudMask * cloudDensity );
|
|
297
|
+
|
|
298
|
+
}
|
|
227
299
|
|
|
228
|
-
gl_FragColor = vec4(
|
|
300
|
+
gl_FragColor = vec4( texColor, 1.0 );
|
|
229
301
|
|
|
230
302
|
#include <tonemapping_fragment>
|
|
231
303
|
#include <colorspace_fragment>
|
|
@@ -6,14 +6,14 @@ import {
|
|
|
6
6
|
NodeMaterial
|
|
7
7
|
} from 'three/webgpu';
|
|
8
8
|
|
|
9
|
-
import { Fn, float, vec3, acos, add, mul, clamp, cos, dot, exp, max, mix, modelViewProjection, normalize, positionWorld, pow, smoothstep, sub, varyingProperty, vec4, uniform, cameraPosition } from 'three/tsl';
|
|
9
|
+
import { Fn, float, vec2, vec3, acos, add, mul, clamp, cos, dot, exp, max, mix, modelViewProjection, normalize, positionWorld, pow, smoothstep, sub, varyingProperty, vec4, uniform, cameraPosition, fract, floor, sin, time, Loop, If } from 'three/tsl';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Represents a skydome for scene backgrounds. Based on [A Practical Analytic Model for Daylight](https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight)
|
|
13
13
|
* aka The Preetham Model, the de facto standard for analytical skydomes.
|
|
14
14
|
*
|
|
15
|
-
* Note that this class can only be used with {@link
|
|
16
|
-
* When using {@link
|
|
15
|
+
* Note that this class can only be used with {@link WebGPURenderer}.
|
|
16
|
+
* When using {@link WebGLRenderer}, use {@link Sky}.
|
|
17
17
|
*
|
|
18
18
|
* More references:
|
|
19
19
|
*
|
|
@@ -82,6 +82,51 @@ class SkyMesh extends Mesh {
|
|
|
82
82
|
*/
|
|
83
83
|
this.upUniform = uniform( new Vector3( 0, 1, 0 ) );
|
|
84
84
|
|
|
85
|
+
/**
|
|
86
|
+
* The cloud scale uniform.
|
|
87
|
+
*
|
|
88
|
+
* @type {UniformNode<float>}
|
|
89
|
+
*/
|
|
90
|
+
this.cloudScale = uniform( 0.0002 );
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The cloud speed uniform.
|
|
94
|
+
*
|
|
95
|
+
* @type {UniformNode<float>}
|
|
96
|
+
*/
|
|
97
|
+
this.cloudSpeed = uniform( 0.0001 );
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The cloud coverage uniform.
|
|
101
|
+
*
|
|
102
|
+
* @type {UniformNode<float>}
|
|
103
|
+
*/
|
|
104
|
+
this.cloudCoverage = uniform( 0.4 );
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The cloud density uniform.
|
|
108
|
+
*
|
|
109
|
+
* @type {UniformNode<float>}
|
|
110
|
+
*/
|
|
111
|
+
this.cloudDensity = uniform( 0.4 );
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The cloud elevation uniform.
|
|
115
|
+
*
|
|
116
|
+
* @type {UniformNode<float>}
|
|
117
|
+
*/
|
|
118
|
+
this.cloudElevation = uniform( 0.5 );
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* This flag can be used for type testing.
|
|
122
|
+
*
|
|
123
|
+
* @type {boolean}
|
|
124
|
+
* @readonly
|
|
125
|
+
* @default true
|
|
126
|
+
* @deprecated Use isSkyMesh instead.
|
|
127
|
+
*/
|
|
128
|
+
this.isSky = true; // @deprecated, r182
|
|
129
|
+
|
|
85
130
|
/**
|
|
86
131
|
* This flag can be used for type testing.
|
|
87
132
|
*
|
|
@@ -89,13 +134,12 @@ class SkyMesh extends Mesh {
|
|
|
89
134
|
* @readonly
|
|
90
135
|
* @default true
|
|
91
136
|
*/
|
|
92
|
-
this.
|
|
137
|
+
this.isSkyMesh = true;
|
|
93
138
|
|
|
94
139
|
// Varyings
|
|
95
140
|
|
|
96
141
|
const vSunDirection = varyingProperty( 'vec3' );
|
|
97
142
|
const vSunE = varyingProperty( 'float' );
|
|
98
|
-
const vSunfade = varyingProperty( 'float' );
|
|
99
143
|
const vBetaR = varyingProperty( 'vec3' );
|
|
100
144
|
const vBetaM = varyingProperty( 'vec3' );
|
|
101
145
|
|
|
@@ -136,10 +180,9 @@ class SkyMesh extends Mesh {
|
|
|
136
180
|
const sunIntensity = EE.mul( max( 0.0, float( 1.0 ).sub( pow( e, cutoffAngle.sub( acos( zenithAngleCos ) ).div( steepness ).negate() ) ) ) );
|
|
137
181
|
vSunE.assign( sunIntensity );
|
|
138
182
|
|
|
139
|
-
//
|
|
183
|
+
// sun fade
|
|
140
184
|
|
|
141
185
|
const sunfade = float( 1.0 ).sub( clamp( float( 1.0 ).sub( exp( this.sunPosition.y.div( 450000.0 ) ) ), 0, 1 ) );
|
|
142
|
-
vSunfade.assign( sunfade );
|
|
143
186
|
|
|
144
187
|
// varying vBetaR
|
|
145
188
|
|
|
@@ -222,11 +265,85 @@ class SkyMesh extends Mesh {
|
|
|
222
265
|
const sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos.add( 0.00002 ), cosTheta );
|
|
223
266
|
L0.addAssign( vSunE.mul( 19000.0 ).mul( Fex ).mul( sundisk ) );
|
|
224
267
|
|
|
225
|
-
const texColor = add( Lin, L0 ).mul( 0.04 ).add( vec3( 0.0, 0.0003, 0.00075 ) );
|
|
268
|
+
const texColor = add( Lin, L0 ).mul( 0.04 ).add( vec3( 0.0, 0.0003, 0.00075 ) ).toVar();
|
|
269
|
+
|
|
270
|
+
// Cloud noise functions
|
|
271
|
+
const hash = Fn( ( [ p ] ) => {
|
|
272
|
+
|
|
273
|
+
return fract( sin( dot( p, vec2( 127.1, 311.7 ) ) ).mul( 43758.5453123 ) );
|
|
274
|
+
|
|
275
|
+
} );
|
|
276
|
+
|
|
277
|
+
const noise = Fn( ( [ p_immutable ] ) => {
|
|
278
|
+
|
|
279
|
+
const p = vec2( p_immutable ).toVar();
|
|
280
|
+
const i = floor( p );
|
|
281
|
+
const f = fract( p );
|
|
282
|
+
const ff = f.mul( f ).mul( sub( 3.0, f.mul( 2.0 ) ) );
|
|
283
|
+
|
|
284
|
+
const a = hash( i );
|
|
285
|
+
const b = hash( add( i, vec2( 1.0, 0.0 ) ) );
|
|
286
|
+
const c = hash( add( i, vec2( 0.0, 1.0 ) ) );
|
|
287
|
+
const d = hash( add( i, vec2( 1.0, 1.0 ) ) );
|
|
288
|
+
|
|
289
|
+
return mix( mix( a, b, ff.x ), mix( c, d, ff.x ), ff.y );
|
|
290
|
+
|
|
291
|
+
} );
|
|
292
|
+
|
|
293
|
+
const fbm = Fn( ( [ p_immutable ] ) => {
|
|
294
|
+
|
|
295
|
+
const p = vec2( p_immutable ).toVar();
|
|
296
|
+
const value = float( 0.0 ).toVar();
|
|
297
|
+
const amplitude = float( 0.5 ).toVar();
|
|
298
|
+
|
|
299
|
+
Loop( 5, () => {
|
|
300
|
+
|
|
301
|
+
value.addAssign( amplitude.mul( noise( p ) ) );
|
|
302
|
+
p.mulAssign( 2.0 );
|
|
303
|
+
amplitude.mulAssign( 0.5 );
|
|
304
|
+
|
|
305
|
+
} );
|
|
306
|
+
|
|
307
|
+
return value;
|
|
308
|
+
|
|
309
|
+
} );
|
|
310
|
+
|
|
311
|
+
// Clouds
|
|
312
|
+
If( direction.y.greaterThan( 0.0 ).and( this.cloudCoverage.greaterThan( 0.0 ) ), () => {
|
|
313
|
+
|
|
314
|
+
// Project to cloud plane (higher elevation = clouds appear lower/closer)
|
|
315
|
+
const elevation = mix( 1.0, 0.1, this.cloudElevation );
|
|
316
|
+
const cloudUV = direction.xz.div( direction.y.mul( elevation ) ).toVar();
|
|
317
|
+
cloudUV.mulAssign( this.cloudScale );
|
|
318
|
+
cloudUV.addAssign( time.mul( this.cloudSpeed ) );
|
|
319
|
+
|
|
320
|
+
// Multi-octave noise for fluffy clouds
|
|
321
|
+
const cloudNoise = fbm( cloudUV.mul( 1000.0 ) ).add( fbm( cloudUV.mul( 2000.0 ).add( 3.7 ) ).mul( 0.5 ) ).toVar();
|
|
322
|
+
cloudNoise.assign( cloudNoise.mul( 0.5 ).add( 0.5 ) );
|
|
323
|
+
|
|
324
|
+
// Apply coverage threshold
|
|
325
|
+
const cloudMask = smoothstep( sub( 1.0, this.cloudCoverage ), sub( 1.0, this.cloudCoverage ).add( 0.3 ), cloudNoise ).toVar();
|
|
326
|
+
|
|
327
|
+
// Fade clouds near horizon (adjusted by elevation)
|
|
328
|
+
const horizonFade = smoothstep( 0.0, add( 0.1, mul( 0.2, this.cloudElevation ) ), direction.y );
|
|
329
|
+
cloudMask.mulAssign( horizonFade );
|
|
330
|
+
|
|
331
|
+
// Cloud lighting based on sun position
|
|
332
|
+
const sunInfluence = dot( direction, vSunDirection ).mul( 0.5 ).add( 0.5 );
|
|
333
|
+
const daylight = max( 0.0, vSunDirection.y.mul( 2.0 ) );
|
|
334
|
+
|
|
335
|
+
// Base cloud color affected by atmosphere
|
|
336
|
+
const atmosphereColor = Lin.mul( 0.04 );
|
|
337
|
+
const cloudColor = mix( vec3( 0.3 ), vec3( 1.0 ), daylight ).toVar();
|
|
338
|
+
cloudColor.assign( mix( cloudColor, atmosphereColor.add( vec3( 1.0 ) ), sunInfluence.mul( 0.5 ) ) );
|
|
339
|
+
cloudColor.mulAssign( vSunE.mul( 0.00002 ) );
|
|
340
|
+
|
|
341
|
+
// Blend clouds with sky
|
|
342
|
+
texColor.assign( mix( texColor, cloudColor, cloudMask.mul( this.cloudDensity ) ) );
|
|
226
343
|
|
|
227
|
-
|
|
344
|
+
} );
|
|
228
345
|
|
|
229
|
-
return vec4(
|
|
346
|
+
return vec4( texColor, 1.0 );
|
|
230
347
|
|
|
231
348
|
} )();
|
|
232
349
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Color,
|
|
3
3
|
FrontSide,
|
|
4
|
+
HalfFloatType,
|
|
4
5
|
Matrix4,
|
|
5
6
|
Mesh,
|
|
6
7
|
PerspectiveCamera,
|
|
@@ -84,7 +85,7 @@ class Water extends Mesh {
|
|
|
84
85
|
|
|
85
86
|
const mirrorCamera = new PerspectiveCamera();
|
|
86
87
|
|
|
87
|
-
const renderTarget = new WebGLRenderTarget( textureWidth, textureHeight );
|
|
88
|
+
const renderTarget = new WebGLRenderTarget( textureWidth, textureHeight, { type: HalfFloatType } );
|
|
88
89
|
|
|
89
90
|
const mirrorShader = {
|
|
90
91
|
|
|
@@ -196,10 +197,10 @@ class Water extends Mesh {
|
|
|
196
197
|
vec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.w + distortion ) );
|
|
197
198
|
|
|
198
199
|
float theta = max( dot( eyeDirection, surfaceNormal ), 0.0 );
|
|
199
|
-
float rf0 = 0.
|
|
200
|
+
float rf0 = 0.02;
|
|
200
201
|
float reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 );
|
|
201
202
|
vec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor;
|
|
202
|
-
vec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ) * getShadowMask(),
|
|
203
|
+
vec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ) * getShadowMask(), reflectionSample + specularLight, reflectance );
|
|
203
204
|
vec3 outgoingLight = albedo;
|
|
204
205
|
gl_FragColor = vec4( outgoingLight, alpha );
|
|
205
206
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
Timer,
|
|
3
3
|
Color,
|
|
4
4
|
Matrix4,
|
|
5
5
|
Mesh,
|
|
@@ -74,7 +74,7 @@ class Water extends Mesh {
|
|
|
74
74
|
const cycle = 0.15; // a cycle of a flow map phase
|
|
75
75
|
const halfCycle = cycle * 0.5;
|
|
76
76
|
const textureMatrix = new Matrix4();
|
|
77
|
-
const
|
|
77
|
+
const timer = new Timer();
|
|
78
78
|
|
|
79
79
|
// internal components
|
|
80
80
|
|
|
@@ -180,7 +180,7 @@ class Water extends Mesh {
|
|
|
180
180
|
|
|
181
181
|
function updateFlow() {
|
|
182
182
|
|
|
183
|
-
const delta =
|
|
183
|
+
const delta = timer.getDelta();
|
|
184
184
|
const config = scope.material.uniforms[ 'config' ];
|
|
185
185
|
|
|
186
186
|
config.value.x += flowSpeed * delta; // flowMapOffset0
|
|
@@ -207,6 +207,8 @@ class Water extends Mesh {
|
|
|
207
207
|
|
|
208
208
|
this.onBeforeRender = function ( renderer, scene, camera ) {
|
|
209
209
|
|
|
210
|
+
timer.update();
|
|
211
|
+
|
|
210
212
|
updateTextureMatrix( camera );
|
|
211
213
|
updateFlow();
|
|
212
214
|
|