@unikia/upe-renderer 0.186.110 → 0.187.11
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/README.md +5 -7
- package/UPSTREAM.md +4 -4
- package/build/three.core.js +853 -277
- package/build/three.module.js +1098 -1280
- package/build/three.tsl.js +41938 -686
- package/build/three.webgpu.js +10604 -49055
- package/build/three.webgpu.nodes.js +9249 -5788
- package/examples/jsm/Addons.js +2 -0
- package/examples/jsm/animation/CCDIKSolver.js +17 -5
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +27 -14
- package/examples/jsm/csm/CSMShader.js +74 -3
- package/examples/jsm/curves/CurveExtras.js +4 -4
- package/examples/jsm/curves/NURBSCurve.js +14 -0
- package/examples/jsm/exporters/EXRExporter.js +673 -16
- package/examples/jsm/exporters/GLTFExporter.js +4 -4
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/OBJExporter.js +48 -5
- package/examples/jsm/exporters/PLYExporter.js +22 -11
- package/examples/jsm/generators/CityGenerator.js +3 -2
- package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
- package/examples/jsm/gpgpu/BitonicSort.js +30 -23
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
- package/examples/jsm/inspector/Extension.js +1 -1
- package/examples/jsm/inspector/Inspector.js +6 -46
- package/examples/jsm/inspector/RendererInspector.js +43 -8
- package/examples/jsm/inspector/Storage.js +49 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
- package/examples/jsm/inspector/tabs/Parameters.js +5 -1
- package/examples/jsm/inspector/tabs/Performance.js +22 -7
- package/examples/jsm/inspector/tabs/Settings.js +1 -1
- package/examples/jsm/inspector/tabs/Timeline.js +83 -7
- package/examples/jsm/inspector/tabs/Viewer.js +25 -10
- package/examples/jsm/inspector/ui/Profiler.js +1 -1
- package/examples/jsm/inspector/ui/Style.js +21 -53
- package/examples/jsm/inspector/ui/Values.js +28 -3
- package/examples/jsm/libs/fflate.module.js +83 -56
- package/examples/jsm/libs/mikktspace.README.md +27 -0
- package/examples/jsm/libs/mikktspace.module.js +721 -109
- package/examples/jsm/lighting/ClusteredLighting.js +100 -2
- package/examples/jsm/lighting/LightMapper.js +295 -0
- package/examples/jsm/lighting/LightProbeGrid.js +242 -139
- package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
- package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
- package/examples/jsm/lights/SunLight.js +9 -4
- package/examples/jsm/lights/SunLightNode.js +3 -3
- package/examples/jsm/lines/LineMaterial.js +26 -10
- package/examples/jsm/loaders/3DMLoader.js +10 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +2 -0
- package/examples/jsm/loaders/BVHLoader.js +2 -0
- package/examples/jsm/loaders/ColladaLoader.js +8 -0
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +5 -1
- package/examples/jsm/loaders/EXRLoader.js +120 -104
- package/examples/jsm/loaders/FBXLoader.js +4 -0
- package/examples/jsm/loaders/FontLoader.js +2 -0
- package/examples/jsm/loaders/GCodeLoader.js +5 -9
- package/examples/jsm/loaders/GLTFLoader.js +112 -31
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
- package/examples/jsm/loaders/IESLoader.js +46 -12
- package/examples/jsm/loaders/JXLLoader.js +159 -0
- package/examples/jsm/loaders/KMZLoader.js +6 -0
- package/examples/jsm/loaders/KSPLATLoader.js +2 -0
- package/examples/jsm/loaders/KTX2Loader.js +49 -4
- package/examples/jsm/loaders/KTXLoader.js +5 -3
- package/examples/jsm/loaders/LDrawLoader.js +15 -22
- package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
- package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
- package/examples/jsm/loaders/LUTImageLoader.js +2 -0
- package/examples/jsm/loaders/LWOLoader.js +6 -0
- package/examples/jsm/loaders/MD2Loader.js +2 -0
- package/examples/jsm/loaders/MDDLoader.js +4 -0
- package/examples/jsm/loaders/MTLLoader.js +8 -0
- package/examples/jsm/loaders/MaterialXLoader.js +57 -5
- package/examples/jsm/loaders/NRRDLoader.js +4 -2
- package/examples/jsm/loaders/OBJLoader.js +10 -4
- package/examples/jsm/loaders/PCDLoader.js +6 -2
- package/examples/jsm/loaders/PDBLoader.js +5 -3
- package/examples/jsm/loaders/PLYLoader.js +39 -15
- package/examples/jsm/loaders/PVRLoader.js +2 -2
- package/examples/jsm/loaders/SPLATLoader.js +2 -0
- package/examples/jsm/loaders/SPZLoader.js +2 -0
- package/examples/jsm/loaders/STLLoader.js +3 -1
- package/examples/jsm/loaders/SVGLoader.js +27 -49
- package/examples/jsm/loaders/TDSLoader.js +4 -0
- package/examples/jsm/loaders/TGALoader.js +6 -5
- package/examples/jsm/loaders/TTFLoader.js +2 -0
- package/examples/jsm/loaders/USDLoader.js +14 -0
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
- package/examples/jsm/loaders/VOXLoader.js +3 -0
- package/examples/jsm/loaders/VRMLLoader.js +4 -0
- package/examples/jsm/loaders/VTKLoader.js +2 -0
- package/examples/jsm/loaders/XYZLoader.js +2 -0
- package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
- package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
- package/examples/jsm/loaders/usd/USDAParser.js +56 -47
- package/examples/jsm/loaders/usd/USDComposer.js +25 -30
- package/examples/jsm/math/ColorConverter.js +7 -3
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/OBB.js +3 -3
- package/examples/jsm/math/Octree.js +20 -17
- package/examples/jsm/objects/GaussianSplat.js +5 -4
- package/examples/jsm/objects/Reflector.js +5 -0
- package/examples/jsm/objects/SkyMesh.js +14 -7
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/physics/RapierPhysics.js +2 -2
- package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
- package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
- package/examples/jsm/postprocessing/BokehPass.js +1 -1
- package/examples/jsm/postprocessing/GTAOPass.js +26 -18
- package/examples/jsm/renderers/SVGRenderer.js +3 -2
- package/examples/jsm/shaders/GTAOShader.js +7 -4
- package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
- package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
- package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
- package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
- package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
- package/examples/jsm/tsl/display/FSR1Node.js +3 -3
- package/examples/jsm/tsl/display/FXAANode.js +3 -10
- package/examples/jsm/tsl/display/FilmNode.js +3 -3
- package/examples/jsm/tsl/display/GTAONode.js +33 -25
- package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
- package/examples/jsm/tsl/display/GodraysNode.js +5 -19
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
- package/examples/jsm/tsl/display/LensflareNode.js +3 -3
- package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
- package/examples/jsm/tsl/display/OITPassNode.js +0 -11
- package/examples/jsm/tsl/display/OutlineNode.js +107 -5
- package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
- package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
- package/examples/jsm/tsl/display/SMAANode.js +3 -3
- package/examples/jsm/tsl/display/SSAONode.js +6 -20
- package/examples/jsm/tsl/display/SSGINode.js +36 -29
- package/examples/jsm/tsl/display/SSRNode.js +135 -63
- package/examples/jsm/tsl/display/SSSNode.js +6 -20
- package/examples/jsm/tsl/display/SharpenNode.js +3 -3
- package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
- package/examples/jsm/tsl/display/TAAUNode.js +10 -42
- package/examples/jsm/tsl/display/TRAANode.js +11 -43
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
- package/examples/jsm/tsl/display/TransitionNode.js +3 -3
- package/examples/jsm/tsl/display/lensDirt.js +30 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
- package/examples/jsm/tsl/utils/Raymarching.js +1 -1
- package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
- package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
- package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
- package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
- package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -1
- package/examples/jsm/utils/SceneUtils.js +1 -1
- package/examples/jsm/utils/unwrapUVs.js +865 -0
- package/examples/jsm/webxr/XREstimatedLight.js +11 -4
- package/package.json +3 -3
- package/src/Three.TSL.js +2 -683
- package/src/Three.WebGPU.Nodes.js +2 -1
- package/src/Three.WebGPU.js +2 -1
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationUtils.js +1 -3
- package/src/animation/KeyframeTrack.js +19 -0
- package/src/cameras/ArrayCamera.js +12 -0
- package/src/cameras/CubeCamera.js +3 -3
- package/src/constants.js +1 -9
- package/src/core/BufferAttribute.js +57 -21
- package/src/core/BufferGeometry.js +5 -13
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +28 -18
- package/src/core/InterleavedBufferAttribute.js +54 -20
- package/src/core/Object3D.js +19 -9
- package/src/core/Raycaster.js +2 -0
- package/src/core/RenderTarget.js +11 -5
- package/src/core/UniformsGroup.js +7 -3
- package/src/extras/PMREMGenerator.js +392 -685
- package/src/extras/core/Curve.js +4 -0
- package/src/extras/core/CurvePath.js +13 -0
- package/src/extras/core/ShapePath.js +1 -1
- package/src/geometries/EdgesGeometry.js +12 -10
- package/src/geometries/LatheGeometry.js +2 -0
- package/src/helpers/PolarGridHelper.js +1 -1
- package/src/lights/Light.js +11 -0
- package/src/lights/LightProbe.js +2 -0
- package/src/lights/LightShadow.js +2 -0
- package/src/loaders/AnimationLoader.js +2 -0
- package/src/loaders/AudioLoader.js +2 -0
- package/src/loaders/BufferGeometryLoader.js +2 -0
- package/src/loaders/CompressedTextureLoader.js +2 -0
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/DataTextureLoader.js +2 -0
- package/src/loaders/FileLoader.js +2 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ImageLoader.js +1 -0
- package/src/loaders/Loader.js +47 -0
- package/src/loaders/MaterialLoader.js +2 -0
- package/src/loaders/ObjectLoader.js +27 -8
- package/src/loaders/TextureLoader.js +5 -3
- package/src/loaders/nodes/NodeLoader.js +2 -0
- package/src/materials/Material.js +21 -2
- package/src/materials/MeshDepthMaterial.js +1 -1
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +1 -1
- package/src/materials/MeshMatcapMaterial.js +1 -1
- package/src/materials/MeshNormalMaterial.js +1 -1
- package/src/materials/MeshPhongMaterial.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +90 -11
- package/src/materials/MeshStandardMaterial.js +1 -1
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +32 -10
- package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
- package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
- package/src/materials/nodes/NodeMaterial.js +36 -16
- package/src/materials/nodes/NodeMaterialInstance.js +193 -0
- package/src/materials/nodes/NodeMaterials.js +1 -0
- package/src/materials/nodes/PointsNodeMaterial.js +1 -1
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
- package/src/math/Box3.js +2 -2
- package/src/math/Color.js +8 -8
- package/src/math/ColorManagement.js +2 -21
- package/src/math/FrustumArray.js +12 -0
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +2 -4
- package/src/math/MathUtils.js +33 -46
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +1 -1
- package/src/math/Matrix4.js +1 -1
- package/src/math/Triangle.js +2 -1
- package/src/math/Vector2.js +1 -1
- package/src/math/Vector3.js +1 -1
- package/src/math/Vector4.js +1 -1
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +2 -0
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/Batch.js +29 -23
- package/src/nodes/accessors/BufferAttributeNode.js +21 -1
- package/src/nodes/accessors/BuiltinNode.js +6 -0
- package/src/nodes/accessors/Camera.js +100 -93
- package/src/nodes/accessors/ClippingNode.js +17 -6
- package/src/nodes/accessors/CubeTextureNode.js +12 -24
- package/src/nodes/accessors/Instance.js +198 -160
- package/src/nodes/accessors/Lights.js +19 -6
- package/src/nodes/accessors/MaterialNode.js +33 -4
- package/src/nodes/accessors/Morph.js +81 -22
- package/src/nodes/accessors/Normal.js +0 -42
- package/src/nodes/accessors/Object3DNode.js +6 -0
- package/src/nodes/accessors/PointUVNode.js +6 -0
- package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
- package/src/nodes/accessors/ReferenceNode.js +6 -0
- package/src/nodes/accessors/Skinning.js +57 -52
- package/src/nodes/accessors/StorageBufferNode.js +3 -12
- package/src/nodes/accessors/TextureBicubic.js +30 -27
- package/src/nodes/accessors/TextureNode.js +164 -78
- package/src/nodes/accessors/TextureSizeNode.js +6 -0
- package/src/nodes/accessors/UniformArrayNode.js +8 -15
- package/src/nodes/accessors/VelocityNode.js +13 -8
- package/src/nodes/code/CodeNode.js +6 -0
- package/src/nodes/code/ExpressionNode.js +6 -0
- package/src/nodes/code/FunctionCallNode.js +3 -3
- package/src/nodes/code/FunctionNode.js +15 -13
- package/src/nodes/core/ArrayNode.js +3 -3
- package/src/nodes/core/AssignNode.js +10 -9
- package/src/nodes/core/AttributeNode.js +39 -0
- package/src/nodes/core/BypassNode.js +6 -0
- package/src/nodes/core/ConstNode.js +31 -1
- package/src/nodes/core/ContextNode.js +11 -6
- package/src/nodes/core/IndexNode.js +6 -0
- package/src/nodes/core/InputNode.js +6 -0
- package/src/nodes/core/InspectorNode.js +17 -31
- package/src/nodes/core/IsolateNode.js +8 -0
- package/src/nodes/core/Node.js +367 -67
- package/src/nodes/core/NodeBuilder.js +664 -222
- package/src/nodes/core/NodeUtils.js +25 -0
- package/src/nodes/core/NodeVar.js +10 -1
- package/src/nodes/core/OutputStructNode.js +6 -0
- package/src/nodes/core/OverrideContextNode.js +38 -37
- package/src/nodes/core/PropertyNode.js +14 -0
- package/src/nodes/core/StackNode.js +33 -21
- package/src/nodes/core/StructNode.js +6 -0
- package/src/nodes/core/StructTypeNode.js +6 -0
- package/src/nodes/core/SubBuildNode.js +8 -0
- package/src/nodes/core/TempNode.js +10 -35
- package/src/nodes/core/UniformGroupNode.js +6 -0
- package/src/nodes/core/VarNode.js +43 -135
- package/src/nodes/core/VaryingNode.js +33 -2
- package/src/nodes/display/BlendModes.js +5 -40
- package/src/nodes/display/BumpMapNode.js +17 -7
- package/src/nodes/display/ColorAdjustment.js +22 -10
- package/src/nodes/display/ColorSpaceFunctions.js +2 -14
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +6 -0
- package/src/nodes/display/NormalMapNode.js +3 -3
- package/src/nodes/display/PassNode.js +75 -16
- package/src/nodes/display/RenderOutputNode.js +22 -5
- package/src/nodes/display/ScreenNode.js +6 -0
- package/src/nodes/display/ToneMappingFunctions.js +9 -51
- package/src/nodes/display/ToneMappingNode.js +3 -3
- package/src/nodes/display/ToonOutlinePassNode.js +66 -2
- package/src/nodes/display/ViewportDepthNode.js +34 -4
- package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
- package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
- package/src/nodes/functions/BSDF/D_GGX.js +1 -8
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
- package/src/nodes/functions/BSDF/LTC.js +20 -47
- package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
- package/src/nodes/functions/PhysicalLightingModel.js +84 -51
- package/src/nodes/functions/VolumetricLightingModel.js +1 -1
- package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
- package/src/nodes/functions/material/getRoughness.js +3 -1
- package/src/nodes/geometry/RangeNode.js +52 -69
- package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
- package/src/nodes/gpgpu/BarrierNode.js +6 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
- package/src/nodes/gpgpu/ComputeNode.js +6 -0
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
- package/src/nodes/lighting/AnalyticLightNode.js +7 -14
- package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
- package/src/nodes/lighting/EnvironmentNode.js +58 -8
- package/src/nodes/lighting/IESSpotLightNode.js +19 -4
- package/src/nodes/lighting/LightProbeNode.js +2 -1
- package/src/nodes/lighting/LightUtils.js +2 -2
- package/src/nodes/lighting/LightingNode.js +6 -0
- package/src/nodes/lighting/LightsNode.js +26 -32
- package/src/nodes/lighting/PointShadowNode.js +92 -48
- package/src/nodes/lighting/ProjectorLightNode.js +1 -1
- package/src/nodes/lighting/RectAreaLightNode.js +13 -14
- package/src/nodes/lighting/ShadowBaseNode.js +9 -17
- package/src/nodes/lighting/ShadowFilterNode.js +26 -3
- package/src/nodes/lighting/ShadowNode.js +13 -11
- package/src/nodes/materialx/MaterialXColor.js +2 -14
- package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
- package/src/nodes/materialx/MaterialXNodes.js +8 -11
- package/src/nodes/materialx/MaterialXNoise.js +195 -454
- package/src/nodes/math/BitcastNode.js +5 -5
- package/src/nodes/math/BitcountNode.js +18 -46
- package/src/nodes/math/ConditionalNode.js +92 -22
- package/src/nodes/math/Hash.js +1 -1
- package/src/nodes/math/MathNode.js +86 -64
- package/src/nodes/math/MathUtils.js +2 -2
- package/src/nodes/math/OperatorNode.js +42 -59
- package/src/nodes/math/PackFloatNode.js +9 -9
- package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
- package/src/nodes/math/TriNoise3D.js +3 -23
- package/src/nodes/math/UnpackFloatNode.js +9 -9
- package/src/nodes/pmrem/PMREMNode.js +38 -75
- package/src/nodes/pmrem/PMREMUtils.js +108 -272
- package/src/nodes/procedural/Checker.js +1 -1
- package/src/nodes/tsl/TSLCore.js +199 -74
- package/src/nodes/utils/ArrayElementNode.js +19 -1
- package/src/nodes/utils/CubeMapNode.js +3 -3
- package/src/nodes/utils/DebugNode.js +2 -2
- package/src/nodes/utils/EventNode.js +6 -0
- package/src/nodes/utils/FlipNode.js +3 -3
- package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +14 -9
- package/src/nodes/utils/MemberNode.js +18 -0
- package/src/nodes/utils/PostProcessingUtils.js +20 -25
- package/src/nodes/utils/RTTNode.js +2 -0
- package/src/nodes/utils/ReflectorNode.js +24 -0
- package/src/nodes/utils/RotateNode.js +3 -3
- package/src/nodes/utils/SampleNode.js +6 -0
- package/src/nodes/utils/SetNode.js +3 -3
- package/src/nodes/utils/SplitNode.js +6 -0
- package/src/nodes/utils/UVUtils.js +2 -2
- package/src/objects/BatchedMesh.js +146 -15
- package/src/objects/InstancedMesh.js +12 -4
- package/src/objects/Line.js +20 -0
- package/src/objects/Mesh.js +8 -0
- package/src/objects/Points.js +20 -0
- package/src/objects/Skeleton.js +26 -0
- package/src/objects/SkinnedMesh.js +3 -3
- package/src/objects/Sprite.js +10 -0
- package/src/renderers/WebGLRenderer.js +104 -70
- package/src/renderers/common/Animation.js +5 -1
- package/src/renderers/common/Attributes.js +67 -57
- package/src/renderers/common/Backend.js +78 -3
- package/src/renderers/common/BindGroup.js +11 -0
- package/src/renderers/common/Binding.js +0 -11
- package/src/renderers/common/Bindings.js +116 -10
- package/src/renderers/common/Buffer.js +1 -1
- package/src/renderers/common/ClippingContext.js +12 -1
- package/src/renderers/common/ComputePipeline.js +17 -1
- package/src/renderers/common/DirectRenderPipeline.js +7 -3
- package/src/renderers/common/Geometries.js +170 -132
- package/src/renderers/common/Info.js +1 -1
- package/src/renderers/common/InspectorBase.js +5 -5
- package/src/renderers/common/Lighting.js +59 -0
- package/src/renderers/common/Pipelines.js +26 -12
- package/src/renderers/common/ProgrammableStage.js +1 -17
- package/src/renderers/common/RenderContext.js +21 -0
- package/src/renderers/common/RenderContexts.js +13 -4
- package/src/renderers/common/RenderObject.js +111 -35
- package/src/renderers/common/RenderObjects.js +37 -19
- package/src/renderers/common/Renderer.js +537 -295
- package/src/renderers/common/RendererUtils.js +15 -0
- package/src/renderers/common/StandardDrawingPipeline.js +343 -0
- package/src/renderers/common/Storage3DTexture.js +11 -0
- package/src/renderers/common/StorageArrayTexture.js +10 -0
- package/src/renderers/common/StorageTexture.js +0 -9
- package/src/renderers/common/Textures.js +144 -37
- package/src/renderers/common/UniformsGroup.js +19 -0
- package/src/renderers/common/XRManager.js +10 -91
- package/src/renderers/common/extras/PMREMGenerator.js +298 -576
- package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
- package/src/renderers/common/nodes/NodeLibrary.js +11 -35
- package/src/renderers/common/nodes/NodeManager.js +80 -31
- package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
- package/src/renderers/common/nodes/NodeSampler.js +14 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
- package/src/renderers/shaders/ShaderLib.js +3 -0
- package/src/renderers/shaders/UniformsLib.js +4 -5
- package/src/renderers/webgl/WebGLBackground.js +3 -3
- package/src/renderers/webgl/WebGLBindingStates.js +4 -2
- package/src/renderers/webgl/WebGLCapabilities.js +7 -1
- package/src/renderers/webgl/WebGLEnvironments.js +2 -2
- package/src/renderers/webgl/WebGLGeometries.js +42 -14
- package/src/renderers/webgl/WebGLMaterials.js +15 -2
- package/src/renderers/webgl/WebGLOutput.js +37 -1
- package/src/renderers/webgl/WebGLProgram.js +13 -54
- package/src/renderers/webgl/WebGLPrograms.js +22 -8
- package/src/renderers/webgl/WebGLRenderStates.js +11 -8
- package/src/renderers/webgl/WebGLShadowMap.js +6 -4
- package/src/renderers/webgl/WebGLState.js +10 -6
- package/src/renderers/webgl/WebGLTextures.js +129 -77
- package/src/renderers/webgl/WebGLUniforms.js +44 -6
- package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
- package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
- package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
- package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
- package/src/renderers/webgpu/WebGPUBackend.js +140 -82
- package/src/renderers/webgpu/WebGPURenderer.js +1 -1
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
- package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
- package/src/renderers/webxr/WebXRController.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +5 -90
- package/src/scenes/Scene.js +4 -4
- package/src/textures/CompressedTexture.js +2 -2
- package/src/textures/DepthTexture.js +2 -2
- package/src/textures/FramebufferTexture.js +11 -0
- package/src/textures/Texture.js +29 -1
- package/src/textures/TextureSource.js +1 -1
- package/src/upe.js +1 -1
- package/src/utils.js +4 -4
- package/examples/jsm/libs/surfaceNet.js +0 -201
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
|
@@ -12,26 +12,19 @@ import { Fn, float, positionView, viewportDepthTexture, perspectiveDepthToViewZ,
|
|
|
12
12
|
* @tsl
|
|
13
13
|
* @function
|
|
14
14
|
* @private
|
|
15
|
-
* @param {Node<float>}
|
|
15
|
+
* @param {Node<float>} value - The value to remap, expected in the `[0, 1]` range.
|
|
16
16
|
* @param {Node<float>} power - The contrast power. `1` is linear, higher values sharpen the transition.
|
|
17
17
|
* @return {Node<float>} The remapped value.
|
|
18
18
|
*/
|
|
19
|
-
const contrastCurve = /*@__PURE__*/ Fn( ( [
|
|
19
|
+
const contrastCurve = /*@__PURE__*/ Fn( ( [ value, power ] ) => {
|
|
20
20
|
|
|
21
|
-
const aboveHalf =
|
|
22
|
-
const folded = aboveHalf.select(
|
|
21
|
+
const aboveHalf = value.greaterThan( 0.5 ).toConst();
|
|
22
|
+
const folded = aboveHalf.select( value.oneMinus(), value ).toConst();
|
|
23
23
|
const output = folded.mul( 2 ).saturate().pow( power ).mul( 0.5 ).toConst();
|
|
24
24
|
|
|
25
25
|
return aboveHalf.select( output.oneMinus(), output );
|
|
26
26
|
|
|
27
|
-
} )
|
|
28
|
-
name: 'contrastCurve',
|
|
29
|
-
type: 'float',
|
|
30
|
-
inputs: [
|
|
31
|
-
{ name: 'input', type: 'float' },
|
|
32
|
-
{ name: 'power', type: 'float' }
|
|
33
|
-
]
|
|
34
|
-
} );
|
|
27
|
+
}, { value: 'float', power: 'float', return: 'float' } );
|
|
35
28
|
|
|
36
29
|
/**
|
|
37
30
|
* Computes an opacity node for soft particles, based on the "Soft Particles" white
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fn, If, PI, clamp, cos, cross, dot, equirectUV, float, log, max, mix, normalize, pow, reflect, sin, sqrt, struct, vec3 } from 'three/tsl';
|
|
1
|
+
import { EPSILON, Fn, If, PI, clamp, cos, cross, dot, equirectUV, float, log, max, mix, normalize, pow, reflect, sin, sqrt, struct, vec3 } from 'three/tsl';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Specular / microfacet BRDF helpers: VNDF sampling, GTR distribution, Smith geometry,
|
|
@@ -57,15 +57,12 @@ const SampleGGXVNDF = Fn( ( [ V, ax, ay, r1, r2 ] ) => {
|
|
|
57
57
|
return Ne;
|
|
58
58
|
|
|
59
59
|
}, {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
{ name: 'r1', type: 'float' },
|
|
67
|
-
{ name: 'r2', type: 'float' },
|
|
68
|
-
]
|
|
60
|
+
V: 'vec3',
|
|
61
|
+
ax: 'float',
|
|
62
|
+
ay: 'float',
|
|
63
|
+
r1: 'float',
|
|
64
|
+
r2: 'float',
|
|
65
|
+
return: 'vec3'
|
|
69
66
|
} );
|
|
70
67
|
|
|
71
68
|
// Generalized Trowbridge-Reitz (GTR). For GGX set k=2.
|
|
@@ -79,7 +76,7 @@ export const D_GTR = Fn( ( [ roughness, NoH, k ] ) => {
|
|
|
79
76
|
// a² / (π * base^k)
|
|
80
77
|
return a2.div( PI.mul( pow( base, k ) ) ).toVar(); // float
|
|
81
78
|
|
|
82
|
-
} );
|
|
79
|
+
}, { roughness: 'float', NoH: 'float', k: 'float', return: 'float' } );
|
|
83
80
|
|
|
84
81
|
// Smith G1 (Heitz): expects alpha (not squared); it squares internally
|
|
85
82
|
export const SmithG = Fn( ( [ NDotX, alpha ] ) => {
|
|
@@ -94,7 +91,7 @@ export const SmithG = Fn( ( [ NDotX, alpha ] ) => {
|
|
|
94
91
|
) )
|
|
95
92
|
);
|
|
96
93
|
|
|
97
|
-
} );
|
|
94
|
+
}, { NDotX: 'float', alpha: 'float', return: 'float' } );
|
|
98
95
|
|
|
99
96
|
// Geometry term G = G1(N·L, α_G) * G1(N·V, α_G) (α_G is NOT squared here)
|
|
100
97
|
export const GeometryTerm = Fn( ( [ NoL, NoV, alphaG ] ) => {
|
|
@@ -103,7 +100,7 @@ export const GeometryTerm = Fn( ( [ NoL, NoV, alphaG ] ) => {
|
|
|
103
100
|
const G1l = SmithG( NoL, alphaG ).toVar();
|
|
104
101
|
return G1v.mul( G1l ).toVar();
|
|
105
102
|
|
|
106
|
-
} );
|
|
103
|
+
}, { NoL: 'float', NoV: 'float', alphaG: 'float', return: 'float' } );
|
|
107
104
|
|
|
108
105
|
// Bounded VNDF direction PDF (reflection mapping), matching SampleGGXVNDF above.
|
|
109
106
|
// p(L) = D_GTR(roughness, NoH, 2) / ( 2 * (k * N·V + t) ) (Eto & Tokuyoshi eq. 8)
|
|
@@ -117,21 +114,21 @@ const GGXVNDFPdf = Fn( ( [ NoH, NoV, roughness ] ) => {
|
|
|
117
114
|
const s2 = s.mul( s ).toVar();
|
|
118
115
|
const k = float( 1.0 ).sub( a2 ).mul( s2 ).div( s2.add( a2.mul( NoV ).mul( NoV ) ) ).toVar();
|
|
119
116
|
const t = sqrt( a2.mul( sinV2 ).add( NoV.mul( NoV ) ) ).toVar();
|
|
120
|
-
return D.div( max( float(
|
|
117
|
+
return D.div( max( float( EPSILON ), float( 2.0 ).mul( k.mul( NoV ).add( t ) ) ) ).toVar();
|
|
121
118
|
|
|
122
|
-
} );
|
|
119
|
+
}, { NoH: 'float', NoV: 'float', roughness: 'float', return: 'float' } );
|
|
123
120
|
|
|
124
121
|
/**
|
|
125
122
|
* Fresnel reflectance for the Schlick approximation.
|
|
126
123
|
*/
|
|
127
|
-
export const F_Schlick = Fn( ( [ f0, theta ] ) => {
|
|
124
|
+
export const F_Schlick = Fn( ( [ f0, theta, f90 = float( 1 ) ] ) => {
|
|
128
125
|
|
|
129
126
|
const oneMinus = float( 1.0 ).sub( theta ).toVar();
|
|
130
127
|
const oneMinus2 = oneMinus.mul( oneMinus ).toVar();
|
|
131
128
|
const oneMinus5 = oneMinus2.mul( oneMinus2 ).mul( oneMinus ).toVar();
|
|
132
|
-
return f0.add( vec3(
|
|
129
|
+
return f0.add( vec3( f90 ).sub( f0 ).mul( oneMinus5 ) ).toVar(); // vec3
|
|
133
130
|
|
|
134
|
-
} );
|
|
131
|
+
}, { f0: 'vec3', theta: 'float', f90: 'float', return: 'vec3' } );
|
|
135
132
|
|
|
136
133
|
/**
|
|
137
134
|
* Specular dominant factor for parallax-corrected ray length.
|
|
@@ -147,14 +144,7 @@ export const getSpecularDominantFactor = Fn( ( [ NoV, roughness ] ) => {
|
|
|
147
144
|
.add( a );
|
|
148
145
|
return clamp( f );
|
|
149
146
|
|
|
150
|
-
} )
|
|
151
|
-
name: 'getSpecularDominantFactor',
|
|
152
|
-
type: 'float',
|
|
153
|
-
inputs: [
|
|
154
|
-
{ name: 'NoV', type: 'float' },
|
|
155
|
-
{ name: 'roughness', type: 'float' }
|
|
156
|
-
]
|
|
157
|
-
} );
|
|
147
|
+
}, { NoV: 'float', roughness: 'float', return: 'float' } );
|
|
158
148
|
|
|
159
149
|
/**
|
|
160
150
|
* Everything a single GGX reflection sample produces. `reflectDir` and `sampleWeight`
|
|
@@ -167,23 +157,12 @@ const ggxReflectionStruct = struct( {
|
|
|
167
157
|
pdf: 'float', // VNDF direction pdf (for MIS against the env CDF)
|
|
168
158
|
NdotV: 'float',
|
|
169
159
|
alpha: 'float', // GGX alpha (roughness²), clamped
|
|
160
|
+
f90: 'float',
|
|
170
161
|
f0: 'vec3' // Fresnel reflectance at normal incidence
|
|
171
162
|
} );
|
|
172
163
|
|
|
173
|
-
|
|
174
|
-
|
|
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 ] ) => {
|
|
164
|
+
// Core of `ggxReflectionSample()` with explicit F0/F90.
|
|
165
|
+
const ggxReflectionSampleWithReflectance = Fn( ( [ N, V, roughness, f0, f90, Xi ] ) => {
|
|
187
166
|
|
|
188
167
|
// GGX alpha (use r^2, clamp to avoid degenerate)
|
|
189
168
|
const a = roughness.mul( roughness ).max( 0.001 ).toVar();
|
|
@@ -191,14 +170,8 @@ export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, X
|
|
|
191
170
|
const ay = a.toVar();
|
|
192
171
|
|
|
193
172
|
// TBN from view-space normal
|
|
194
|
-
const up = vec3( 0, 0, 1 );
|
|
195
|
-
|
|
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
|
-
} );
|
|
173
|
+
const up = N.z.abs().lessThan( 0.999 ).select( vec3( 0, 0, 1 ), vec3( 1, 0, 0 ) );
|
|
174
|
+
const T = cross( up, N ).normalize().toVar();
|
|
202
175
|
const B = cross( N, T ).normalize().toVar();
|
|
203
176
|
|
|
204
177
|
// transform V to LOCAL frame (N = +Z)
|
|
@@ -228,10 +201,9 @@ export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, X
|
|
|
228
201
|
const NdotH = max( float( 0.0 ), dot( N, H ) ).toVar();
|
|
229
202
|
const VdotH = max( float( 0.0 ), dot( V, H ) ).toVar();
|
|
230
203
|
|
|
231
|
-
const f0 = mix( vec3( 0.04 ), albedo, metalness ).toVar();
|
|
232
204
|
// Chromatic Fresnel reflectance: for metals f0 = albedo, so the reflection is tinted and desaturates
|
|
233
205
|
// 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
|
|
206
|
+
const fresnelWeight = F_Schlick( f0, VdotH, f90 ).toVar(); // vec3
|
|
235
207
|
|
|
236
208
|
// Bounded-VNDF direction pdf — still needed for the env-miss MIS path.
|
|
237
209
|
const pdf = GGXVNDFPdf( NdotH, NdotV, ax ).toVar();
|
|
@@ -251,10 +223,30 @@ export const ggxReflectionSample = Fn( ( [ N, V, roughness, metalness, albedo, X
|
|
|
251
223
|
.mul( kB.mul( NdotV ).add( tB ) )
|
|
252
224
|
.div( float( 2.0 ).mul( NdotV ).max( 1e-4 ) ).toVar();
|
|
253
225
|
|
|
254
|
-
return ggxReflectionStruct( viewReflectDir, glossyWeight, pdf, NdotV, ax, f0 );
|
|
226
|
+
return ggxReflectionStruct( viewReflectDir, glossyWeight, pdf, NdotV, ax, f90, f0 );
|
|
255
227
|
|
|
256
228
|
} );
|
|
257
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Importance-samples the GGX/VNDF specular lobe for one pixel and returns the reflected
|
|
232
|
+
* ray direction plus the Monte-Carlo weight to apply to the gathered radiance, along with
|
|
233
|
+
* the GGX terms the SSR env-miss MIS fallback needs.
|
|
234
|
+
*
|
|
235
|
+
* @tsl
|
|
236
|
+
* @param {Node<vec3>} N - View-space shading normal (normalized).
|
|
237
|
+
* @param {Node<vec3>} V - View-space surface→camera direction (normalized).
|
|
238
|
+
* @param {Node<float>} roughness - Perceptual roughness in `[0,1]`.
|
|
239
|
+
* @param {Node<float>} metalness - Metalness in `[0,1]`; only used when `f0` is omitted.
|
|
240
|
+
* @param {Node<vec3>} albedo - Surface base color; tints the metal F0 when `f0` is omitted.
|
|
241
|
+
* @param {Node<vec4>} Xi - Per-pixel random numbers; only `.xy` are used.
|
|
242
|
+
* @param {?Node<vec3>} [f0=null] - Normal-incidence reflectance. Defaults to `mix( 0.04, albedo, metalness )`.
|
|
243
|
+
* @param {Node<float>|number} [f90=1] - Grazing reflectance.
|
|
244
|
+
* @return {ggxReflectionStruct}
|
|
245
|
+
*/
|
|
246
|
+
export const ggxReflectionSample = ( N, V, roughness, metalness, albedo, Xi, f0 = null, f90 = 1 ) =>
|
|
247
|
+
|
|
248
|
+
ggxReflectionSampleWithReflectance( N, V, roughness, f0 ?? mix( vec3( 0.04 ), albedo, metalness ), float( f90 ), Xi );
|
|
249
|
+
|
|
258
250
|
// Equirectangular environment sampling
|
|
259
251
|
|
|
260
252
|
/**
|
|
@@ -279,27 +271,19 @@ export const equirectUvToDir = Fn( ( [ uvIn ] ) => {
|
|
|
279
271
|
cosLat.mul( sin( phi ) )
|
|
280
272
|
) );
|
|
281
273
|
|
|
282
|
-
} )
|
|
283
|
-
name: 'equirectUvToDir',
|
|
284
|
-
type: 'vec3',
|
|
285
|
-
inputs: [ { name: 'uv', type: 'vec2' } ]
|
|
286
|
-
} );
|
|
274
|
+
}, { uv: 'vec2', return: 'vec3' } );
|
|
287
275
|
|
|
288
276
|
// Solid-angle PDF of a direction under equirectangular parameterization.
|
|
289
277
|
export const equirectDirPdf = Fn( ( [ direction ] ) => {
|
|
290
278
|
|
|
291
279
|
const uvDir = equirectUV( direction );
|
|
292
280
|
const sinTheta = sin( uvDir.y.mul( Math.PI ) );
|
|
293
|
-
return sinTheta.abs().lessThan( float(
|
|
281
|
+
return sinTheta.abs().lessThan( float( EPSILON ) ).select(
|
|
294
282
|
float( 0 ),
|
|
295
283
|
float( 1 ).div( float( 2 * Math.PI * Math.PI ).mul( sinTheta ) )
|
|
296
284
|
);
|
|
297
285
|
|
|
298
|
-
} )
|
|
299
|
-
name: 'equirectDirPdf',
|
|
300
|
-
type: 'float',
|
|
301
|
-
inputs: [ { name: 'direction', type: 'vec3' } ]
|
|
302
|
-
} );
|
|
286
|
+
}, { direction: 'vec3', return: 'float' } );
|
|
303
287
|
|
|
304
288
|
/**
|
|
305
289
|
* MIS power heuristic with β = 2: `pdfA² / (pdfA² + pdfB²)`.
|
|
@@ -314,12 +298,5 @@ export const misPowerHeuristic = Fn( ( [ pdfA, pdfB ] ) => {
|
|
|
314
298
|
const pdfBSq = pdfB.mul( pdfB );
|
|
315
299
|
return pdfASq.div( pdfASq.add( pdfBSq ) );
|
|
316
300
|
|
|
317
|
-
} )
|
|
318
|
-
name: 'misPowerHeuristic',
|
|
319
|
-
type: 'float',
|
|
320
|
-
inputs: [
|
|
321
|
-
{ name: 'pdfA', type: 'float' },
|
|
322
|
-
{ name: 'pdfB', type: 'float' }
|
|
323
|
-
]
|
|
324
|
-
} );
|
|
301
|
+
}, { pdfA: 'float', pdfB: 'float', return: 'float' } );
|
|
325
302
|
|
|
@@ -27,15 +27,12 @@ export const clipAABB = Fn( ( [ currentColor, historyColor, minColor, maxColor ]
|
|
|
27
27
|
historyColor
|
|
28
28
|
);
|
|
29
29
|
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
{ name: 'minColor', type: 'vec4' },
|
|
37
|
-
{ name: 'maxColor', type: 'vec4' }
|
|
38
|
-
]
|
|
30
|
+
}, {
|
|
31
|
+
currentColor: 'vec4',
|
|
32
|
+
historyColor: 'vec4',
|
|
33
|
+
minColor: 'vec4',
|
|
34
|
+
maxColor: 'vec4',
|
|
35
|
+
return: 'vec4'
|
|
39
36
|
} );
|
|
40
37
|
|
|
41
38
|
/**
|
|
@@ -62,14 +59,6 @@ export const flickerReduction = Fn( ( [ currentColor, historyColor, currentWeigh
|
|
|
62
59
|
|
|
63
60
|
return add( currentColor.mul( weightCurrent ), historyColor.mul( weightHistory ) ).div( max( weightCurrent.add( weightHistory ), 0.00001 ) );
|
|
64
61
|
|
|
65
|
-
} ).setLayout( {
|
|
66
|
-
name: 'flickerReduction',
|
|
67
|
-
type: 'vec4',
|
|
68
|
-
inputs: [
|
|
69
|
-
{ name: 'currentColor', type: 'vec4' },
|
|
70
|
-
{ name: 'historyColor', type: 'vec4' },
|
|
71
|
-
{ name: 'currentWeight', type: 'float' }
|
|
72
|
-
]
|
|
73
62
|
} );
|
|
74
63
|
|
|
75
64
|
/**
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
InstancedBufferAttribute,
|
|
6
6
|
InterleavedBuffer,
|
|
7
7
|
InterleavedBufferAttribute,
|
|
8
|
+
MathUtils,
|
|
8
9
|
TriangleFanDrawMode,
|
|
9
10
|
TriangleStripDrawMode,
|
|
10
11
|
TrianglesDrawMode,
|
|
@@ -27,10 +28,11 @@ import {
|
|
|
27
28
|
* custom material, and may be faster than MikkTSpace.
|
|
28
29
|
*
|
|
29
30
|
* Returns the original BufferGeometry. Indexed geometries will be de-indexed. Requires position, normal, and uv attributes.
|
|
31
|
+
* Tangents are stored like the normals: normalized Int8 or Int16 when the normals are, Float32 otherwise.
|
|
30
32
|
*
|
|
31
33
|
* @param {BufferGeometry} geometry - The geometry to compute tangents for.
|
|
32
34
|
* @param {Object} MikkTSpace - Instance of `examples/jsm/libs/mikktspace.module.js`, or `mikktspace` npm package.
|
|
33
|
-
* Await `MikkTSpace.ready` before
|
|
35
|
+
* The bundled JavaScript implementation is ready immediately. Await `MikkTSpace.ready` before using a WebAssembly implementation.
|
|
34
36
|
* @param {boolean} [negateSign=true] - Whether to negate the sign component (.w) of each tangent.
|
|
35
37
|
* Required for normal map conventions in some formats, including glTF.
|
|
36
38
|
* @return {BufferGeometry} The updated geometry.
|
|
@@ -111,7 +113,28 @@ function computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {
|
|
|
111
113
|
|
|
112
114
|
//
|
|
113
115
|
|
|
114
|
-
|
|
116
|
+
// Quantized normals get tangents of the same precision.
|
|
117
|
+
|
|
118
|
+
const normal = _geometry.attributes.normal;
|
|
119
|
+
const normalArray = normal.array;
|
|
120
|
+
|
|
121
|
+
if ( normal.normalized && ( normalArray instanceof Int8Array || normalArray instanceof Int16Array ) ) {
|
|
122
|
+
|
|
123
|
+
const quantized = new normalArray.constructor( tangents.length );
|
|
124
|
+
|
|
125
|
+
for ( let i = 0; i < tangents.length; i ++ ) {
|
|
126
|
+
|
|
127
|
+
quantized[ i ] = MathUtils.normalize( tangents[ i ], quantized );
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
_geometry.setAttribute( 'tangent', new BufferAttribute( quantized, 4, true ) );
|
|
132
|
+
|
|
133
|
+
} else {
|
|
134
|
+
|
|
135
|
+
_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );
|
|
136
|
+
|
|
137
|
+
}
|
|
115
138
|
|
|
116
139
|
if ( geometry !== _geometry ) {
|
|
117
140
|
|
|
@@ -143,6 +166,7 @@ function mergeGeometries( geometries, useGroups = false ) {
|
|
|
143
166
|
const morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;
|
|
144
167
|
|
|
145
168
|
const mergedGeometry = new BufferGeometry();
|
|
169
|
+
mergedGeometry.morphTargetsRelative = morphTargetsRelative;
|
|
146
170
|
|
|
147
171
|
let offset = 0;
|
|
148
172
|
|
|
@@ -150,6 +174,7 @@ function mergeGeometries( geometries, useGroups = false ) {
|
|
|
150
174
|
|
|
151
175
|
const geometry = geometries[ i ];
|
|
152
176
|
let attributesCount = 0;
|
|
177
|
+
let morphAttributesCount = 0;
|
|
153
178
|
|
|
154
179
|
// ensure that all geometries are indexed, or none
|
|
155
180
|
|
|
@@ -206,10 +231,28 @@ function mergeGeometries( geometries, useGroups = false ) {
|
|
|
206
231
|
|
|
207
232
|
}
|
|
208
233
|
|
|
234
|
+
if ( geometry.morphAttributes[ name ].length !== geometries[ 0 ].morphAttributes[ name ].length ) {
|
|
235
|
+
|
|
236
|
+
console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have the same number of morph targets for the "' + name + '" morph attribute.' );
|
|
237
|
+
return null;
|
|
238
|
+
|
|
239
|
+
}
|
|
240
|
+
|
|
209
241
|
if ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];
|
|
210
242
|
|
|
211
243
|
morphAttributes[ name ].push( geometry.morphAttributes[ name ] );
|
|
212
244
|
|
|
245
|
+
morphAttributesCount ++;
|
|
246
|
+
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ensure geometries have the same number of morph attributes
|
|
250
|
+
|
|
251
|
+
if ( morphAttributesCount !== morphAttributesUsed.size ) {
|
|
252
|
+
|
|
253
|
+
console.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of morph attributes.' );
|
|
254
|
+
return null;
|
|
255
|
+
|
|
213
256
|
}
|
|
214
257
|
|
|
215
258
|
if ( useGroups ) {
|
|
@@ -569,7 +612,7 @@ function deinterleaveAttribute( attribute ) {
|
|
|
569
612
|
function deinterleaveGeometry( geometry ) {
|
|
570
613
|
|
|
571
614
|
const attributes = geometry.attributes;
|
|
572
|
-
const
|
|
615
|
+
const morphAttributes = geometry.morphAttributes;
|
|
573
616
|
const attrMap = new Map();
|
|
574
617
|
|
|
575
618
|
for ( const key in attributes ) {
|
|
@@ -589,18 +632,24 @@ function deinterleaveGeometry( geometry ) {
|
|
|
589
632
|
|
|
590
633
|
}
|
|
591
634
|
|
|
592
|
-
for ( const key in
|
|
635
|
+
for ( const key in morphAttributes ) {
|
|
593
636
|
|
|
594
|
-
const
|
|
595
|
-
if ( attr.isInterleavedBufferAttribute ) {
|
|
637
|
+
const morphAttribute = morphAttributes[ key ];
|
|
596
638
|
|
|
597
|
-
|
|
639
|
+
for ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {
|
|
598
640
|
|
|
599
|
-
|
|
641
|
+
const attr = morphAttribute[ i ];
|
|
642
|
+
if ( attr.isInterleavedBufferAttribute ) {
|
|
600
643
|
|
|
601
|
-
|
|
644
|
+
if ( ! attrMap.has( attr ) ) {
|
|
645
|
+
|
|
646
|
+
attrMap.set( attr, deinterleaveAttribute( attr ) );
|
|
647
|
+
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
morphAttribute[ i ] = attrMap.get( attr );
|
|
602
651
|
|
|
603
|
-
|
|
652
|
+
}
|
|
604
653
|
|
|
605
654
|
}
|
|
606
655
|
|
|
@@ -656,39 +705,10 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
|
|
|
656
705
|
|
|
657
706
|
// attributes and new attribute arrays
|
|
658
707
|
const attributeNames = Object.keys( geometry.attributes );
|
|
659
|
-
const
|
|
660
|
-
const
|
|
708
|
+
const sourceIndices = [];
|
|
709
|
+
const buffers = new Map();
|
|
661
710
|
const newIndices = [];
|
|
662
711
|
const getters = [ 'getX', 'getY', 'getZ', 'getW' ];
|
|
663
|
-
const setters = [ 'setX', 'setY', 'setZ', 'setW' ];
|
|
664
|
-
|
|
665
|
-
// Initialize the arrays, allocating space conservatively. Extra
|
|
666
|
-
// space will be trimmed in the last step.
|
|
667
|
-
for ( let i = 0, l = attributeNames.length; i < l; i ++ ) {
|
|
668
|
-
|
|
669
|
-
const name = attributeNames[ i ];
|
|
670
|
-
const attr = geometry.attributes[ name ];
|
|
671
|
-
|
|
672
|
-
tmpAttributes[ name ] = new attr.constructor(
|
|
673
|
-
new attr.array.constructor( attr.count * attr.itemSize ),
|
|
674
|
-
attr.itemSize,
|
|
675
|
-
attr.normalized
|
|
676
|
-
);
|
|
677
|
-
|
|
678
|
-
const morphAttributes = geometry.morphAttributes[ name ];
|
|
679
|
-
if ( morphAttributes ) {
|
|
680
|
-
|
|
681
|
-
if ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];
|
|
682
|
-
morphAttributes.forEach( ( morphAttr, i ) => {
|
|
683
|
-
|
|
684
|
-
const array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );
|
|
685
|
-
tmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );
|
|
686
|
-
|
|
687
|
-
} );
|
|
688
|
-
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
}
|
|
692
712
|
|
|
693
713
|
// convert the error tolerance to an amount of decimal places to truncate to
|
|
694
714
|
const halfTolerance = tolerance * 0.5;
|
|
@@ -724,35 +744,7 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
|
|
|
724
744
|
|
|
725
745
|
} else {
|
|
726
746
|
|
|
727
|
-
|
|
728
|
-
for ( let j = 0, l = attributeNames.length; j < l; j ++ ) {
|
|
729
|
-
|
|
730
|
-
const name = attributeNames[ j ];
|
|
731
|
-
const attribute = geometry.getAttribute( name );
|
|
732
|
-
const morphAttributes = geometry.morphAttributes[ name ];
|
|
733
|
-
const itemSize = attribute.itemSize;
|
|
734
|
-
const newArray = tmpAttributes[ name ];
|
|
735
|
-
const newMorphArrays = tmpMorphAttributes[ name ];
|
|
736
|
-
|
|
737
|
-
for ( let k = 0; k < itemSize; k ++ ) {
|
|
738
|
-
|
|
739
|
-
const getterFunc = getters[ k ];
|
|
740
|
-
const setterFunc = setters[ k ];
|
|
741
|
-
newArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );
|
|
742
|
-
|
|
743
|
-
if ( morphAttributes ) {
|
|
744
|
-
|
|
745
|
-
for ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {
|
|
746
|
-
|
|
747
|
-
newMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );
|
|
748
|
-
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
}
|
|
747
|
+
sourceIndices.push( index );
|
|
756
748
|
|
|
757
749
|
hashToIndex[ hash ] = nextIndex;
|
|
758
750
|
newIndices.push( nextIndex );
|
|
@@ -766,27 +758,13 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
|
|
|
766
758
|
const result = geometry.clone();
|
|
767
759
|
for ( const name in geometry.attributes ) {
|
|
768
760
|
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
result.setAttribute( name, new tmpAttribute.constructor(
|
|
772
|
-
tmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),
|
|
773
|
-
tmpAttribute.itemSize,
|
|
774
|
-
tmpAttribute.normalized,
|
|
775
|
-
) );
|
|
776
|
-
|
|
777
|
-
if ( ! ( name in tmpMorphAttributes ) ) continue;
|
|
778
|
-
|
|
779
|
-
for ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {
|
|
761
|
+
result.setAttribute( name, remapAttribute( geometry.attributes[ name ], sourceIndices, buffers ) );
|
|
780
762
|
|
|
781
|
-
|
|
763
|
+
}
|
|
782
764
|
|
|
783
|
-
|
|
784
|
-
tmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),
|
|
785
|
-
tmpMorphAttribute.itemSize,
|
|
786
|
-
tmpMorphAttribute.normalized,
|
|
787
|
-
);
|
|
765
|
+
for ( const name in geometry.morphAttributes ) {
|
|
788
766
|
|
|
789
|
-
|
|
767
|
+
result.morphAttributes[ name ] = geometry.morphAttributes[ name ].map( attribute => remapAttribute( attribute, sourceIndices, buffers ) );
|
|
790
768
|
|
|
791
769
|
}
|
|
792
770
|
|
|
@@ -1249,6 +1227,8 @@ function mergeGroups( geometry ) {
|
|
|
1249
1227
|
|
|
1250
1228
|
const group = groups[ i ];
|
|
1251
1229
|
|
|
1230
|
+
if ( group.count === Infinity ) group.count = index.count - group.start;
|
|
1231
|
+
|
|
1252
1232
|
const groupStart = group.start;
|
|
1253
1233
|
const groupLength = groupStart + group.count;
|
|
1254
1234
|
|
|
@@ -1484,6 +1464,47 @@ function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */
|
|
|
1484
1464
|
|
|
1485
1465
|
}
|
|
1486
1466
|
|
|
1467
|
+
/**
|
|
1468
|
+
* Copies attribute entries in the order specified by the source vertex indices.
|
|
1469
|
+
* Preserves raw values, attribute type and metadata. Reuse the same buffer map
|
|
1470
|
+
* across calls to preserve shared interleaved buffers for the same mapping.
|
|
1471
|
+
*
|
|
1472
|
+
* @param {BufferAttribute|InterleavedBufferAttribute} attribute - The source attribute.
|
|
1473
|
+
* @param {Array<number>|TypedArray} sourceIndices - The source index for each output vertex.
|
|
1474
|
+
* @param {Map<InterleavedBuffer, InterleavedBuffer>} [buffers] - Shared interleaved buffer copies.
|
|
1475
|
+
* @return {BufferAttribute|InterleavedBufferAttribute} The remapped attribute.
|
|
1476
|
+
*/
|
|
1477
|
+
function remapAttribute( attribute, sourceIndices, buffers = new Map() ) {
|
|
1478
|
+
|
|
1479
|
+
const interleaved = attribute.isInterleavedBufferAttribute;
|
|
1480
|
+
const source = interleaved ? attribute.data : attribute;
|
|
1481
|
+
const stride = interleaved ? source.stride : attribute.itemSize;
|
|
1482
|
+
let data = interleaved ? buffers.get( source ) : undefined;
|
|
1483
|
+
|
|
1484
|
+
if ( data === undefined ) {
|
|
1485
|
+
|
|
1486
|
+
const array = new source.array.constructor( sourceIndices.length * stride );
|
|
1487
|
+
for ( let i = 0; i < sourceIndices.length; i ++ ) {
|
|
1488
|
+
|
|
1489
|
+
for ( let j = 0; j < stride; j ++ ) array[ i * stride + j ] = source.array[ sourceIndices[ i ] * stride + j ];
|
|
1490
|
+
|
|
1491
|
+
}
|
|
1492
|
+
|
|
1493
|
+
data = interleaved
|
|
1494
|
+
? new source.constructor( array, stride, source.meshPerAttribute )
|
|
1495
|
+
: new attribute.constructor( array, attribute.itemSize, attribute.normalized, attribute.meshPerAttribute );
|
|
1496
|
+
data.setUsage( source.usage );
|
|
1497
|
+
if ( interleaved ) buffers.set( source, data );
|
|
1498
|
+
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
const result = interleaved ? new attribute.constructor( data, attribute.itemSize, attribute.offset, attribute.normalized ) : data;
|
|
1502
|
+
result.name = attribute.name;
|
|
1503
|
+
if ( ! interleaved ) result.gpuType = attribute.gpuType;
|
|
1504
|
+
return result;
|
|
1505
|
+
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1487
1508
|
export {
|
|
1488
1509
|
computeMikkTSpaceTangents,
|
|
1489
1510
|
mergeGeometries,
|
|
@@ -1494,6 +1515,7 @@ export {
|
|
|
1494
1515
|
interleaveAttributes,
|
|
1495
1516
|
estimateBytesUsed,
|
|
1496
1517
|
mergeVertices,
|
|
1518
|
+
remapAttribute,
|
|
1497
1519
|
toTrianglesDrawMode,
|
|
1498
1520
|
computeMorphedAttributes,
|
|
1499
1521
|
mergeGroups,
|