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,325 @@
|
|
|
1
|
+
import { Fn, If, PI, clamp, cos, cross, dot, equirectUV, float, log, max, mix, normalize, pow, reflect, sin, sqrt, struct, vec3 } from 'three/tsl';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Specular / microfacet BRDF helpers: VNDF sampling, GTR distribution, Smith geometry,
|
|
5
|
+
* Fresnel, reflection importance sampling, parallax-corrected ray-length terms, and
|
|
6
|
+
* equirectangular environment sampling / MIS helpers.
|
|
7
|
+
* Pure TSL functions of their inputs (no scene/camera state).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Sentinel ray length the SSR pass writes for environment misses (no screen-space hit), set far above
|
|
12
|
+
* any real hit distance so a single magnitude test separates misses from hits and survives `.max( 0 )`.
|
|
13
|
+
*
|
|
14
|
+
* @type {number}
|
|
15
|
+
*/
|
|
16
|
+
export const ENV_RAY_LENGTH = 1e4;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Classification threshold for {@link ENV_RAY_LENGTH}: above this is an env miss, below a real hit.
|
|
20
|
+
* An order of magnitude under the sentinel, robust to fp16 storage and bilinear blending at borders.
|
|
21
|
+
*
|
|
22
|
+
* @type {number}
|
|
23
|
+
*/
|
|
24
|
+
export const ENV_RAY_LENGTH_THRESHOLD = 1e3;
|
|
25
|
+
|
|
26
|
+
// Bounded-VNDF sampler (Eto & Tokuyoshi 2023; spherical-cap form, Dupuy & Benyoub 2023)
|
|
27
|
+
const SampleGGXVNDF = Fn( ( [ V, ax, ay, r1, r2 ] ) => {
|
|
28
|
+
|
|
29
|
+
// Warp the view direction to the hemisphere ("standard") configuration.
|
|
30
|
+
const wiStd = normalize( vec3( ax.mul( V.x ), ay.mul( V.y ), V.z ) ).toVar();
|
|
31
|
+
|
|
32
|
+
// Isotropic bound on the spherical cap (Eto & Tokuyoshi eq. 5). alpha ∈ [0,1] here,
|
|
33
|
+
// so the sign term in `s` is always +1 and is dropped.
|
|
34
|
+
const a = ax.min( ay ).toVar();
|
|
35
|
+
const s = float( 1.0 ).add( V.xy.length() ).toVar();
|
|
36
|
+
const a2 = a.mul( a ).toVar();
|
|
37
|
+
const s2 = s.mul( s ).toVar();
|
|
38
|
+
const k = a2.oneMinus().mul( s2 ).div( s2.add( a2.mul( V.z ).mul( V.z ) ) ).toVar();
|
|
39
|
+
|
|
40
|
+
// Tighten the cap with the bound (upper hemisphere; N·V ≥ 0 in our usage).
|
|
41
|
+
const b = wiStd.z.mul( k ).toVar();
|
|
42
|
+
|
|
43
|
+
// Sample the (bounded) spherical cap.
|
|
44
|
+
const phi = float( 6.283185307179586 ).mul( r1 ).toVar(); // 2*pi
|
|
45
|
+
const z = r2.oneMinus().mul( float( 1.0 ).add( b ) ).sub( b ).toVar();
|
|
46
|
+
const sinTheta = sqrt( max( float( 0.0 ), float( 1.0 ).sub( z.mul( z ) ) ) ).toVar();
|
|
47
|
+
const c = vec3( sinTheta.mul( cos( phi ) ), sinTheta.mul( sin( phi ) ), z ).toVar();
|
|
48
|
+
|
|
49
|
+
// Microfacet normal in the standard config, then warp back to the ellipsoid (unstretch).
|
|
50
|
+
const wmStd = c.add( wiStd ).toVar();
|
|
51
|
+
const Ne = normalize( vec3(
|
|
52
|
+
ax.mul( wmStd.x ),
|
|
53
|
+
ay.mul( wmStd.y ),
|
|
54
|
+
max( float( 0.0 ), wmStd.z )
|
|
55
|
+
) ).toVar();
|
|
56
|
+
|
|
57
|
+
return Ne;
|
|
58
|
+
|
|
59
|
+
}, {
|
|
60
|
+
name: 'SampleGGXVNDF',
|
|
61
|
+
type: 'vec3',
|
|
62
|
+
inputs: [
|
|
63
|
+
{ name: 'V', type: 'vec3' },
|
|
64
|
+
{ name: 'ax', type: 'float' },
|
|
65
|
+
{ name: 'ay', type: 'float' },
|
|
66
|
+
{ name: 'r1', type: 'float' },
|
|
67
|
+
{ name: 'r2', type: 'float' },
|
|
68
|
+
]
|
|
69
|
+
} );
|
|
70
|
+
|
|
71
|
+
// Generalized Trowbridge-Reitz (GTR). For GGX set k=2.
|
|
72
|
+
// D_GTR(roughness, NoH, k) where roughness = α (not α²).
|
|
73
|
+
export const D_GTR = Fn( ( [ roughness, NoH, k ] ) => {
|
|
74
|
+
|
|
75
|
+
// see: Filament - Normal distribution function (specular D) - 4.4.1
|
|
76
|
+
const a2 = roughness.mul( roughness ).toVar(); // α²
|
|
77
|
+
const NoH2 = NoH.mul( NoH ).toVar();
|
|
78
|
+
const base = NoH2.mul( a2.sub( float( 1.0 ) ) ).add( float( 1.0 ) ).toVar();
|
|
79
|
+
// a² / (π * base^k)
|
|
80
|
+
return a2.div( PI.mul( pow( base, k ) ) ).toVar(); // float
|
|
81
|
+
|
|
82
|
+
} );
|
|
83
|
+
|
|
84
|
+
// Smith G1 (Heitz): expects alpha (not squared); it squares internally
|
|
85
|
+
export const SmithG = Fn( ( [ NDotX, alpha ] ) => {
|
|
86
|
+
|
|
87
|
+
// see: Filament - Geometric shadowing (specular G) - 4.4.2
|
|
88
|
+
|
|
89
|
+
const a2 = alpha.mul( alpha ).toVar(); // α²
|
|
90
|
+
const NDotX2 = NDotX.mul( NDotX ).toVar(); // (N·X)²
|
|
91
|
+
return float( 2.0 ).mul( NDotX ).div(
|
|
92
|
+
NDotX.add( sqrt(
|
|
93
|
+
a2.add( a2.oneMinus().mul( NDotX2 ) )
|
|
94
|
+
) )
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
} );
|
|
98
|
+
|
|
99
|
+
// Geometry term G = G1(N·L, α_G) * G1(N·V, α_G) (α_G is NOT squared here)
|
|
100
|
+
export const GeometryTerm = Fn( ( [ NoL, NoV, alphaG ] ) => {
|
|
101
|
+
|
|
102
|
+
const G1v = SmithG( NoV, alphaG ).toVar();
|
|
103
|
+
const G1l = SmithG( NoL, alphaG ).toVar();
|
|
104
|
+
return G1v.mul( G1l ).toVar();
|
|
105
|
+
|
|
106
|
+
} );
|
|
107
|
+
|
|
108
|
+
// Bounded VNDF direction PDF (reflection mapping), matching SampleGGXVNDF above.
|
|
109
|
+
// p(L) = D_GTR(roughness, NoH, 2) / ( 2 * (k * N·V + t) ) (Eto & Tokuyoshi eq. 8)
|
|
110
|
+
// with the isotropic cap bound k and t = ‖(α·V.xy, V.z)‖. Here 'roughness' is α, not α².
|
|
111
|
+
const GGXVNDFPdf = Fn( ( [ NoH, NoV, roughness ] ) => {
|
|
112
|
+
|
|
113
|
+
const D = D_GTR( roughness, NoH, float( 2.0 ) ).toVar();
|
|
114
|
+
const a2 = roughness.mul( roughness ).toVar();
|
|
115
|
+
const sinV2 = max( float( 0.0 ), float( 1.0 ).sub( NoV.mul( NoV ) ) ).toVar(); // ‖V.xy‖²
|
|
116
|
+
const s = float( 1.0 ).add( sqrt( sinV2 ) ).toVar();
|
|
117
|
+
const s2 = s.mul( s ).toVar();
|
|
118
|
+
const k = float( 1.0 ).sub( a2 ).mul( s2 ).div( s2.add( a2.mul( NoV ).mul( NoV ) ) ).toVar();
|
|
119
|
+
const t = sqrt( a2.mul( sinV2 ).add( NoV.mul( NoV ) ) ).toVar();
|
|
120
|
+
return D.div( max( float( 1e-6 ), float( 2.0 ).mul( k.mul( NoV ).add( t ) ) ) ).toVar();
|
|
121
|
+
|
|
122
|
+
} );
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Fresnel reflectance for the Schlick approximation.
|
|
126
|
+
*/
|
|
127
|
+
export const F_Schlick = Fn( ( [ f0, theta ] ) => {
|
|
128
|
+
|
|
129
|
+
const oneMinus = float( 1.0 ).sub( theta ).toVar();
|
|
130
|
+
const oneMinus2 = oneMinus.mul( oneMinus ).toVar();
|
|
131
|
+
const oneMinus5 = oneMinus2.mul( oneMinus2 ).mul( oneMinus ).toVar();
|
|
132
|
+
return f0.add( vec3( 1.0 ).sub( f0 ).mul( oneMinus5 ) ).toVar(); // vec3
|
|
133
|
+
|
|
134
|
+
} );
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Specular dominant factor for parallax-corrected ray length.
|
|
138
|
+
* From REBLUR: A Hierarchical Recurrent Denoiser (NRD).
|
|
139
|
+
*/
|
|
140
|
+
export const getSpecularDominantFactor = Fn( ( [ NoV, roughness ] ) => {
|
|
141
|
+
|
|
142
|
+
const a = float( 0.298475 ).mul(
|
|
143
|
+
log( float( 39.4115 ).sub( float( 39.0029 ).mul( roughness ) ) )
|
|
144
|
+
);
|
|
145
|
+
const f = float( 1.0 ).sub( NoV ).pow( 10.8649 )
|
|
146
|
+
.mul( float( 1.0 ).sub( a ) )
|
|
147
|
+
.add( a );
|
|
148
|
+
return clamp( f );
|
|
149
|
+
|
|
150
|
+
} ).setLayout( {
|
|
151
|
+
name: 'getSpecularDominantFactor',
|
|
152
|
+
type: 'float',
|
|
153
|
+
inputs: [
|
|
154
|
+
{ name: 'NoV', type: 'float' },
|
|
155
|
+
{ name: 'roughness', type: 'float' }
|
|
156
|
+
]
|
|
157
|
+
} );
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Everything a single GGX reflection sample produces. `reflectDir` and `sampleWeight`
|
|
161
|
+
* drive the SSR ray-march and compositing; `pdf`, `NdotV`, `alpha` and `f0` are the GGX
|
|
162
|
+
* terms the env-miss MIS fallback needs so the caller never re-derives microfacet math.
|
|
163
|
+
*/
|
|
164
|
+
const ggxReflectionStruct = struct( {
|
|
165
|
+
reflectDir: 'vec3', // view-space reflected ray direction
|
|
166
|
+
sampleWeight: 'vec3', // chromatic weight (incl. Fresnel tint) to multiply gathered radiance by
|
|
167
|
+
pdf: 'float', // VNDF direction pdf (for MIS against the env CDF)
|
|
168
|
+
NdotV: 'float',
|
|
169
|
+
alpha: 'float', // GGX alpha (roughness²), clamped
|
|
170
|
+
f0: 'vec3' // Fresnel reflectance at normal incidence
|
|
171
|
+
} );
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Importance-samples the GGX/VNDF specular lobe for one pixel and returns the reflected
|
|
175
|
+
* ray direction plus the Monte-Carlo weight to apply to the gathered radiance, along with
|
|
176
|
+
* the GGX terms the SSR env-miss MIS fallback needs.
|
|
177
|
+
*
|
|
178
|
+
* @param {Node<vec3>} N - View-space shading normal (normalized).
|
|
179
|
+
* @param {Node<vec3>} V - View-space surface→camera direction (normalized).
|
|
180
|
+
* @param {Node<float>} roughness - Perceptual roughness in `[0,1]`.
|
|
181
|
+
* @param {Node<float>} metalness - Metalness in `[0,1]`.
|
|
182
|
+
* @param {Node<vec3>} albedo - Surface base color; tints the metal Fresnel reflectance (`f0`).
|
|
183
|
+
* @param {Node<vec4>} Xi - Per-pixel random numbers; only `.xy` are used.
|
|
184
|
+
* @return {ggxReflectionStruct}
|
|
185
|
+
*/
|
|
186
|
+
export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, Xi ] ) => {
|
|
187
|
+
|
|
188
|
+
// GGX alpha (use r^2, clamp to avoid degenerate)
|
|
189
|
+
const a = roughness.mul( roughness ).max( 0.001 ).toVar();
|
|
190
|
+
const ax = a.toVar();
|
|
191
|
+
const ay = a.toVar();
|
|
192
|
+
|
|
193
|
+
// TBN from view-space normal
|
|
194
|
+
const up = vec3( 0, 0, 1 );
|
|
195
|
+
let T = cross( up, N ).toVar();
|
|
196
|
+
T = T.normalize().toVar();
|
|
197
|
+
If( T.length().lessThan( 1e-3 ), () => {
|
|
198
|
+
|
|
199
|
+
T.assign( cross( vec3( 0, 1, 0 ), N ).normalize() );
|
|
200
|
+
|
|
201
|
+
} );
|
|
202
|
+
const B = cross( N, T ).normalize().toVar();
|
|
203
|
+
|
|
204
|
+
// transform V to LOCAL frame (N = +Z)
|
|
205
|
+
const Vlocal = vec3( dot( T, V ), dot( B, V ), dot( N, V ) ).toVar();
|
|
206
|
+
|
|
207
|
+
// VNDF sample **in local frame**
|
|
208
|
+
const Hlocal = SampleGGXVNDF( Vlocal, ax, ay, Xi.x, Xi.y ).toVar();
|
|
209
|
+
If( Hlocal.z.lessThan( 0 ), () => {
|
|
210
|
+
|
|
211
|
+
Hlocal.assign( Hlocal.negate() );
|
|
212
|
+
|
|
213
|
+
} );
|
|
214
|
+
|
|
215
|
+
// transform H back to VIEW space
|
|
216
|
+
const h = normalize( T.mul( Hlocal.x ).add( B.mul( Hlocal.y ) ).add( N.mul( Hlocal.z ) ) ).toVar();
|
|
217
|
+
|
|
218
|
+
// reflect with V (surface->camera) and H
|
|
219
|
+
const viewReflectDir = reflect( V.negate(), h ).normalize().toVar();
|
|
220
|
+
|
|
221
|
+
// BRDF/PDF evaluation for the sampled direction
|
|
222
|
+
// V: surface -> camera, L: reflected direction, N: normal, H: half-vector
|
|
223
|
+
const L = viewReflectDir.toVar();
|
|
224
|
+
const H = normalize( V.add( L ) ).toVar(); // ~h; recomputed for robustness
|
|
225
|
+
|
|
226
|
+
const NdotV = max( float( 0.0 ), dot( N, V ) ).toVar();
|
|
227
|
+
const NdotL = max( float( 0.0 ), dot( N, L ) ).toVar();
|
|
228
|
+
const NdotH = max( float( 0.0 ), dot( N, H ) ).toVar();
|
|
229
|
+
const VdotH = max( float( 0.0 ), dot( V, H ) ).toVar();
|
|
230
|
+
|
|
231
|
+
const f0 = mix( vec3( 0.04 ), albedo, metalness ).toVar();
|
|
232
|
+
// Chromatic Fresnel reflectance: for metals f0 = albedo, so the reflection is tinted and desaturates
|
|
233
|
+
// toward white at grazing angles. Kept as vec3 so colored metals reflect with the correct chroma.
|
|
234
|
+
const fresnelWeight = F_Schlick( f0, VdotH ).toVar(); // vec3
|
|
235
|
+
|
|
236
|
+
// Bounded-VNDF direction pdf — still needed for the env-miss MIS path.
|
|
237
|
+
const pdf = GGXVNDFPdf( NdotH, NdotV, ax ).toVar();
|
|
238
|
+
|
|
239
|
+
// Numerically stable importance weight: brdf·NdotL/pdf ≡ fresnel·G2·(k·NdotV + t)/(2·NdotV), which
|
|
240
|
+
// cancels the GGX D analytically. Evaluating D explicitly is catastrophic at low roughness
|
|
241
|
+
// (D → 3e5 at α = 0.001 wrecks f32 precision); the cancelled form stays stable down to a mirror.
|
|
242
|
+
// (k·NdotV + t) is the bounded-cap normalization; k shrinks the cap to drop below-horizon samples.
|
|
243
|
+
const a2 = ax.mul( ax ).toVar();
|
|
244
|
+
const sinV2 = NdotV.mul( NdotV ).oneMinus().max( 0.0 ).toVar(); // ‖V.xy‖²
|
|
245
|
+
const sB = float( 1.0 ).add( sqrt( sinV2 ) ).toVar();
|
|
246
|
+
const s2B = sB.mul( sB ).toVar();
|
|
247
|
+
const kB = a2.oneMinus().mul( s2B ).div( s2B.add( a2.mul( NdotV ).mul( NdotV ) ) ).toVar();
|
|
248
|
+
const tB = sqrt( a2.mul( sinV2 ).add( NdotV.mul( NdotV ) ) ).toVar();
|
|
249
|
+
const glossyWeight = fresnelWeight
|
|
250
|
+
.mul( GeometryTerm( NdotL, NdotV, ax ) )
|
|
251
|
+
.mul( kB.mul( NdotV ).add( tB ) )
|
|
252
|
+
.div( float( 2.0 ).mul( NdotV ).max( 1e-4 ) ).toVar();
|
|
253
|
+
|
|
254
|
+
return ggxReflectionStruct( viewReflectDir, glossyWeight, pdf, NdotV, ax, f0 );
|
|
255
|
+
|
|
256
|
+
} );
|
|
257
|
+
|
|
258
|
+
// Equirectangular environment sampling
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Equirectangular direction / UV / PDF helpers and MIS weighting shared by environment sampling code.
|
|
262
|
+
* Env-miss MIS integration lives in {@link ImportanceSampledEnvironment}.
|
|
263
|
+
*
|
|
264
|
+
* Equirectangular parameterization helpers used with CDF importance sampling are adapted from
|
|
265
|
+
* [three-gpu-pathtracer](https://github.com/gkjohnson/three-gpu-pathtracer).
|
|
266
|
+
*
|
|
267
|
+
* @see {@link https://github.com/gkjohnson/three-gpu-pathtracer}
|
|
268
|
+
*/
|
|
269
|
+
|
|
270
|
+
// uv -> direction (equirectangular)
|
|
271
|
+
export const equirectUvToDir = Fn( ( [ uvIn ] ) => {
|
|
272
|
+
|
|
273
|
+
const phi = uvIn.x.mul( Math.PI * 2 ).sub( Math.PI );
|
|
274
|
+
const lat = uvIn.y.sub( 0.5 ).mul( Math.PI );
|
|
275
|
+
const cosLat = cos( lat );
|
|
276
|
+
return normalize( vec3(
|
|
277
|
+
cosLat.mul( cos( phi ) ),
|
|
278
|
+
sin( lat ),
|
|
279
|
+
cosLat.mul( sin( phi ) )
|
|
280
|
+
) );
|
|
281
|
+
|
|
282
|
+
} ).setLayout( {
|
|
283
|
+
name: 'equirectUvToDir',
|
|
284
|
+
type: 'vec3',
|
|
285
|
+
inputs: [ { name: 'uv', type: 'vec2' } ]
|
|
286
|
+
} );
|
|
287
|
+
|
|
288
|
+
// Solid-angle PDF of a direction under equirectangular parameterization.
|
|
289
|
+
export const equirectDirPdf = Fn( ( [ direction ] ) => {
|
|
290
|
+
|
|
291
|
+
const uvDir = equirectUV( direction );
|
|
292
|
+
const sinTheta = sin( uvDir.y.mul( Math.PI ) );
|
|
293
|
+
return sinTheta.abs().lessThan( float( 1e-6 ) ).select(
|
|
294
|
+
float( 0 ),
|
|
295
|
+
float( 1 ).div( float( 2 * Math.PI * Math.PI ).mul( sinTheta ) )
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
} ).setLayout( {
|
|
299
|
+
name: 'equirectDirPdf',
|
|
300
|
+
type: 'float',
|
|
301
|
+
inputs: [ { name: 'direction', type: 'vec3' } ]
|
|
302
|
+
} );
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* MIS power heuristic with β = 2: `pdfA² / (pdfA² + pdfB²)`.
|
|
306
|
+
* Weights the contribution of the strategy that produced `pdfA` against the other strategy.
|
|
307
|
+
*
|
|
308
|
+
* @see Eric Veach, *Optimally Combining Sampling Techniques for Monte Carlo Rendering*
|
|
309
|
+
* @tsl
|
|
310
|
+
*/
|
|
311
|
+
export const misPowerHeuristic = Fn( ( [ pdfA, pdfB ] ) => {
|
|
312
|
+
|
|
313
|
+
const pdfASq = pdfA.mul( pdfA );
|
|
314
|
+
const pdfBSq = pdfB.mul( pdfB );
|
|
315
|
+
return pdfASq.div( pdfASq.add( pdfBSq ) );
|
|
316
|
+
|
|
317
|
+
} ).setLayout( {
|
|
318
|
+
name: 'misPowerHeuristic',
|
|
319
|
+
type: 'float',
|
|
320
|
+
inputs: [
|
|
321
|
+
{ name: 'pdfA', type: 'float' },
|
|
322
|
+
{ name: 'pdfB', type: 'float' }
|
|
323
|
+
]
|
|
324
|
+
} );
|
|
325
|
+
|
|
@@ -39,13 +39,13 @@ function computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {
|
|
|
39
39
|
|
|
40
40
|
if ( ! MikkTSpace || ! MikkTSpace.isReady ) {
|
|
41
41
|
|
|
42
|
-
throw new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );
|
|
42
|
+
throw new Error( 'THREE.BufferGeometryUtils: Initialized MikkTSpace library required.' );
|
|
43
43
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
if ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {
|
|
47
47
|
|
|
48
|
-
throw new Error( 'BufferGeometryUtils: Tangents require "position", "normal", and "uv" attributes.' );
|
|
48
|
+
throw new Error( 'THREE.BufferGeometryUtils: Tangents require "position", "normal", and "uv" attributes.' );
|
|
49
49
|
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -286,8 +286,7 @@ function mergeGeometries( geometries, useGroups = false ) {
|
|
|
286
286
|
for ( const name in morphAttributes ) {
|
|
287
287
|
|
|
288
288
|
const numMorphTargets = morphAttributes[ name ][ 0 ].length;
|
|
289
|
-
|
|
290
|
-
if ( numMorphTargets === 0 ) break;
|
|
289
|
+
if ( numMorphTargets === 0 ) continue;
|
|
291
290
|
|
|
292
291
|
mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};
|
|
293
292
|
mergedGeometry.morphAttributes[ name ] = [];
|
|
@@ -1021,7 +1020,7 @@ function computeMorphedAttributes( object ) {
|
|
|
1021
1020
|
const morphPosition = geometry.morphAttributes.position;
|
|
1022
1021
|
const morphTargetsRelative = geometry.morphTargetsRelative;
|
|
1023
1022
|
const normalAttribute = geometry.attributes.normal;
|
|
1024
|
-
const morphNormal = geometry.morphAttributes.
|
|
1023
|
+
const morphNormal = geometry.morphAttributes.normal;
|
|
1025
1024
|
|
|
1026
1025
|
const groups = geometry.groups;
|
|
1027
1026
|
const drawRange = geometry.drawRange;
|
|
@@ -1315,105 +1314,172 @@ function mergeGroups( geometry ) {
|
|
|
1315
1314
|
*/
|
|
1316
1315
|
function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {
|
|
1317
1316
|
|
|
1317
|
+
// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed
|
|
1318
|
+
// and returns the original geometry
|
|
1319
|
+
const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;
|
|
1320
|
+
const posAttr = resultGeometry.attributes.position;
|
|
1321
|
+
const vertexCount = posAttr.count;
|
|
1322
|
+
|
|
1323
|
+
let positions;
|
|
1324
|
+
|
|
1325
|
+
if ( posAttr.isBufferAttribute === true && posAttr.itemSize === 3 && posAttr.normalized === false ) {
|
|
1326
|
+
|
|
1327
|
+
positions = posAttr.array;
|
|
1328
|
+
|
|
1329
|
+
} else {
|
|
1330
|
+
|
|
1331
|
+
// flatten the position buffer so the math below operates on plain numbers
|
|
1332
|
+
positions = new Float64Array( vertexCount * 3 );
|
|
1333
|
+
|
|
1334
|
+
for ( let i = 0; i < vertexCount; i ++ ) {
|
|
1335
|
+
|
|
1336
|
+
positions[ 3 * i + 0 ] = posAttr.getX( i );
|
|
1337
|
+
positions[ 3 * i + 1 ] = posAttr.getY( i );
|
|
1338
|
+
positions[ 3 * i + 2 ] = posAttr.getZ( i );
|
|
1339
|
+
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1318
1344
|
const creaseDot = Math.cos( creaseAngle );
|
|
1319
1345
|
const hashMultiplier = ( 1 + 1e-10 ) * 1e2;
|
|
1346
|
+
const faceCount = vertexCount / 3;
|
|
1347
|
+
|
|
1348
|
+
// compute the normal of each face
|
|
1349
|
+
const faceNormals = new Float64Array( faceCount * 3 );
|
|
1350
|
+
for ( let f = 0; f < faceCount; f ++ ) {
|
|
1320
1351
|
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
const tempNorm = new Vector3();
|
|
1326
|
-
const tempNorm2 = new Vector3();
|
|
1352
|
+
const f9 = 9 * f;
|
|
1353
|
+
const ax = positions[ f9 + 0 ], ay = positions[ f9 + 1 ], az = positions[ f9 + 2 ];
|
|
1354
|
+
const bx = positions[ f9 + 3 ], by = positions[ f9 + 4 ], bz = positions[ f9 + 5 ];
|
|
1355
|
+
const cx = positions[ f9 + 6 ], cy = positions[ f9 + 7 ], cz = positions[ f9 + 8 ];
|
|
1327
1356
|
|
|
1328
|
-
|
|
1329
|
-
|
|
1357
|
+
const v1x = cx - bx, v1y = cy - by, v1z = cz - bz;
|
|
1358
|
+
const v2x = ax - bx, v2y = ay - by, v2z = az - bz;
|
|
1330
1359
|
|
|
1331
|
-
const
|
|
1332
|
-
const
|
|
1333
|
-
const
|
|
1334
|
-
|
|
1360
|
+
const nx = v1y * v2z - v1z * v2y;
|
|
1361
|
+
const ny = v1z * v2x - v1x * v2z;
|
|
1362
|
+
const nz = v1x * v2y - v1y * v2x;
|
|
1363
|
+
|
|
1364
|
+
const invLength = 1 / ( Math.sqrt( nx * nx + ny * ny + nz * nz ) || 1 );
|
|
1365
|
+
faceNormals[ 3 * f + 0 ] = nx * invLength;
|
|
1366
|
+
faceNormals[ 3 * f + 1 ] = ny * invLength;
|
|
1367
|
+
faceNormals[ 3 * f + 2 ] = nz * invLength;
|
|
1335
1368
|
|
|
1336
1369
|
}
|
|
1337
1370
|
|
|
1338
|
-
//
|
|
1339
|
-
//
|
|
1340
|
-
const
|
|
1341
|
-
const
|
|
1342
|
-
const vertexMap = {};
|
|
1371
|
+
// assign an id to each vertex, sharing the id between vertices with the same
|
|
1372
|
+
// quantized position via an open-addressed hash table (slots hold id + 1, 0 means empty)
|
|
1373
|
+
const vertexIds = new Int32Array( vertexCount );
|
|
1374
|
+
const quantized = new Int32Array( vertexCount * 3 );
|
|
1343
1375
|
|
|
1344
|
-
|
|
1345
|
-
|
|
1376
|
+
let tableSize = 1;
|
|
1377
|
+
while ( tableSize < vertexCount * 2 ) tableSize <<= 1;
|
|
1378
|
+
const tableMask = tableSize - 1;
|
|
1379
|
+
const table = new Int32Array( tableSize );
|
|
1380
|
+
|
|
1381
|
+
let uniqueCount = 0;
|
|
1382
|
+
for ( let i = 0; i < vertexCount; i ++ ) {
|
|
1346
1383
|
|
|
1347
1384
|
const i3 = 3 * i;
|
|
1348
|
-
const
|
|
1349
|
-
const
|
|
1350
|
-
const
|
|
1385
|
+
const qx = ~ ~ ( positions[ i3 + 0 ] * hashMultiplier );
|
|
1386
|
+
const qy = ~ ~ ( positions[ i3 + 1 ] * hashMultiplier );
|
|
1387
|
+
const qz = ~ ~ ( positions[ i3 + 2 ] * hashMultiplier );
|
|
1351
1388
|
|
|
1352
|
-
|
|
1353
|
-
tempVec2.subVectors( a, b );
|
|
1389
|
+
let slot = ( Math.imul( qx, 73856093 ) ^ Math.imul( qy, 19349663 ) ^ Math.imul( qz, 83492791 ) ) & tableMask;
|
|
1354
1390
|
|
|
1355
|
-
|
|
1356
|
-
const normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();
|
|
1357
|
-
for ( let n = 0; n < 3; n ++ ) {
|
|
1391
|
+
while ( true ) {
|
|
1358
1392
|
|
|
1359
|
-
const
|
|
1360
|
-
const hash = hashVertex( vert );
|
|
1361
|
-
if ( ! ( hash in vertexMap ) ) {
|
|
1393
|
+
const id = table[ slot ];
|
|
1362
1394
|
|
|
1363
|
-
|
|
1395
|
+
if ( id === 0 ) {
|
|
1396
|
+
|
|
1397
|
+
const q3 = 3 * uniqueCount;
|
|
1398
|
+
quantized[ q3 + 0 ] = qx;
|
|
1399
|
+
quantized[ q3 + 1 ] = qy;
|
|
1400
|
+
quantized[ q3 + 2 ] = qz;
|
|
1401
|
+
|
|
1402
|
+
table[ slot ] = uniqueCount + 1;
|
|
1403
|
+
vertexIds[ i ] = uniqueCount ++;
|
|
1404
|
+
break;
|
|
1364
1405
|
|
|
1365
1406
|
}
|
|
1366
1407
|
|
|
1367
|
-
|
|
1408
|
+
const q3 = 3 * ( id - 1 );
|
|
1409
|
+
|
|
1410
|
+
if ( quantized[ q3 + 0 ] === qx && quantized[ q3 + 1 ] === qy && quantized[ q3 + 2 ] === qz ) {
|
|
1411
|
+
|
|
1412
|
+
vertexIds[ i ] = id - 1;
|
|
1413
|
+
break;
|
|
1414
|
+
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
slot = ( slot + 1 ) & tableMask;
|
|
1368
1418
|
|
|
1369
1419
|
}
|
|
1370
1420
|
|
|
1371
1421
|
}
|
|
1372
1422
|
|
|
1373
|
-
//
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
for ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {
|
|
1423
|
+
// bucket the faces surrounding each unique vertex position
|
|
1424
|
+
const bucketOffsets = new Int32Array( uniqueCount + 1 );
|
|
1425
|
+
for ( let i = 0; i < vertexCount; i ++ ) bucketOffsets[ vertexIds[ i ] + 1 ] ++;
|
|
1426
|
+
for ( let i = 0; i < uniqueCount; i ++ ) bucketOffsets[ i + 1 ] += bucketOffsets[ i ];
|
|
1378
1427
|
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
const
|
|
1428
|
+
const bucketFaces = new Int32Array( vertexCount );
|
|
1429
|
+
const bucketCursors = bucketOffsets.slice( 0, uniqueCount );
|
|
1430
|
+
for ( let f = 0; f < faceCount; f ++ ) {
|
|
1431
|
+
|
|
1432
|
+
const f3 = 3 * f;
|
|
1433
|
+
bucketFaces[ bucketCursors[ vertexIds[ f3 + 0 ] ] ++ ] = f;
|
|
1434
|
+
bucketFaces[ bucketCursors[ vertexIds[ f3 + 1 ] ] ++ ] = f;
|
|
1435
|
+
bucketFaces[ bucketCursors[ vertexIds[ f3 + 2 ] ] ++ ] = f;
|
|
1384
1436
|
|
|
1385
|
-
|
|
1386
|
-
|
|
1437
|
+
}
|
|
1438
|
+
|
|
1439
|
+
// average the normals of the faces surrounding each vertex if they are within the
|
|
1440
|
+
// provided crease threshold
|
|
1441
|
+
const normalArray = new Float32Array( vertexCount * 3 );
|
|
1442
|
+
for ( let f = 0; f < faceCount; f ++ ) {
|
|
1387
1443
|
|
|
1388
|
-
|
|
1444
|
+
const f3 = 3 * f;
|
|
1445
|
+
const nx = faceNormals[ f3 + 0 ];
|
|
1446
|
+
const ny = faceNormals[ f3 + 1 ];
|
|
1447
|
+
const nz = faceNormals[ f3 + 2 ];
|
|
1389
1448
|
|
|
1390
|
-
// average all normals that meet the threshold and set the normal value
|
|
1391
1449
|
for ( let n = 0; n < 3; n ++ ) {
|
|
1392
1450
|
|
|
1393
|
-
const
|
|
1394
|
-
const
|
|
1395
|
-
|
|
1396
|
-
|
|
1451
|
+
const i = f3 + n;
|
|
1452
|
+
const id = vertexIds[ i ];
|
|
1453
|
+
|
|
1454
|
+
let sumX = 0, sumY = 0, sumZ = 0;
|
|
1455
|
+
|
|
1456
|
+
for ( let k = bucketOffsets[ id ], end = bucketOffsets[ id + 1 ]; k < end; k ++ ) {
|
|
1397
1457
|
|
|
1398
|
-
|
|
1458
|
+
const o3 = 3 * bucketFaces[ k ];
|
|
1459
|
+
const ox = faceNormals[ o3 + 0 ];
|
|
1460
|
+
const oy = faceNormals[ o3 + 1 ];
|
|
1461
|
+
const oz = faceNormals[ o3 + 2 ];
|
|
1399
1462
|
|
|
1400
|
-
|
|
1401
|
-
if ( tempNorm.dot( otherNorm ) > creaseDot ) {
|
|
1463
|
+
if ( nx * ox + ny * oy + nz * oz > creaseDot ) {
|
|
1402
1464
|
|
|
1403
|
-
|
|
1465
|
+
sumX += ox;
|
|
1466
|
+
sumY += oy;
|
|
1467
|
+
sumZ += oz;
|
|
1404
1468
|
|
|
1405
1469
|
}
|
|
1406
1470
|
|
|
1407
1471
|
}
|
|
1408
1472
|
|
|
1409
|
-
|
|
1410
|
-
|
|
1473
|
+
const invLength = 1 / ( Math.sqrt( sumX * sumX + sumY * sumY + sumZ * sumZ ) || 1 );
|
|
1474
|
+
normalArray[ 3 * i + 0 ] = sumX * invLength;
|
|
1475
|
+
normalArray[ 3 * i + 1 ] = sumY * invLength;
|
|
1476
|
+
normalArray[ 3 * i + 2 ] = sumZ * invLength;
|
|
1411
1477
|
|
|
1412
1478
|
}
|
|
1413
1479
|
|
|
1414
1480
|
}
|
|
1415
1481
|
|
|
1416
|
-
resultGeometry.setAttribute( 'normal',
|
|
1482
|
+
resultGeometry.setAttribute( 'normal', new BufferAttribute( normalArray, 3, false ) );
|
|
1417
1483
|
return resultGeometry;
|
|
1418
1484
|
|
|
1419
1485
|
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { MathUtils, SRGBColorSpace } from 'three';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @module ColorUtils
|
|
5
|
+
* @three_import import * as ColorUtils from 'three/addons/utils/ColorUtils.js';
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Sets the given color from a color temperature in Kelvin.
|
|
10
|
+
*
|
|
11
|
+
* Converts a correlated color temperature (CTT) to an approximate sRGB color
|
|
12
|
+
* using Tanner Helland's algorithm. Useful for physically-based lighting
|
|
13
|
+
* setups — e.g. candle flame (~1900K), tungsten bulb (~3200K), daylight
|
|
14
|
+
* (~6500K), or clear blue sky (~10000K). Values outside [1000, 40000] are
|
|
15
|
+
* clamped.
|
|
16
|
+
*
|
|
17
|
+
* Reference: https://tannerhelland.com/2012/09/18/convert-temperature-rgb-algorithm-code.html
|
|
18
|
+
*
|
|
19
|
+
* @param {Color} color - The color to set.
|
|
20
|
+
* @param {number} kelvin - Color temperature in Kelvin. Clamped to [1000, 40000].
|
|
21
|
+
* @return {Color} The updated color.
|
|
22
|
+
*/
|
|
23
|
+
function setKelvin( color, kelvin ) {
|
|
24
|
+
|
|
25
|
+
// Algorithm by Tanner Helland (2012). Inputs are divided by 100.
|
|
26
|
+
const temp = MathUtils.clamp( kelvin, 1000, 40000 ) / 100;
|
|
27
|
+
|
|
28
|
+
let r, g, b;
|
|
29
|
+
|
|
30
|
+
// Red channel
|
|
31
|
+
if ( temp <= 66 ) {
|
|
32
|
+
|
|
33
|
+
r = 255;
|
|
34
|
+
|
|
35
|
+
} else {
|
|
36
|
+
|
|
37
|
+
r = 329.698727446 * Math.pow( temp - 60, - 0.1332047592 );
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Green channel
|
|
42
|
+
if ( temp <= 66 ) {
|
|
43
|
+
|
|
44
|
+
g = 99.4708025861 * Math.log( temp ) - 161.1195681661;
|
|
45
|
+
|
|
46
|
+
} else {
|
|
47
|
+
|
|
48
|
+
g = 288.1221695283 * Math.pow( temp - 60, - 0.0755148492 );
|
|
49
|
+
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Blue channel
|
|
53
|
+
if ( temp >= 66 ) {
|
|
54
|
+
|
|
55
|
+
b = 255;
|
|
56
|
+
|
|
57
|
+
} else if ( temp <= 19 ) {
|
|
58
|
+
|
|
59
|
+
b = 0;
|
|
60
|
+
|
|
61
|
+
} else {
|
|
62
|
+
|
|
63
|
+
b = 138.5177312231 * Math.log( temp - 10 ) - 305.0447927307;
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return color.setRGB(
|
|
68
|
+
MathUtils.clamp( r, 0, 255 ) / 255,
|
|
69
|
+
MathUtils.clamp( g, 0, 255 ) / 255,
|
|
70
|
+
MathUtils.clamp( b, 0, 255 ) / 255,
|
|
71
|
+
SRGBColorSpace
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export { setKelvin };
|