super-three 0.181.0 → 0.185.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 +21332 -19201
- package/build/three.core.js +20908 -19853
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1947 -862
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +37 -16
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +33628 -25197
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +33394 -25000
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +14 -3
- package/examples/jsm/animation/CCDIKSolver.js +7 -3
- package/examples/jsm/controls/ArcballControls.js +13 -6
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +127 -86
- package/examples/jsm/controls/FlyControls.js +4 -0
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +111 -8
- package/examples/jsm/controls/TrackballControls.js +8 -8
- package/examples/jsm/controls/TransformControls.js +102 -17
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMFrustum.js +31 -6
- package/examples/jsm/csm/CSMShadowNode.js +10 -3
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/effects/AsciiEffect.js +14 -1
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/DRACOExporter.js +27 -6
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +266 -21
- package/examples/jsm/exporters/PLYExporter.js +286 -73
- package/examples/jsm/exporters/USDZExporter.js +353 -99
- package/examples/jsm/generators/CityGenerator.js +346 -0
- package/examples/jsm/generators/ForestGenerator.js +347 -0
- package/examples/jsm/generators/TerrainGenerator.js +504 -0
- package/examples/jsm/generators/TreeGenerator.js +377 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
- package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/geometries/LoftGeometry.js +355 -0
- package/examples/jsm/geometries/TextGeometry.js +18 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelper.js +5 -4
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +83 -14
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +244 -91
- package/examples/jsm/inspector/RendererInspector.js +165 -39
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +241 -25
- package/examples/jsm/inspector/tabs/Memory.js +136 -0
- package/examples/jsm/inspector/tabs/Parameters.js +115 -7
- package/examples/jsm/inspector/tabs/Performance.js +24 -9
- package/examples/jsm/inspector/tabs/Settings.js +306 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
- package/examples/jsm/inspector/tabs/Viewer.js +723 -9
- package/examples/jsm/inspector/ui/Graph.js +162 -25
- package/examples/jsm/inspector/ui/Item.js +92 -13
- package/examples/jsm/inspector/ui/List.js +2 -2
- package/examples/jsm/inspector/ui/Profiler.js +1991 -44
- package/examples/jsm/inspector/ui/Style.js +1943 -543
- package/examples/jsm/inspector/ui/Tab.js +226 -5
- package/examples/jsm/inspector/ui/Values.js +126 -8
- package/examples/jsm/inspector/ui/utils.js +143 -10
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/libs/basis/README.md +0 -1
- package/examples/jsm/libs/demuxer_mp4.js +3 -3
- package/examples/jsm/libs/draco/README.md +0 -1
- package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
- package/examples/jsm/libs/mikktspace.module.js +34 -9
- package/examples/jsm/lighting/ClusteredLighting.js +55 -0
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +681 -0
- package/examples/jsm/lines/LineMaterial.js +45 -16
- package/examples/jsm/lines/LineSegments2.js +8 -0
- package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
- package/examples/jsm/loaders/3DMLoader.js +6 -5
- 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 +51 -18
- package/examples/jsm/loaders/EXRLoader.js +701 -90
- package/examples/jsm/loaders/FBXLoader.js +235 -37
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +146 -178
- package/examples/jsm/loaders/HDRLoader.js +7 -30
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +58 -17
- package/examples/jsm/loaders/LDrawLoader.js +49 -58
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
- package/examples/jsm/loaders/LWOLoader.js +11 -39
- package/examples/jsm/loaders/LottieLoader.js +1 -1
- package/examples/jsm/loaders/MaterialXLoader.js +31 -9
- package/examples/jsm/loaders/NRRDLoader.js +5 -5
- package/examples/jsm/loaders/PCDLoader.js +11 -9
- package/examples/jsm/loaders/PLYLoader.js +218 -55
- package/examples/jsm/loaders/SVGLoader.js +549 -497
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/TTFLoader.js +1 -1
- package/examples/jsm/loaders/USDLoader.js +127 -43
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +80 -3
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/usd/USDAParser.js +504 -344
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
- package/examples/jsm/misc/Volume.js +2 -3
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/GroundedSkybox.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +72 -25
- package/examples/jsm/objects/Sky.js +90 -6
- package/examples/jsm/objects/SkyMesh.js +150 -16
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/Water2Mesh.js +1 -1
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +27 -15
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +36 -7
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +174 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/shaders/VolumeShader.js +31 -44
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
- package/examples/jsm/transpiler/Linker.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +75 -25
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +13 -14
- package/examples/jsm/tsl/display/GTAONode.js +40 -17
- package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
- package/examples/jsm/tsl/display/GodraysNode.js +615 -0
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +69 -19
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
- 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 +15 -27
- package/examples/jsm/tsl/display/SSGINode.js +96 -62
- package/examples/jsm/tsl/display/SSRNode.js +831 -134
- package/examples/jsm/tsl/display/SSSNode.js +8 -6
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +315 -126
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/tsl/math/curlNoise.js +107 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
- package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
- package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
- package/examples/jsm/tsl/utils/RNoise.js +51 -0
- package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/SceneOptimizer.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/ARButton.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
- package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +28 -34
- package/src/Three.Core.js +3 -1
- package/src/Three.TSL.js +35 -14
- package/src/Three.WebGPU.Nodes.js +5 -0
- package/src/Three.WebGPU.js +13 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +18 -4
- package/src/animation/AnimationClip.js +0 -139
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyBinding.js +2 -2
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +34 -4
- package/src/cameras/CubeCamera.js +20 -0
- package/src/cameras/StereoCamera.js +5 -2
- package/src/constants.js +90 -5
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +43 -9
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +69 -11
- package/src/core/Raycaster.js +3 -3
- package/src/core/RenderTarget.js +19 -6
- package/src/extras/PMREMGenerator.js +13 -22
- package/src/extras/TextureUtils.js +6 -2
- package/src/extras/core/ShapePath.js +149 -160
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/SphereGeometry.js +8 -3
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +6 -1
- package/src/helpers/HemisphereLightHelper.js +5 -0
- package/src/helpers/PointLightHelper.js +3 -25
- package/src/helpers/SpotLightHelper.js +4 -1
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/AudioLoader.js +11 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/DataTextureLoader.js +75 -42
- package/src/loaders/FileLoader.js +2 -3
- package/src/loaders/ImageBitmapLoader.js +12 -9
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/LoadingManager.js +5 -0
- package/src/loaders/MaterialLoader.js +37 -266
- package/src/loaders/ObjectLoader.js +48 -6
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/LineBasicMaterial.js +4 -0
- package/src/materials/Material.js +198 -1
- package/src/materials/MeshBasicMaterial.js +24 -0
- package/src/materials/MeshDepthMaterial.js +10 -0
- package/src/materials/MeshDistanceMaterial.js +10 -0
- package/src/materials/MeshLambertMaterial.js +49 -1
- package/src/materials/MeshMatcapMaterial.js +25 -1
- package/src/materials/MeshNormalMaterial.js +9 -1
- package/src/materials/MeshPhongMaterial.js +49 -1
- package/src/materials/MeshPhysicalMaterial.js +38 -0
- package/src/materials/MeshStandardMaterial.js +42 -1
- package/src/materials/MeshToonMaterial.js +35 -2
- package/src/materials/PointsMaterial.js +7 -0
- package/src/materials/ShaderMaterial.js +106 -1
- package/src/materials/SpriteMaterial.js +7 -0
- package/src/materials/nodes/Line2NodeMaterial.js +380 -297
- package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
- package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
- package/src/materials/nodes/NodeMaterial.js +153 -89
- package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
- package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
- package/src/math/Box3.js +5 -0
- package/src/math/FrustumArray.js +103 -133
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +12 -12
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +24 -9
- package/src/math/Matrix4.js +112 -74
- package/src/math/Plane.js +4 -3
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +13 -9
- package/src/math/Vector3.js +17 -15
- package/src/math/Vector4.js +15 -11
- package/src/math/interpolants/BezierInterpolant.js +106 -0
- package/src/nodes/Nodes.js +86 -71
- package/src/nodes/TSL.js +15 -13
- package/src/nodes/accessors/Arrays.js +5 -5
- package/src/nodes/accessors/Batch.js +108 -0
- package/src/nodes/accessors/Bitangent.js +7 -7
- package/src/nodes/accessors/BufferAttributeNode.js +120 -17
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +5 -5
- package/src/nodes/accessors/CubeTextureNode.js +27 -2
- package/src/nodes/accessors/Instance.js +264 -0
- package/src/nodes/accessors/MaterialNode.js +27 -3
- package/src/nodes/accessors/MaterialProperties.js +6 -8
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
- package/src/nodes/accessors/Normal.js +24 -24
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +39 -3
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
- package/src/nodes/accessors/ReferenceNode.js +9 -8
- package/src/nodes/accessors/ReflectVector.js +3 -3
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/Skinning.js +263 -0
- package/src/nodes/accessors/StorageBufferNode.js +16 -27
- package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
- package/src/nodes/accessors/StorageTextureNode.js +74 -11
- package/src/nodes/accessors/Tangent.js +8 -18
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +124 -25
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +4 -19
- package/src/nodes/core/ArrayNode.js +21 -2
- package/src/nodes/core/AssignNode.js +3 -3
- package/src/nodes/core/AttributeNode.js +3 -3
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +104 -5
- package/src/nodes/core/IndexNode.js +2 -1
- package/src/nodes/core/InputNode.js +1 -1
- package/src/nodes/core/InspectorNode.js +1 -1
- package/src/nodes/core/IsolateNode.js +1 -1
- package/src/nodes/core/MRTNode.js +55 -4
- package/src/nodes/core/Node.js +151 -17
- package/src/nodes/core/NodeBuilder.js +479 -101
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +20 -18
- package/src/nodes/core/OutputStructNode.js +13 -11
- package/src/nodes/core/OverrideContextNode.js +153 -0
- package/src/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +66 -4
- package/src/nodes/core/StackNode.js +91 -20
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +20 -8
- package/src/nodes/core/StructTypeNode.js +17 -23
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +56 -23
- package/src/nodes/core/VaryingNode.js +14 -21
- package/src/nodes/display/BlendModes.js +1 -105
- package/src/nodes/display/BumpMapNode.js +6 -1
- package/src/nodes/display/ColorAdjustment.js +27 -9
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +38 -9
- package/src/nodes/display/NormalMapNode.js +41 -6
- package/src/nodes/display/PassNode.js +157 -56
- package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
- package/src/nodes/display/RenderOutputNode.js +19 -10
- package/src/nodes/display/ScreenNode.js +4 -2
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
- package/src/nodes/display/ViewportTextureNode.js +39 -11
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/functions/VolumetricLightingModel.js +40 -7
- package/src/nodes/geometry/RangeNode.js +5 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
- package/src/nodes/gpgpu/ComputeNode.js +74 -48
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +30 -5
- package/src/nodes/lighting/IESSpotLightNode.js +40 -2
- package/src/nodes/lighting/LightingContextNode.js +10 -2
- package/src/nodes/lighting/LightsNode.js +97 -65
- package/src/nodes/lighting/PointShadowNode.js +166 -148
- package/src/nodes/lighting/ShadowFilterNode.js +74 -117
- package/src/nodes/lighting/ShadowNode.js +149 -51
- package/src/nodes/materialx/lib/mx_noise.js +2 -2
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +6 -6
- package/src/nodes/math/MathNode.js +115 -52
- package/src/nodes/math/OperatorNode.js +24 -23
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +34 -3
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +99 -33
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +12 -12
- package/src/nodes/utils/EquirectUV.js +30 -5
- package/src/nodes/utils/EventNode.js +31 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +2 -2
- package/src/nodes/utils/Packing.js +48 -5
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +41 -25
- package/src/nodes/utils/ReflectorNode.js +4 -4
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/StorageArrayElementNode.js +1 -1
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +66 -30
- package/src/objects/InstancedMesh.js +19 -3
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +344 -156
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +78 -13
- package/src/renderers/common/Background.js +26 -13
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +141 -57
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +49 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ClippingContext.js +10 -2
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Info.js +374 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Lighting.js +51 -19
- package/src/renderers/common/Pipelines.js +40 -7
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderList.js +41 -4
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +88 -16
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +21 -5
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +700 -163
- package/src/renderers/common/Sampler.js +16 -48
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +121 -9
- package/src/renderers/common/TimestampQueryPool.js +6 -4
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +84 -1
- package/src/renderers/common/XRManager.js +377 -51
- package/src/renderers/common/extras/PMREMGenerator.js +40 -61
- package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
- package/src/renderers/common/nodes/NodeLibrary.js +4 -4
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -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/common.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk.js +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -6
- package/src/renderers/shaders/UniformsLib.js +7 -5
- package/src/renderers/shaders/UniformsUtils.js +27 -5
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +9 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +271 -0
- package/src/renderers/webgl/WebGLProgram.js +54 -113
- package/src/renderers/webgl/WebGLPrograms.js +74 -55
- package/src/renderers/webgl/WebGLRenderLists.js +24 -1
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShaderCache.js +5 -11
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +75 -37
- package/src/renderers/webgl/WebGLTextures.js +230 -56
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
- package/src/renderers/webgpu/WebGPUBackend.js +733 -302
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
- package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
- package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
- package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
- package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
- package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
- package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
- package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
- package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
- package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
- package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
- package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
- package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
- package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
- package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
- package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
- package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +4 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/DepthTexture.js +1 -1
- package/src/textures/ExternalTexture.js +0 -3
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +16 -5
- package/src/utils.js +280 -3
- package/examples/fonts/LICENSE +0 -13
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
- package/examples/fonts/README.md +0 -11
- package/examples/fonts/droid/NOTICE +0 -190
- package/examples/fonts/droid/README.txt +0 -18
- package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
- package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
- package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
- package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
- package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
- package/examples/fonts/gentilis_bold.typeface.json +0 -1
- package/examples/fonts/gentilis_regular.typeface.json +0 -1
- package/examples/fonts/helvetiker_bold.typeface.json +0 -1
- package/examples/fonts/helvetiker_regular.typeface.json +0 -1
- package/examples/fonts/optimer_bold.typeface.json +0 -1
- package/examples/fonts/optimer_regular.typeface.json +0 -1
- package/examples/fonts/ttf/README.md +0 -9
- package/examples/fonts/ttf/kenpixel.ttf +0 -0
- package/examples/jsm/libs/ammo.wasm.js +0 -822
- package/examples/jsm/libs/ammo.wasm.wasm +0 -0
- package/examples/jsm/libs/draco/draco_encoder.js +0 -33
- package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
- package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
- package/examples/jsm/libs/opentype.module.js +0 -14506
- package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
- package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
- package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
- package/examples/jsm/lighting/TiledLighting.js +0 -42
- 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/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
- package/src/nodes/accessors/BatchNode.js +0 -163
- package/src/nodes/accessors/InstanceNode.js +0 -244
- package/src/nodes/accessors/InstancedMeshNode.js +0 -50
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/accessors/SkinningNode.js +0 -327
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BufferGeometry,
|
|
3
|
+
Float32BufferAttribute,
|
|
4
|
+
Group,
|
|
5
|
+
Mesh
|
|
6
|
+
} from 'three';
|
|
7
|
+
|
|
8
|
+
import { MeshStandardNodeMaterial } from 'three/webgpu';
|
|
9
|
+
import { cameraPosition, color, float, Fn, If, mix, mx_noise_float, normalView, normalWorld, positionView, positionWorld, saturation, smoothstep, uniform } from 'three/tsl';
|
|
10
|
+
|
|
11
|
+
import { ImprovedNoise } from '../math/ImprovedNoise.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Bakes a procedural mountain range into a single {@link THREE.BufferGeometry} and
|
|
15
|
+
* returns a `THREE.Group` ready to add to a scene.
|
|
16
|
+
*
|
|
17
|
+
* The heightfield is a derivative-damped fractal sum ( Quilez's fake erosion ): each
|
|
18
|
+
* octave is suppressed where the running slope is already steep, concentrating detail
|
|
19
|
+
* into weathered ridgelines, and a low-frequency domain warp makes those ridges
|
|
20
|
+
* meander. A few passes of thermal ( talus ) erosion then relax any slope past the
|
|
21
|
+
* angle of repose, settling the fractal's needle-spikes into real crests.
|
|
22
|
+
*
|
|
23
|
+
* The grid is triangulated with alternating quad diagonals ( a diamond pattern ), so a
|
|
24
|
+
* coarse mesh holds its silhouette without a one-way grain. The surface shades itself
|
|
25
|
+
* from altitude and slope in TSL — grass, forest, rock, scree and snow, with detail
|
|
26
|
+
* normals and aerial perspective — so no material or textures are needed.
|
|
27
|
+
*
|
|
28
|
+
* The baked height grid is exposed through {@link TerrainGenerator#sampleHeight} so a
|
|
29
|
+
* scattered forest ( or anything else ) can sit exactly on the surface.
|
|
30
|
+
*
|
|
31
|
+
* ```js
|
|
32
|
+
* const terrain = new TerrainGenerator( { seed: 1 } );
|
|
33
|
+
* scene.add( terrain.build() );
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
class TerrainGenerator {
|
|
37
|
+
|
|
38
|
+
constructor( parameters = {} ) {
|
|
39
|
+
|
|
40
|
+
this.parameters = Object.assign( {}, TerrainGenerator.defaults, parameters );
|
|
41
|
+
|
|
42
|
+
// baked altitude range, fed to the shader so the colour bands track the real
|
|
43
|
+
// valley floor and peaks
|
|
44
|
+
this.minHeight = uniform( 0 );
|
|
45
|
+
this.maxHeight = uniform( 1 );
|
|
46
|
+
|
|
47
|
+
this.material = terrainMaterial( this.minHeight, this.maxHeight );
|
|
48
|
+
this.geometry = null;
|
|
49
|
+
this.group = null;
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
build() {
|
|
54
|
+
|
|
55
|
+
this.dispose();
|
|
56
|
+
|
|
57
|
+
const p = this.parameters;
|
|
58
|
+
const N = p.segments + 1;
|
|
59
|
+
const half = p.size / 2;
|
|
60
|
+
|
|
61
|
+
// world coordinate of each grid line, shared by the bake and layout below
|
|
62
|
+
const coord = new Array( N );
|
|
63
|
+
for ( let i = 0; i < N; i ++ ) coord[ i ] = i / p.segments * p.size - half;
|
|
64
|
+
|
|
65
|
+
// bake the height grid; kept around so the surface can be sampled ( bilinearly )
|
|
66
|
+
// afterwards — e.g. to sit a scattered forest on it
|
|
67
|
+
const height = heightField( p );
|
|
68
|
+
const heights = new Float32Array( N * N );
|
|
69
|
+
|
|
70
|
+
for ( let iz = 0; iz < N; iz ++ ) {
|
|
71
|
+
|
|
72
|
+
for ( let ix = 0; ix < N; ix ++ ) {
|
|
73
|
+
|
|
74
|
+
heights[ iz * N + ix ] = height( coord[ ix ], coord[ iz ] );
|
|
75
|
+
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// relax slopes past the angle of repose, shedding the fractal's needle-spikes
|
|
81
|
+
if ( p.talusPasses > 0 ) thermalErode( heights, N, p.size / p.segments, p.talus, p.talusPasses );
|
|
82
|
+
|
|
83
|
+
// lay the grid out flat in the XZ plane ( Y-up ) and find the height range
|
|
84
|
+
const positions = new Float32Array( N * N * 3 );
|
|
85
|
+
let min = Infinity, max = - Infinity;
|
|
86
|
+
|
|
87
|
+
for ( let iz = 0; iz < N; iz ++ ) {
|
|
88
|
+
|
|
89
|
+
for ( let ix = 0; ix < N; ix ++ ) {
|
|
90
|
+
|
|
91
|
+
const o = iz * N + ix;
|
|
92
|
+
const y = heights[ o ];
|
|
93
|
+
|
|
94
|
+
positions[ o * 3 ] = coord[ ix ];
|
|
95
|
+
positions[ o * 3 + 1 ] = y;
|
|
96
|
+
positions[ o * 3 + 2 ] = coord[ iz ];
|
|
97
|
+
|
|
98
|
+
if ( y < min ) min = y;
|
|
99
|
+
if ( y > max ) max = y;
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// flip the quad diagonal on every other quad, so the mesh reads as diamonds
|
|
106
|
+
// rather than a one-way grain
|
|
107
|
+
const indices = [];
|
|
108
|
+
|
|
109
|
+
for ( let iz = 0; iz < p.segments; iz ++ ) {
|
|
110
|
+
|
|
111
|
+
for ( let ix = 0; ix < p.segments; ix ++ ) {
|
|
112
|
+
|
|
113
|
+
const a = iz * N + ix, b = a + 1, c = a + N, d = c + 1;
|
|
114
|
+
|
|
115
|
+
if ( ( ix + iz ) % 2 === 0 ) indices.push( a, c, b, b, c, d );
|
|
116
|
+
else indices.push( a, c, d, a, d, b );
|
|
117
|
+
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const geometry = new BufferGeometry();
|
|
123
|
+
geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
|
|
124
|
+
geometry.setIndex( indices );
|
|
125
|
+
geometry.computeVertexNormals();
|
|
126
|
+
|
|
127
|
+
this.heights = heights;
|
|
128
|
+
this.gridSize = N;
|
|
129
|
+
this.minY = min;
|
|
130
|
+
this.maxY = max;
|
|
131
|
+
this.minHeight.value = min;
|
|
132
|
+
this.maxHeight.value = max;
|
|
133
|
+
|
|
134
|
+
const mesh = new Mesh( geometry, this.material );
|
|
135
|
+
mesh.castShadow = mesh.receiveShadow = true;
|
|
136
|
+
|
|
137
|
+
const group = new Group();
|
|
138
|
+
group.name = 'Terrain';
|
|
139
|
+
group.add( mesh );
|
|
140
|
+
|
|
141
|
+
this.geometry = geometry;
|
|
142
|
+
this.group = group;
|
|
143
|
+
|
|
144
|
+
return group;
|
|
145
|
+
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// world-space height at ( x, z ), bilinearly interpolated from the baked grid
|
|
149
|
+
sampleHeight( x, z ) {
|
|
150
|
+
|
|
151
|
+
const p = this.parameters;
|
|
152
|
+
const N = this.gridSize;
|
|
153
|
+
const half = p.size / 2;
|
|
154
|
+
|
|
155
|
+
const fx = Math.max( 0, Math.min( p.segments, ( x + half ) / p.size * p.segments ) );
|
|
156
|
+
const fz = Math.max( 0, Math.min( p.segments, ( z + half ) / p.size * p.segments ) );
|
|
157
|
+
|
|
158
|
+
const ix = Math.min( N - 2, Math.floor( fx ) );
|
|
159
|
+
const iz = Math.min( N - 2, Math.floor( fz ) );
|
|
160
|
+
const tx = fx - ix;
|
|
161
|
+
const tz = fz - iz;
|
|
162
|
+
|
|
163
|
+
const h = this.heights;
|
|
164
|
+
const h00 = h[ iz * N + ix ];
|
|
165
|
+
const h10 = h[ iz * N + ix + 1 ];
|
|
166
|
+
const h01 = h[ ( iz + 1 ) * N + ix ];
|
|
167
|
+
const h11 = h[ ( iz + 1 ) * N + ix + 1 ];
|
|
168
|
+
|
|
169
|
+
return ( h00 * ( 1 - tx ) + h10 * tx ) * ( 1 - tz ) + ( h01 * ( 1 - tx ) + h11 * tx ) * tz;
|
|
170
|
+
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// surface flatness at ( x, z ): the normal's y component ( 1 on the flat, → 0 on a
|
|
174
|
+
// cliff ). allocation-free, for cheaply testing many candidate forest positions.
|
|
175
|
+
sampleSlope( x, z ) {
|
|
176
|
+
|
|
177
|
+
const e = this.parameters.size / this.parameters.segments;
|
|
178
|
+
const hx = this.sampleHeight( x + e, z ) - this.sampleHeight( x - e, z );
|
|
179
|
+
const hz = this.sampleHeight( x, z + e ) - this.sampleHeight( x, z - e );
|
|
180
|
+
|
|
181
|
+
return 2 * e / Math.sqrt( hx * hx + 4 * e * e + hz * hz );
|
|
182
|
+
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
dispose() {
|
|
186
|
+
|
|
187
|
+
if ( this.geometry ) this.geometry.dispose();
|
|
188
|
+
this.geometry = null;
|
|
189
|
+
this.group = null;
|
|
190
|
+
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
TerrainGenerator.defaults = {
|
|
196
|
+
seed: 1,
|
|
197
|
+
size: 200, // world units across the square patch
|
|
198
|
+
segments: 192, // grid quads per side; vertices = ( segments + 1 )²
|
|
199
|
+
heightScale: 65, // peak-to-valley exaggeration, in world units
|
|
200
|
+
frequency: 0.01, // base noise frequency ( the footprint of a mountain )
|
|
201
|
+
octaves: 5,
|
|
202
|
+
lacunarity: 1.97, // per-octave frequency step; off 2 so octaves don't grid-lock
|
|
203
|
+
gain: 0.5, // per-octave amplitude step ( persistence )
|
|
204
|
+
erosion: 0.7, // derivative damping: higher flattens valleys and sharpens ridges
|
|
205
|
+
warp: 0.35, // domain-warp strength ( noise units ): bends ridges and valleys
|
|
206
|
+
valleyBias: 1.2, // power curve over the height, to flatten the mist floor
|
|
207
|
+
seaLevel: 0.15, // 0..1, subtracted before scaling so the valley floor sinks below y = 0
|
|
208
|
+
talus: 1, // thermal-erosion angle of repose ( rise / run ): lower settles flatter
|
|
209
|
+
talusPasses: 12 // thermal-erosion iterations ( 0 = off )
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// deterministic PRNG ( mulberry32 ), so a seed always bakes the same terrain
|
|
213
|
+
function createRandom( seed ) {
|
|
214
|
+
|
|
215
|
+
let s = ( seed >>> 0 ) || 1;
|
|
216
|
+
|
|
217
|
+
return function () {
|
|
218
|
+
|
|
219
|
+
s = ( s + 0x6D2B79F5 ) | 0;
|
|
220
|
+
let t = Math.imul( s ^ ( s >>> 15 ), 1 | s );
|
|
221
|
+
t = ( t + Math.imul( t ^ ( t >>> 7 ), 61 | t ) ) ^ t;
|
|
222
|
+
return ( ( t ^ ( t >>> 14 ) ) >>> 0 ) / 4294967296;
|
|
223
|
+
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// builds the height( worldX, worldZ ) function for one seed
|
|
229
|
+
function heightField( p ) {
|
|
230
|
+
|
|
231
|
+
const perlin = new ImprovedNoise();
|
|
232
|
+
const random = createRandom( p.seed );
|
|
233
|
+
|
|
234
|
+
// ImprovedNoise's permutation is fixed, so a seed can only shift the sample window:
|
|
235
|
+
// a translation and a per-octave z-slice, drawn from the PRNG to decorrelate seeds
|
|
236
|
+
const offsetX = random() * 256;
|
|
237
|
+
const offsetZ = random() * 256;
|
|
238
|
+
const slice = random() * 256;
|
|
239
|
+
|
|
240
|
+
const { frequency, octaves, lacunarity, gain, erosion, warp, valleyBias, seaLevel, heightScale } = p;
|
|
241
|
+
|
|
242
|
+
// low-frequency fractal sum that warps the sample position
|
|
243
|
+
function warpField( x, z, zr ) {
|
|
244
|
+
|
|
245
|
+
let freq = 1, amp = 1, sum = 0, norm = 0;
|
|
246
|
+
|
|
247
|
+
for ( let i = 0; i < 2; i ++ ) {
|
|
248
|
+
|
|
249
|
+
sum += amp * perlin.noise( x * freq + offsetX, z * freq + offsetZ, zr + i * 1.7 );
|
|
250
|
+
norm += amp; freq *= lacunarity; amp *= gain;
|
|
251
|
+
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return sum / norm;
|
|
255
|
+
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// derivative-damped fractal sum: each octave is divided down where the running
|
|
259
|
+
// gradient is already steep, keeping ridges crisp and valleys smooth. the domain
|
|
260
|
+
// rotates between octaves to break the noise's axis-aligned grid.
|
|
261
|
+
function eroded( x, z ) {
|
|
262
|
+
|
|
263
|
+
let sum = 0, amp = 1, dX = 0, dZ = 0, px = x, pz = z, freq = 1;
|
|
264
|
+
const e = 0.004; // finite-difference step, in noise units
|
|
265
|
+
|
|
266
|
+
for ( let i = 0; i < octaves; i ++ ) {
|
|
267
|
+
|
|
268
|
+
const zr = slice + i * 1.7;
|
|
269
|
+
const bx = px * freq + offsetX, bz = pz * freq + offsetZ;
|
|
270
|
+
const n = perlin.noise( bx, bz, zr );
|
|
271
|
+
const nx = perlin.noise( bx + e, bz, zr );
|
|
272
|
+
const nz = perlin.noise( bx, bz + e, zr );
|
|
273
|
+
|
|
274
|
+
// this octave's world-space gradient ( chain rule: × freq )
|
|
275
|
+
dX += ( nx - n ) / e * freq;
|
|
276
|
+
dZ += ( nz - n ) / e * freq;
|
|
277
|
+
|
|
278
|
+
sum += amp * n / ( 1 + erosion * ( dX * dX + dZ * dZ ) );
|
|
279
|
+
|
|
280
|
+
// rotate the domain ~37° ( the matrix [ 0.8 -0.6 ; 0.6 0.8 ] )
|
|
281
|
+
const rx = 0.8 * px - 0.6 * pz;
|
|
282
|
+
pz = 0.6 * px + 0.8 * pz;
|
|
283
|
+
px = rx;
|
|
284
|
+
|
|
285
|
+
freq *= lacunarity; amp *= gain;
|
|
286
|
+
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return sum * 0.5 + 0.5;
|
|
290
|
+
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return function ( worldX, worldZ ) {
|
|
294
|
+
|
|
295
|
+
const x = worldX * frequency, z = worldZ * frequency;
|
|
296
|
+
|
|
297
|
+
// warp the sample so ridges and valleys meander instead of running straight
|
|
298
|
+
const wx = x + warp * warpField( x + 1.3, z + 7.2, slice + 40 );
|
|
299
|
+
const wz = z + warp * warpField( x + 5.2, z + 1.3, slice + 70 );
|
|
300
|
+
|
|
301
|
+
// power curve that settles the low ground into a flat mist bed
|
|
302
|
+
const h = Math.pow( Math.min( eroded( wx, wz ) * 1.1, 1 ), valleyBias );
|
|
303
|
+
|
|
304
|
+
return ( h - seaLevel ) * heightScale;
|
|
305
|
+
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// thermal ( talus ) erosion on the baked height grid: a cell overhanging a neighbour
|
|
311
|
+
// by more than the talus drop sheds the excess downhill, so over a few passes slopes
|
|
312
|
+
// relax to the angle of repose. spikes — steep on every side — bleed off fastest;
|
|
313
|
+
// broad one-sided faces keep their shape. material is conserved through a delta buffer,
|
|
314
|
+
// so the result is independent of cell order.
|
|
315
|
+
function thermalErode( h, N, cellSize, talus, passes ) {
|
|
316
|
+
|
|
317
|
+
const drop = talus * cellSize; // max height step a slope can hold between two cells
|
|
318
|
+
const carry = 0.5; // fraction of the steepest overhang moved per pass ( <= 0.5 = stable )
|
|
319
|
+
const delta = new Float32Array( N * N );
|
|
320
|
+
const ex = [ 0, 0, 0, 0 ];
|
|
321
|
+
const off = [ - 1, 1, - N, N ];
|
|
322
|
+
|
|
323
|
+
for ( let p = 0; p < passes; p ++ ) {
|
|
324
|
+
|
|
325
|
+
delta.fill( 0 );
|
|
326
|
+
|
|
327
|
+
for ( let z = 0; z < N; z ++ ) {
|
|
328
|
+
|
|
329
|
+
for ( let x = 0; x < N; x ++ ) {
|
|
330
|
+
|
|
331
|
+
const i = z * N + x;
|
|
332
|
+
const hi = h[ i ];
|
|
333
|
+
|
|
334
|
+
// overhang past the talus drop toward each of the 4 neighbours
|
|
335
|
+
ex[ 0 ] = x > 0 ? hi - h[ i - 1 ] - drop : 0;
|
|
336
|
+
ex[ 1 ] = x < N - 1 ? hi - h[ i + 1 ] - drop : 0;
|
|
337
|
+
ex[ 2 ] = z > 0 ? hi - h[ i - N ] - drop : 0;
|
|
338
|
+
ex[ 3 ] = z < N - 1 ? hi - h[ i + N ] - drop : 0;
|
|
339
|
+
|
|
340
|
+
let sum = 0, peak = 0;
|
|
341
|
+
|
|
342
|
+
for ( let k = 0; k < 4; k ++ ) {
|
|
343
|
+
|
|
344
|
+
const d = ex[ k ];
|
|
345
|
+
|
|
346
|
+
if ( d <= 0 ) {
|
|
347
|
+
|
|
348
|
+
ex[ k ] = 0;
|
|
349
|
+
continue;
|
|
350
|
+
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
sum += d;
|
|
354
|
+
if ( d > peak ) peak = d;
|
|
355
|
+
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if ( sum <= 0 ) continue;
|
|
359
|
+
|
|
360
|
+
// move a slice of the steepest overhang, split across the downhill
|
|
361
|
+
// neighbours in proportion to how far each sits below the talus line
|
|
362
|
+
const move = carry * peak;
|
|
363
|
+
delta[ i ] -= move;
|
|
364
|
+
|
|
365
|
+
for ( let k = 0; k < 4; k ++ ) {
|
|
366
|
+
|
|
367
|
+
if ( ex[ k ] > 0 ) delta[ i + off[ k ] ] += move * ex[ k ] / sum;
|
|
368
|
+
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
for ( let k = 0; k < N * N; k ++ ) h[ k ] += delta[ k ];
|
|
376
|
+
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// --- shading -------------------------------------------------------------
|
|
382
|
+
|
|
383
|
+
// perturbs the normal by a world-space height field using Mikkelsen's surface-gradient
|
|
384
|
+
// method. the built-in bumpMap reads height by offsetting the UV — a no-op for a
|
|
385
|
+
// world-keyed height — so the height's screen-space derivatives are fed in directly.
|
|
386
|
+
// returns a view-space normal.
|
|
387
|
+
function bumpNormal( height ) {
|
|
388
|
+
|
|
389
|
+
const dpdx = positionView.dFdx();
|
|
390
|
+
const dpdy = positionView.dFdy();
|
|
391
|
+
const r1 = dpdy.cross( normalView );
|
|
392
|
+
const r2 = normalView.cross( dpdx );
|
|
393
|
+
const det = dpdx.dot( r1 );
|
|
394
|
+
const grad = det.sign().mul( height.dFdx().mul( r1 ).add( height.dFdy().mul( r2 ) ) );
|
|
395
|
+
|
|
396
|
+
return det.abs().mul( normalView ).sub( grad ).normalize();
|
|
397
|
+
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// altitude- and slope-based shading, all in TSL ( no textures ). only the colour,
|
|
401
|
+
// roughness and detail normal are authored here; the lighting ( sun, sky fill, the
|
|
402
|
+
// snow's warm/cool cast ) comes from the scene's lights and environment.
|
|
403
|
+
function terrainMaterial( minHeight, maxHeight ) {
|
|
404
|
+
|
|
405
|
+
const material = new MeshStandardNodeMaterial();
|
|
406
|
+
material.metalness = 0;
|
|
407
|
+
|
|
408
|
+
const distance = positionWorld.distance( cameraPosition );
|
|
409
|
+
|
|
410
|
+
// the two drivers: normalised altitude ( valley 0 → peak 1 ) and surface flatness
|
|
411
|
+
const altitude = positionWorld.y.sub( minHeight ).div( maxHeight.sub( minHeight ) ).clamp();
|
|
412
|
+
const flatness = normalWorld.y.clamp(); // 1 on level ground, 0 on a vertical cliff
|
|
413
|
+
const steep = flatness.oneMinus();
|
|
414
|
+
|
|
415
|
+
// three reused noise scales: fine band-edge jitter, grain ( ~5u patches ) and macro
|
|
416
|
+
const detail = mx_noise_float( positionWorld.xz.mul( 0.05 ) );
|
|
417
|
+
const grain = mx_noise_float( positionWorld.xz.mul( 0.18 ) );
|
|
418
|
+
const macro = mx_noise_float( positionWorld.xz.mul( 0.012 ) );
|
|
419
|
+
|
|
420
|
+
const grass = color( 0x6e7253 ); // dry sage-olive meadow ( not video-game green )
|
|
421
|
+
const dryGrass = color( 0x8a8550 );
|
|
422
|
+
const forest = color( 0x39402f ); // dark forested mid-slope band, under the trees
|
|
423
|
+
const rock = color( 0x736a5f ); // warm grey-brown rock
|
|
424
|
+
const scree = color( 0x837a6f ); // brighter broken rock below the cliffs
|
|
425
|
+
const lichen = color( 0x6c7355 ); // muted green-grey, patched onto lower rock
|
|
426
|
+
const snow = color( 0xe9ecf0 ); // fresh snow; warm-sun / cool-sky cast is from the lighting
|
|
427
|
+
const snowDeep = color( 0xccd6e2 ); // cooler wind-packed snow, drifted into patches
|
|
428
|
+
|
|
429
|
+
// two band frequencies of lighter / darker stone, wobbled by noise, so cliff faces
|
|
430
|
+
// read as layered bedding instead of flat grey
|
|
431
|
+
const bandA = positionWorld.y.mul( 0.5 ).add( detail.mul( 3 ) ).add( macro.mul( 4 ) ).sin();
|
|
432
|
+
const bandB = positionWorld.y.mul( 1.4 ).add( grain.mul( 2 ) ).sin();
|
|
433
|
+
const strata = bandA.mul( 0.6 ).add( bandB.mul( 0.4 ) ).mul( 0.5 ).add( 0.5 );
|
|
434
|
+
|
|
435
|
+
// lichen creeps onto the lower, gentler rock; cliffs and high ground stay bare grey
|
|
436
|
+
const lichenMask = smoothstep( 0.45, 0.72, grain ).mul( smoothstep( 0.62, 0.32, steep ) ).mul( smoothstep( 0.66, 0.34, altitude ) );
|
|
437
|
+
const rockShade = mix( rock, lichen, lichenMask.mul( 0.45 ) ).mul( strata.mul( 0.36 ).add( 0.8 ) );
|
|
438
|
+
|
|
439
|
+
// meadow, drifting to dry grass in macro-noise patches over a mid band
|
|
440
|
+
let surface = mix( grass, dryGrass, smoothstep( 0.15, 0.75, macro ).mul( smoothstep( 0.22, 0.5, altitude ) ) );
|
|
441
|
+
|
|
442
|
+
// dark forested band on the gentle mid-slopes ( where the instanced trees live )
|
|
443
|
+
surface = mix( surface, forest, smoothstep( 0.16, 0.34, altitude ).mul( smoothstep( 0.5, 0.72, flatness ) ).mul( 0.75 ) );
|
|
444
|
+
|
|
445
|
+
// rock by altitude, and on every steep face regardless of height
|
|
446
|
+
surface = mix( surface, rockShade, smoothstep( 0.46, 0.64, altitude.add( detail.mul( 0.06 ) ) ) );
|
|
447
|
+
surface = mix( surface, rockShade, smoothstep( 0.34, 0.62, steep ) );
|
|
448
|
+
|
|
449
|
+
// scree on the medium-steep ground below the cliffs, broken up by noise
|
|
450
|
+
const screeMask = smoothstep( 0.42, 0.7, steep ).mul( smoothstep( 0.35, 0.7, flatness ) ).mul( detail.mul( 0.5 ).add( 0.5 ) );
|
|
451
|
+
surface = mix( surface, scree, screeMask.mul( 0.5 ) );
|
|
452
|
+
|
|
453
|
+
// snow on high, flat ground; the grain noise breaks the line so rock pokes through
|
|
454
|
+
// near the snowline instead of stopping on a clean contour
|
|
455
|
+
const snowMask = smoothstep( 0.56, 0.78, altitude.add( detail.mul( 0.08 ) ).add( grain.mul( 0.05 ) ) ).mul( smoothstep( 0.3, 0.6, flatness ) );
|
|
456
|
+
const snowColor = mix( snow, snowDeep, smoothstep( 0.2, 0.7, grain ).mul( 0.6 ) ); // patchy, not a flat sheet
|
|
457
|
+
surface = mix( surface, snowColor, snowMask );
|
|
458
|
+
|
|
459
|
+
// dark, damp ground pooling in the low flat creases ( cheap moisture proxy )
|
|
460
|
+
const cavity = smoothstep( 0.24, 0.06, altitude ).mul( flatness );
|
|
461
|
+
surface = surface.mul( cavity.mul( 0.32 ).oneMinus() );
|
|
462
|
+
|
|
463
|
+
// macro drift then a fine grain mottle, so no band is a flat colour
|
|
464
|
+
surface = surface.mul( macro.mul( 0.5 ).add( 0.5 ).mul( 0.3 ).add( 0.84 ) );
|
|
465
|
+
surface = surface.mul( grain.mul( 0.5 ).add( 0.5 ).mul( 0.12 ).add( 0.94 ) );
|
|
466
|
+
|
|
467
|
+
// aerial perspective: desaturate and lift distant ground toward a cool haze, so
|
|
468
|
+
// depth reads and the range recedes into the mist
|
|
469
|
+
const aerial = smoothstep( 180, 820, distance );
|
|
470
|
+
surface = saturation( surface, aerial.oneMinus().mul( 0.5 ).add( 0.5 ) );
|
|
471
|
+
surface = mix( surface, color( 0xcfc8ba ), aerial.mul( 0.62 ) ); // far ridges dissolve into the sky
|
|
472
|
+
|
|
473
|
+
material.colorNode = surface;
|
|
474
|
+
material.roughnessNode = mix( float( 0.95 ), float( 0.72 ), snowMask );
|
|
475
|
+
|
|
476
|
+
// detail normals: three octaves of world-space relief, faded out with distance so
|
|
477
|
+
// they can't alias into fireflies in the haze. gating the noise behind the fade ( a
|
|
478
|
+
// real branch ) lets the far majority of this fragment-bound terrain skip the taps.
|
|
479
|
+
const detailFade = smoothstep( 420, 60, distance );
|
|
480
|
+
const reliefStrength = mix( float( 0.25 ), float( 0.55 ), steep ); // more on rock, less on grass
|
|
481
|
+
const relief = Fn( () => {
|
|
482
|
+
|
|
483
|
+
const r = float( 0 ).toVar();
|
|
484
|
+
|
|
485
|
+
If( detailFade.greaterThan( 0.01 ), () => {
|
|
486
|
+
|
|
487
|
+
r.assign( mx_noise_float( positionWorld.xz.mul( 0.6 ) )
|
|
488
|
+
.add( mx_noise_float( positionWorld.xz.mul( 1.7 ) ).mul( 0.5 ) )
|
|
489
|
+
.add( mx_noise_float( positionWorld.xz.mul( 4.0 ) ).mul( 0.25 ) )
|
|
490
|
+
.mul( reliefStrength ).mul( detailFade ).mul( 0.25 ) );
|
|
491
|
+
|
|
492
|
+
} );
|
|
493
|
+
|
|
494
|
+
return r;
|
|
495
|
+
|
|
496
|
+
} )();
|
|
497
|
+
|
|
498
|
+
material.normalNode = bumpNormal( relief );
|
|
499
|
+
|
|
500
|
+
return material;
|
|
501
|
+
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
export { TerrainGenerator };
|