@gnsx/three 0.185.16 → 0.186.1
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/build/three.cjs +10 -82600
- package/build/three.core.js +1303 -728
- package/build/three.module.js +439 -338
- package/build/three.tsl.js +74 -44
- package/build/three.webgpu.js +6036 -2184
- package/build/three.webgpu.nodes.js +6020 -2184
- package/examples/jsm/Addons.js +6 -6
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +44 -20
- package/examples/jsm/controls/OrbitControls.js +9 -0
- package/examples/jsm/controls/TrackballControls.js +109 -4
- package/examples/jsm/csm/CSMShadowNode.js +13 -0
- package/examples/jsm/exporters/GLTFExporter.js +23 -7
- package/examples/jsm/exporters/USDZExporter.js +2 -2
- package/examples/jsm/generators/CityGenerator.js +377 -45
- package/examples/jsm/generators/ForestGenerator.js +12 -12
- package/examples/jsm/generators/TerrainGenerator.js +49 -37
- package/examples/jsm/generators/TreeGenerator.js +70 -76
- package/examples/jsm/generators/city/BenchGenerator.js +127 -0
- package/examples/jsm/generators/city/CarGenerator.js +479 -0
- package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
- package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
- package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
- package/examples/jsm/generators/city/PersonGenerator.js +447 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
- package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
- package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
- package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
- package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
- package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
- package/examples/jsm/gpgpu/CountingSort.js +271 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
- package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/examples/jsm/inspector/Extension.js +94 -0
- package/examples/jsm/inspector/Inspector.js +145 -41
- package/examples/jsm/inspector/RendererInspector.js +100 -52
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
- package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
- package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
- package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
- package/examples/jsm/inspector/tabs/Memory.js +0 -2
- package/examples/jsm/inspector/tabs/Settings.js +4 -0
- package/examples/jsm/inspector/tabs/Timeline.js +223 -171
- package/examples/jsm/inspector/tabs/Viewer.js +515 -21
- package/examples/jsm/inspector/ui/List.js +15 -9
- package/examples/jsm/inspector/ui/Profiler.js +170 -14
- package/examples/jsm/inspector/ui/Style.js +269 -23
- package/examples/jsm/inspector/ui/Tab.js +2 -0
- package/examples/jsm/inspector/ui/Values.js +14 -2
- package/examples/jsm/interactive/HTMLMesh.js +19 -3
- package/examples/jsm/lighting/LightProbeGrid.js +484 -889
- package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
- package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
- package/examples/jsm/lights/SunLight.js +95 -0
- package/examples/jsm/lights/SunLightNode.js +56 -0
- package/examples/jsm/lights/SunLightShadow.js +319 -0
- package/examples/jsm/lights/SunShadowNode.js +312 -0
- package/examples/jsm/loaders/3DMLoader.js +150 -49
- package/examples/jsm/loaders/3MFLoader.js +202 -1
- package/examples/jsm/loaders/FBXLoader.js +81 -5
- package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
- package/examples/jsm/loaders/GLTFLoader.js +79 -14
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
- package/examples/jsm/loaders/KSPLATLoader.js +463 -0
- package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/SPLATLoader.js +139 -0
- package/examples/jsm/loaders/SPZLoader.js +561 -0
- package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
- package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
- package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
- package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
- package/examples/jsm/loaders/usd/USDAParser.js +15 -2
- package/examples/jsm/loaders/usd/USDCParser.js +1 -4
- package/examples/jsm/loaders/usd/USDComposer.js +80 -42
- package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
- package/examples/jsm/misc/RollerCoaster.js +2 -2
- package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
- package/examples/jsm/misc/Sculptor.js +1679 -0
- package/examples/jsm/misc/SculptorMesh.js +1504 -0
- package/examples/jsm/misc/SculptorTools.js +1180 -0
- package/examples/jsm/misc/SculptorUtils.js +345 -0
- package/examples/jsm/misc/TubePainter.js +28 -16
- package/examples/jsm/misc/VolumeSlice.js +24 -24
- package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
- package/examples/jsm/objects/GaussianSplat.js +1039 -0
- package/examples/jsm/objects/Sky.js +66 -45
- package/examples/jsm/objects/SkyMesh.js +70 -51
- package/examples/jsm/physics/JoltPhysics.js +1 -1
- package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/GTAOPass.js +1 -1
- package/examples/jsm/postprocessing/OutlinePass.js +5 -5
- package/examples/jsm/postprocessing/SAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +4 -2
- package/examples/jsm/postprocessing/SavePass.js +1 -1
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
- package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +1 -1
- package/examples/jsm/shaders/FilmShader.js +2 -1
- package/examples/jsm/transpiler/AST.js +21 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
- package/examples/jsm/transpiler/TSLEncoder.js +82 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
- package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
- package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
- package/examples/jsm/tsl/display/BloomNode.js +55 -30
- package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
- package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
- package/examples/jsm/tsl/display/FSR1Node.js +8 -4
- package/examples/jsm/tsl/display/GTAONode.js +199 -86
- package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
- package/examples/jsm/tsl/display/GodraysNode.js +5 -2
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
- package/examples/jsm/tsl/display/LensflareNode.js +5 -2
- package/examples/jsm/tsl/display/OITPassNode.js +352 -0
- package/examples/jsm/tsl/display/OutlineNode.js +2 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
- package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
- package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
- package/examples/jsm/tsl/display/SMAANode.js +22 -61
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
- package/examples/jsm/tsl/display/SSAONode.js +436 -0
- package/examples/jsm/tsl/display/SSGINode.js +5 -2
- package/examples/jsm/tsl/display/SSRNode.js +7 -2
- package/examples/jsm/tsl/display/SSSNode.js +5 -2
- package/examples/jsm/tsl/display/SharpenNode.js +5 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
- package/examples/jsm/tsl/display/TAAUNode.js +22 -125
- package/examples/jsm/tsl/display/TRAANode.js +16 -142
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
- package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
- package/examples/jsm/tsl/display/hashBlur.js +3 -2
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
- package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
- package/examples/jsm/tsl/utils/Raymarching.js +5 -5
- package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
- package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
- package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
- package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
- package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
- package/package.json +9 -16
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +73 -43
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +1 -0
- package/src/animation/AnimationClip.js +15 -2
- package/src/animation/AnimationObjectGroup.js +18 -6
- package/src/animation/AnimationUtils.js +26 -0
- package/src/animation/KeyframeTrack.js +37 -0
- package/src/constants.js +23 -1
- package/src/core/BufferAttribute.js +3 -2
- package/src/core/BufferGeometry.js +1 -1
- package/src/core/InterleavedBuffer.js +5 -1
- package/src/core/Object3D.js +40 -12
- package/src/core/Raycaster.js +4 -0
- package/src/core/RenderTarget.js +99 -9
- package/src/core/RenderTarget3D.js +12 -8
- package/src/extras/Controls.js +0 -8
- package/src/extras/PMREMGenerator.js +99 -205
- package/src/geometries/TorusGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +2 -0
- package/src/helpers/AxesHelper.js +2 -0
- package/src/helpers/Box3Helper.js +2 -0
- package/src/helpers/BoxHelper.js +2 -0
- package/src/helpers/CameraHelper.js +2 -0
- package/src/helpers/DirectionalLightHelper.js +2 -0
- package/src/helpers/GridHelper.js +2 -0
- package/src/helpers/HemisphereLightHelper.js +2 -0
- package/src/helpers/PlaneHelper.js +2 -0
- package/src/helpers/PointLightHelper.js +2 -0
- package/src/helpers/PolarGridHelper.js +2 -0
- package/src/helpers/SkeletonHelper.js +2 -0
- package/src/helpers/SpotLightHelper.js +2 -0
- package/src/lights/Light.js +0 -10
- package/src/lights/LightShadow.js +43 -12
- package/src/lights/SpotLightShadow.js +18 -0
- package/src/loaders/BufferGeometryLoader.js +5 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ObjectLoader.js +8 -5
- package/src/materials/Material.js +80 -57
- package/src/materials/MeshPhysicalMaterial.js +32 -0
- package/src/materials/nodes/Line2NodeMaterial.js +17 -8
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
- package/src/materials/nodes/NodeMaterial.js +19 -13
- package/src/materials/nodes/PointsNodeMaterial.js +2 -1
- package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
- package/src/math/Frustum.js +9 -0
- package/src/math/FrustumArray.js +1 -1
- package/src/math/MathUtils.js +5 -3
- package/src/math/Matrix4.js +2 -9
- package/src/math/Plane.js +30 -1
- package/src/math/Quaternion.js +0 -10
- package/src/math/Ray.js +95 -45
- package/src/math/Triangle.js +0 -2
- package/src/math/Vector3.js +2 -2
- package/src/math/Vector4.js +0 -4
- package/src/math/interpolants/BezierInterpolant.js +36 -23
- package/src/nodes/Nodes.js +2 -0
- package/src/nodes/TSL.js +11 -3
- package/src/nodes/accessors/Batch.js +85 -13
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/BuiltinNode.js +1 -1
- package/src/nodes/accessors/Instance.js +19 -18
- package/src/nodes/accessors/MaterialNode.js +9 -0
- package/src/nodes/accessors/ModelNode.js +85 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
- package/src/nodes/accessors/ReferenceElementNode.js +72 -0
- package/src/nodes/accessors/ReferenceNode.js +1 -70
- package/src/nodes/accessors/Skinning.js +124 -12
- package/src/nodes/accessors/StorageTextureNode.js +7 -3
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +51 -21
- package/src/nodes/accessors/TextureSizeNode.js +4 -2
- package/src/nodes/accessors/UniformArrayNode.js +30 -5
- package/src/nodes/code/CodeNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +12 -2
- package/src/nodes/core/ArrayNode.js +2 -2
- package/src/nodes/core/ContextNode.js +57 -4
- package/src/nodes/core/IndexNode.js +69 -4
- package/src/nodes/core/InspectorNode.js +2 -2
- package/src/nodes/core/MRTNode.js +44 -2
- package/src/nodes/core/Node.js +6 -3
- package/src/nodes/core/NodeBuilder.js +65 -50
- package/src/nodes/core/NodeFrame.js +11 -3
- package/src/nodes/core/NodeUtils.js +88 -0
- package/src/nodes/core/PropertyNode.js +8 -0
- package/src/nodes/core/StackNode.js +0 -1
- package/src/nodes/core/StructNode.js +4 -3
- package/src/nodes/core/UniformGroupNode.js +3 -2
- package/src/nodes/core/UniformNode.js +26 -12
- package/src/nodes/core/VarNode.js +0 -1
- package/src/nodes/display/BumpMapNode.js +2 -2
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/PassNode.js +76 -15
- package/src/nodes/display/ScreenNode.js +22 -65
- package/src/nodes/fog/Fog.js +4 -4
- package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
- package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
- package/src/nodes/functions/BSDF/LTC.js +1 -1
- package/src/nodes/functions/PhongLightingModel.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +83 -25
- package/src/nodes/functions/ToonLightingModel.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
- package/src/nodes/gpgpu/BarrierNode.js +13 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +20 -17
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
- package/src/nodes/lighting/EnvironmentNode.js +40 -4
- package/src/nodes/lighting/LightsNode.js +20 -4
- package/src/nodes/lighting/ShadowBaseNode.js +158 -1
- package/src/nodes/lighting/ShadowFilterNode.js +2 -106
- package/src/nodes/lighting/ShadowNode.js +22 -91
- package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
- package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
- package/src/nodes/materialx/MaterialXCore.js +37 -0
- package/src/nodes/materialx/MaterialXNodes.js +64 -72
- package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
- package/src/nodes/math/BitcountNode.js +24 -4
- package/src/nodes/math/MathNode.js +4 -4
- package/src/nodes/math/MathUtils.js +15 -4
- package/src/nodes/math/OperatorNode.js +2 -2
- package/src/nodes/math/PackFloatNode.js +29 -1
- package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
- package/src/nodes/math/UnpackFloatNode.js +30 -2
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +31 -74
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLCore.js +1 -31
- package/src/nodes/utils/EventNode.js +75 -0
- package/src/nodes/utils/LoopNode.js +54 -13
- package/src/nodes/utils/PostProcessingUtils.js +23 -2
- package/src/nodes/utils/RTTNode.js +97 -32
- package/src/nodes/utils/ReflectorNode.js +8 -4
- package/src/nodes/utils/RotateNode.js +85 -8
- package/src/nodes/utils/SpriteUtils.js +58 -23
- package/src/objects/BatchedMesh.js +6 -0
- package/src/objects/InstancedMesh.js +1 -1
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +12 -0
- package/src/objects/Mesh.js +12 -0
- package/src/objects/Points.js +12 -0
- package/src/objects/Sprite.js +12 -0
- package/src/renderers/WebGLRenderer.js +93 -27
- package/src/renderers/common/Animation.js +12 -2
- package/src/renderers/common/Backend.js +38 -10
- package/src/renderers/common/BindGroup.js +0 -1
- package/src/renderers/common/Bindings.js +50 -4
- package/src/renderers/common/BundleGroup.js +4 -0
- package/src/renderers/common/ClippingContext.js +11 -1
- package/src/renderers/common/Color4.js +9 -0
- package/src/renderers/common/Constants.js +0 -5
- package/src/renderers/common/DirectRenderPipeline.js +233 -0
- package/src/renderers/common/Geometries.js +24 -3
- package/src/renderers/common/Info.js +3 -3
- package/src/renderers/common/InspectorBase.js +37 -8
- package/src/renderers/common/Lighting.js +11 -4
- package/src/renderers/common/Pipelines.js +6 -4
- package/src/renderers/common/QuadMesh.js +16 -2
- package/src/renderers/common/RenderContext.js +8 -0
- package/src/renderers/common/RenderList.js +53 -19
- package/src/renderers/common/RenderLists.js +58 -11
- package/src/renderers/common/RenderObject.js +14 -0
- package/src/renderers/common/RenderObjects.js +14 -9
- package/src/renderers/common/RenderPipeline.js +52 -44
- package/src/renderers/common/Renderer.js +226 -55
- package/src/renderers/common/Storage3DTexture.js +16 -0
- package/src/renderers/common/Textures.js +3 -3
- package/src/renderers/common/XRManager.js +79 -72
- package/src/renderers/common/extras/PMREMGenerator.js +76 -144
- package/src/renderers/common/nodes/NodeManager.js +144 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
- package/src/renderers/shaders/DFGLUTData.js +2 -1
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/shaders/UniformsLib.js +16 -0
- package/src/renderers/webgl/WebGLAnimation.js +2 -2
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLLights.js +74 -4
- package/src/renderers/webgl/WebGLMaterials.js +6 -0
- package/src/renderers/webgl/WebGLOutput.js +36 -24
- package/src/renderers/webgl/WebGLProgram.js +3 -0
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLRenderLists.js +6 -10
- package/src/renderers/webgl/WebGLShadowMap.js +47 -44
- package/src/renderers/webgl/WebGLTextures.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
- package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
- package/src/renderers/webgpu/WebGPUBackend.js +513 -145
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
- package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
- package/src/renderers/webxr/WebXRManager.js +25 -2
- package/src/scenes/Scene.js +3 -3
- package/src/textures/CompressedArrayTexture.js +16 -0
- package/src/textures/Data3DTexture.js +16 -0
- package/src/textures/DataArrayTexture.js +16 -0
- package/src/textures/DepthTexture.js +3 -3
- package/src/textures/Texture.js +3 -3
- package/src/textures/{Source.js → TextureSource.js} +39 -8
- package/build/three.core.min.js +0 -6
- package/build/three.module.min.js +0 -6
- package/build/three.tsl.min.js +0 -6
- package/build/three.webgpu.min.js +0 -6
- package/build/three.webgpu.nodes.min.js +0 -6
- package/examples/jsm/libs/ecsy.module.js +0 -1792
- package/examples/jsm/loaders/LottieLoader.js +0 -130
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Fn, float, positionView, viewportDepthTexture, perspectiveDepthToViewZ, cameraNear, cameraFar } from '@gnsx/three/tsl';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @module SoftParticles
|
|
5
|
+
* @three_import import { softParticles } from 'three/addons/tsl/utils/SoftParticles.js';
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A symmetric contrast curve, as described in the "Soft Particles" white paper
|
|
10
|
+
* (NVIDIA, Tristan Lorach).
|
|
11
|
+
*
|
|
12
|
+
* @tsl
|
|
13
|
+
* @function
|
|
14
|
+
* @private
|
|
15
|
+
* @param {Node<float>} input - The value to remap, expected in the `[0, 1]` range.
|
|
16
|
+
* @param {Node<float>} power - The contrast power. `1` is linear, higher values sharpen the transition.
|
|
17
|
+
* @return {Node<float>} The remapped value.
|
|
18
|
+
*/
|
|
19
|
+
const contrastCurve = /*@__PURE__*/ Fn( ( [ input, power ] ) => {
|
|
20
|
+
|
|
21
|
+
const aboveHalf = input.greaterThan( 0.5 ).toConst();
|
|
22
|
+
const folded = aboveHalf.select( input.oneMinus(), input ).toConst();
|
|
23
|
+
const output = folded.mul( 2 ).saturate().pow( power ).mul( 0.5 ).toConst();
|
|
24
|
+
|
|
25
|
+
return aboveHalf.select( output.oneMinus(), output );
|
|
26
|
+
|
|
27
|
+
} ).setLayout( {
|
|
28
|
+
name: 'contrastCurve',
|
|
29
|
+
type: 'float',
|
|
30
|
+
inputs: [
|
|
31
|
+
{ name: 'input', type: 'float' },
|
|
32
|
+
{ name: 'power', type: 'float' }
|
|
33
|
+
]
|
|
34
|
+
} );
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Computes an opacity node for soft particles, based on the "Soft Particles" white
|
|
38
|
+
* paper (NVIDIA, Tristan Lorach).
|
|
39
|
+
*
|
|
40
|
+
* @tsl
|
|
41
|
+
* @function
|
|
42
|
+
* @param {Object} [parameters={}] - The configuration parameters.
|
|
43
|
+
* @param {Node<float>} [parameters.opacity=float(1)] - The sprite's base opacity, which the soft fade is multiplied with.
|
|
44
|
+
* @param {Node<float>|number} [parameters.distance=1] - The world-space distance over which the sprite fades out against the scene.
|
|
45
|
+
* @param {Node<float>|number} [parameters.contrast=2] - The contrast power of the fade curve. `1` is linear, higher values sharpen the transition.
|
|
46
|
+
* @param {Node<float>} [parameters.viewportDepth=viewportDepthTexture()] - The opaque scene depth the particles fade against.
|
|
47
|
+
* @return {Node<float>} The opacity node to assign to `material.opacityNode`.
|
|
48
|
+
*/
|
|
49
|
+
export function softParticles( { opacity = float( 1 ), distance = 1, contrast = 2, viewportDepth = viewportDepthTexture() } = {} ) {
|
|
50
|
+
|
|
51
|
+
// Read the opaque scene depth captured before the particle pass and convert both
|
|
52
|
+
// the scene depth and the particle's depth to view space, so the gap between them
|
|
53
|
+
// can be measured in world units.
|
|
54
|
+
const sceneViewZ = perspectiveDepthToViewZ( viewportDepth, cameraNear, cameraFar ).toConst();
|
|
55
|
+
const depthDelta = positionView.z.sub( sceneViewZ ).div( distance ).saturate();
|
|
56
|
+
|
|
57
|
+
// Fade out as the particle approaches the scene; stay opaque when well in front of it.
|
|
58
|
+
return opacity.mul( contrastCurve( depthDelta, contrast ) );
|
|
59
|
+
|
|
60
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { add, float, Fn, If, luminance, max, struct, vec2, vec4, getViewPosition, logarithmicDepthToViewZ, viewZToOrthographicDepth, viewZToPerspectiveDepth } from '@gnsx/three/tsl';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Optimized version of AABB clipping.
|
|
5
|
+
*
|
|
6
|
+
* Reference: {@link https://github.com/playdeadgames/temporal}
|
|
7
|
+
*
|
|
8
|
+
* @tsl
|
|
9
|
+
* @private
|
|
10
|
+
* @function
|
|
11
|
+
* @param {Node<vec4>} currentColor - The current color.
|
|
12
|
+
* @param {Node<vec4>} historyColor - The history color.
|
|
13
|
+
* @param {Node<vec4>} minColor - The minimum color of the AABB.
|
|
14
|
+
* @param {Node<vec4>} maxColor - The maximum color of the AABB.
|
|
15
|
+
* @return {Node<vec4>} The clipped history color.
|
|
16
|
+
*/
|
|
17
|
+
export const clipAABB = Fn( ( [ currentColor, historyColor, minColor, maxColor ] ) => {
|
|
18
|
+
|
|
19
|
+
const pClip = maxColor.rgb.add( minColor.rgb ).mul( 0.5 ).toConst();
|
|
20
|
+
const eClip = maxColor.rgb.sub( minColor.rgb ).mul( 0.5 ).add( 1e-7 ).toConst();
|
|
21
|
+
const vClip = historyColor.sub( vec4( pClip, currentColor.a ) ).toConst();
|
|
22
|
+
const vUnit = vClip.xyz.div( eClip ).toConst();
|
|
23
|
+
const absUnit = vUnit.abs().toConst();
|
|
24
|
+
const maxUnit = max( absUnit.x, absUnit.y, absUnit.z ).toConst();
|
|
25
|
+
return maxUnit.greaterThan( 1 ).select(
|
|
26
|
+
vec4( pClip, currentColor.a ).add( vClip.div( maxUnit ) ),
|
|
27
|
+
historyColor
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
} ).setLayout( {
|
|
31
|
+
name: 'clipAABB',
|
|
32
|
+
type: 'vec4',
|
|
33
|
+
inputs: [
|
|
34
|
+
{ name: 'currentColor', type: 'vec4' },
|
|
35
|
+
{ name: 'historyColor', type: 'vec4' },
|
|
36
|
+
{ name: 'minColor', type: 'vec4' },
|
|
37
|
+
{ name: 'maxColor', type: 'vec4' }
|
|
38
|
+
]
|
|
39
|
+
} );
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Blends the current and history color with a flicker reduction based on luminance weighing.
|
|
43
|
+
*
|
|
44
|
+
* @tsl
|
|
45
|
+
* @private
|
|
46
|
+
* @function
|
|
47
|
+
* @param {Node<vec4>} currentColor - The current color.
|
|
48
|
+
* @param {Node<vec4>} historyColor - The history color.
|
|
49
|
+
* @param {Node<float>} currentWeight - The weight of the current color.
|
|
50
|
+
* @return {Node<vec4>} The blended color.
|
|
51
|
+
*/
|
|
52
|
+
export const flickerReduction = Fn( ( [ currentColor, historyColor, currentWeight ] ) => {
|
|
53
|
+
|
|
54
|
+
const compressedCurrent = currentColor.mul( float( 1 ).div( ( max( currentColor.r, currentColor.g, currentColor.b ).add( 1 ) ) ) ).toConst();
|
|
55
|
+
const compressedHistory = historyColor.mul( float( 1 ).div( ( max( historyColor.r, historyColor.g, historyColor.b ).add( 1 ) ) ) ).toConst();
|
|
56
|
+
|
|
57
|
+
const luminanceCurrent = luminance( compressedCurrent.rgb ).toConst();
|
|
58
|
+
const luminanceHistory = luminance( compressedHistory.rgb ).toConst();
|
|
59
|
+
|
|
60
|
+
const weightCurrent = currentWeight.div( luminanceCurrent.add( 1 ) ).toConst();
|
|
61
|
+
const weightHistory = currentWeight.oneMinus().div( luminanceHistory.add( 1 ) ).toConst();
|
|
62
|
+
|
|
63
|
+
return add( currentColor.mul( weightCurrent ), historyColor.mul( weightHistory ) ).div( max( weightCurrent.add( weightHistory ), 0.00001 ) );
|
|
64
|
+
|
|
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
|
+
} );
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Samples the 3×3 neighborhood of the given texel position in the depth buffer and returns
|
|
77
|
+
* the closest depth, its texel position and the farthest depth. Reversed and logarithmic depth
|
|
78
|
+
* values are converted to perspective depth.
|
|
79
|
+
*
|
|
80
|
+
* @tsl
|
|
81
|
+
* @private
|
|
82
|
+
* @function
|
|
83
|
+
* @param {TextureNode} depthNode - The depth buffer.
|
|
84
|
+
* @param {Node<vec2>} positionTexel - The texel position.
|
|
85
|
+
* @param {Node<vec2>} cameraNearFar - The camera's near and far.
|
|
86
|
+
* @return {Node<struct>} A struct with the members `closestDepth`, `closestPositionTexel` and `farthestDepth`.
|
|
87
|
+
*/
|
|
88
|
+
export const sampleCurrentDepth = Fn( ( [ depthNode, positionTexel, cameraNearFar ], builder ) => {
|
|
89
|
+
|
|
90
|
+
const closestDepth = float( 2 ).toVar();
|
|
91
|
+
const closestPositionTexel = vec2( 0 ).toVar();
|
|
92
|
+
const farthestDepth = float( - 1 ).toVar();
|
|
93
|
+
|
|
94
|
+
for ( let x = - 1; x <= 1; ++ x ) {
|
|
95
|
+
|
|
96
|
+
for ( let y = - 1; y <= 1; ++ y ) {
|
|
97
|
+
|
|
98
|
+
const neighbor = positionTexel.add( vec2( x, y ) ).toVar();
|
|
99
|
+
let depth = depthNode.load( neighbor ).r;
|
|
100
|
+
if ( builder.renderer.reversedDepthBuffer ) depth = depth.oneMinus();
|
|
101
|
+
if ( builder.renderer.logarithmicDepthBuffer ) depth = logarithmicToPerspectiveDepth( depth, cameraNearFar );
|
|
102
|
+
depth = depth.toVar();
|
|
103
|
+
|
|
104
|
+
If( depth.lessThan( closestDepth ), () => {
|
|
105
|
+
|
|
106
|
+
closestDepth.assign( depth );
|
|
107
|
+
closestPositionTexel.assign( neighbor );
|
|
108
|
+
|
|
109
|
+
} );
|
|
110
|
+
|
|
111
|
+
If( depth.greaterThan( farthestDepth ), () => {
|
|
112
|
+
|
|
113
|
+
farthestDepth.assign( depth );
|
|
114
|
+
|
|
115
|
+
} );
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return currentDepthStruct( closestDepth, closestPositionTexel, farthestDepth );
|
|
122
|
+
|
|
123
|
+
} );
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Samples the previous depth buffer and reprojects the depth into the current view.
|
|
127
|
+
*
|
|
128
|
+
* @tsl
|
|
129
|
+
* @private
|
|
130
|
+
* @function
|
|
131
|
+
* @param {TextureNode} previousDepthNode - The previous depth buffer.
|
|
132
|
+
* @param {Node<vec2>} uv - The uv coordinates.
|
|
133
|
+
* @param {Node<mat4>} previousCameraProjectionMatrixInverse - The previous camera projection matrix inverse.
|
|
134
|
+
* @param {Node<mat4>} previousCameraWorldMatrix - The previous camera world matrix.
|
|
135
|
+
* @param {Node<mat4>} cameraWorldMatrixInverse - The current camera world matrix inverse.
|
|
136
|
+
* @param {Node<vec2>} cameraNearFar - The camera's near and far.
|
|
137
|
+
* @param {Camera} camera - The camera.
|
|
138
|
+
* @return {Node<float>} The reprojected depth.
|
|
139
|
+
*/
|
|
140
|
+
export const samplePreviousDepth = Fn( ( [ previousDepthNode, uv, previousCameraProjectionMatrixInverse, previousCameraWorldMatrix, cameraWorldMatrixInverse, cameraNearFar, camera ], builder ) => {
|
|
141
|
+
|
|
142
|
+
let depth = previousDepthNode.sample( uv ).r;
|
|
143
|
+
if ( builder.renderer.logarithmicDepthBuffer ) depth = logarithmicToPerspectiveDepth( depth, cameraNearFar );
|
|
144
|
+
const positionView = getViewPosition( uv, depth, previousCameraProjectionMatrixInverse );
|
|
145
|
+
const positionWorld = previousCameraWorldMatrix.mul( vec4( positionView, 1 ) ).xyz;
|
|
146
|
+
const viewZ = cameraWorldMatrixInverse.mul( vec4( positionWorld, 1 ) ).z;
|
|
147
|
+
return camera.isOrthographicCamera
|
|
148
|
+
? viewZToOrthographicDepth( viewZ, cameraNearFar.x, cameraNearFar.y )
|
|
149
|
+
: viewZToPerspectiveDepth( viewZ, cameraNearFar.x, cameraNearFar.y );
|
|
150
|
+
|
|
151
|
+
} );
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Computes a sequence of Halton(2, 3) jitter offsets in the range [0, 1].
|
|
155
|
+
*
|
|
156
|
+
* @private
|
|
157
|
+
* @function
|
|
158
|
+
* @param {number} length - The number of offsets.
|
|
159
|
+
* @return {Array<Array<number>>} The jitter offsets.
|
|
160
|
+
*/
|
|
161
|
+
export function computeHaltonOffsets( length ) {
|
|
162
|
+
|
|
163
|
+
return Array.from( { length }, ( _, index ) => [ halton( index + 1, 2 ), halton( index + 1, 3 ) ] );
|
|
164
|
+
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const currentDepthStruct = struct( {
|
|
168
|
+
closestDepth: 'float',
|
|
169
|
+
closestPositionTexel: 'vec2',
|
|
170
|
+
farthestDepth: 'float'
|
|
171
|
+
} );
|
|
172
|
+
|
|
173
|
+
const logarithmicToPerspectiveDepth = ( depth, cameraNearFar ) => {
|
|
174
|
+
|
|
175
|
+
const { x: near, y: far } = cameraNearFar;
|
|
176
|
+
const viewZ = logarithmicDepthToViewZ( depth, near, far );
|
|
177
|
+
return viewZToPerspectiveDepth( viewZ, near, far );
|
|
178
|
+
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
function halton( index, base ) {
|
|
182
|
+
|
|
183
|
+
let fraction = 1;
|
|
184
|
+
let result = 0;
|
|
185
|
+
while ( index > 0 ) {
|
|
186
|
+
|
|
187
|
+
fraction /= base;
|
|
188
|
+
result += fraction * ( index % base );
|
|
189
|
+
index = Math.floor( index / base );
|
|
190
|
+
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return result;
|
|
194
|
+
|
|
195
|
+
}
|
|
@@ -709,8 +709,8 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
|
|
|
709
709
|
|
|
710
710
|
for ( let k = 0; k < itemSize; k ++ ) {
|
|
711
711
|
|
|
712
|
-
//
|
|
713
|
-
hash += `${
|
|
712
|
+
// Math.trunc() preserves the full Number range, ~~ would wrap to int32
|
|
713
|
+
hash += `${ Math.trunc( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;
|
|
714
714
|
|
|
715
715
|
}
|
|
716
716
|
|
|
@@ -799,12 +799,13 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
|
|
|
799
799
|
}
|
|
800
800
|
|
|
801
801
|
/**
|
|
802
|
-
*
|
|
803
|
-
*
|
|
802
|
+
* Converts the given geometry to the `TrianglesDrawMode` draw mode, which
|
|
803
|
+
* corresponds to the `gl.TRIANGLES` primitive in WebGL. The conversion only
|
|
804
|
+
* rewrites the index, so the geometry is modified in place and returned.
|
|
804
805
|
*
|
|
805
806
|
* @param {BufferGeometry} geometry - The geometry to convert.
|
|
806
807
|
* @param {number} drawMode - The current draw mode.
|
|
807
|
-
* @return {BufferGeometry} The
|
|
808
|
+
* @return {BufferGeometry} The converted geometry using `TrianglesDrawMode`.
|
|
808
809
|
*/
|
|
809
810
|
function toTrianglesDrawMode( geometry, drawMode ) {
|
|
810
811
|
|
|
@@ -894,13 +895,12 @@ function toTrianglesDrawMode( geometry, drawMode ) {
|
|
|
894
895
|
|
|
895
896
|
}
|
|
896
897
|
|
|
897
|
-
//
|
|
898
|
+
// updated indices
|
|
898
899
|
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
newGeometry.clearGroups();
|
|
900
|
+
geometry.setIndex( newIndices );
|
|
901
|
+
geometry.clearGroups();
|
|
902
902
|
|
|
903
|
-
return
|
|
903
|
+
return geometry;
|
|
904
904
|
|
|
905
905
|
} else {
|
|
906
906
|
|
|
@@ -1371,7 +1371,7 @@ function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */
|
|
|
1371
1371
|
// assign an id to each vertex, sharing the id between vertices with the same
|
|
1372
1372
|
// quantized position via an open-addressed hash table (slots hold id + 1, 0 means empty)
|
|
1373
1373
|
const vertexIds = new Int32Array( vertexCount );
|
|
1374
|
-
const quantized = new
|
|
1374
|
+
const quantized = new Float64Array( vertexCount * 3 );
|
|
1375
1375
|
|
|
1376
1376
|
let tableSize = 1;
|
|
1377
1377
|
while ( tableSize < vertexCount * 2 ) tableSize <<= 1;
|
|
@@ -1382,9 +1382,9 @@ function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */
|
|
|
1382
1382
|
for ( let i = 0; i < vertexCount; i ++ ) {
|
|
1383
1383
|
|
|
1384
1384
|
const i3 = 3 * i;
|
|
1385
|
-
const qx =
|
|
1386
|
-
const qy =
|
|
1387
|
-
const qz =
|
|
1385
|
+
const qx = Math.trunc( positions[ i3 + 0 ] * hashMultiplier );
|
|
1386
|
+
const qy = Math.trunc( positions[ i3 + 1 ] * hashMultiplier );
|
|
1387
|
+
const qz = Math.trunc( positions[ i3 + 2 ] * hashMultiplier );
|
|
1388
1388
|
|
|
1389
1389
|
let slot = ( Math.imul( qx, 73856093 ) ^ Math.imul( qy, 19349663 ) ^ Math.imul( qz, 83492791 ) ) & tableMask;
|
|
1390
1390
|
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BufferAttribute,
|
|
3
|
+
BufferGeometry,
|
|
4
|
+
Matrix3,
|
|
5
|
+
Matrix4,
|
|
6
|
+
Quaternion,
|
|
7
|
+
Vector3
|
|
8
|
+
} from '@gnsx/three';
|
|
9
|
+
|
|
10
|
+
const SH_C0 = 0.2820947917738781;
|
|
11
|
+
const SH_BAND_COMPONENTS = [ 0, 9, 15, 21 ];
|
|
12
|
+
// GPU upload packs four clamped-byte coefficients per uint32 word.
|
|
13
|
+
const SH_BAND_WORDS = [ 0, 3, 4, 6 ];
|
|
14
|
+
|
|
15
|
+
const _covarianceMatrix = new Matrix3();
|
|
16
|
+
const _covarianceMatrixTranspose = new Matrix3();
|
|
17
|
+
const _rotationScaleMatrix = new Matrix4();
|
|
18
|
+
const _quaternion = new Quaternion();
|
|
19
|
+
const _scale = new Vector3();
|
|
20
|
+
const _zero = new Vector3();
|
|
21
|
+
|
|
22
|
+
function sigmoid( value ) {
|
|
23
|
+
|
|
24
|
+
return 1 / ( 1 + Math.exp( - value ) );
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// The target is expected to be a Uint8ClampedArray, which clamps and rounds
|
|
29
|
+
// assigned values natively.
|
|
30
|
+
function writeColorBytes( target, offset, r, g, b, a ) {
|
|
31
|
+
|
|
32
|
+
target[ offset ] = r;
|
|
33
|
+
target[ offset + 1 ] = g;
|
|
34
|
+
target[ offset + 2 ] = b;
|
|
35
|
+
target[ offset + 3 ] = a;
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function sh0ToLinear( coefficient ) {
|
|
40
|
+
|
|
41
|
+
return coefficient * SH_C0 + 0.5;
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function linearToSH0( color ) {
|
|
46
|
+
|
|
47
|
+
return ( color - 0.5 ) / SH_C0;
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function writeColorBytesFromSH0( target, offset, r, g, b, a ) {
|
|
52
|
+
|
|
53
|
+
writeColorBytes(
|
|
54
|
+
target,
|
|
55
|
+
offset,
|
|
56
|
+
sh0ToLinear( r ) * 255,
|
|
57
|
+
sh0ToLinear( g ) * 255,
|
|
58
|
+
sh0ToLinear( b ) * 255,
|
|
59
|
+
a * 255
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function writeCovariance( target, offset, sx, sy, sz, qx, qy, qz, qw ) {
|
|
65
|
+
|
|
66
|
+
_quaternion.set( qx, qy, qz, qw ).normalize();
|
|
67
|
+
_scale.set( sx, sy, sz );
|
|
68
|
+
_rotationScaleMatrix.compose( _zero, _quaternion, _scale );
|
|
69
|
+
|
|
70
|
+
_covarianceMatrix.setFromMatrix4( _rotationScaleMatrix );
|
|
71
|
+
_covarianceMatrixTranspose.copy( _covarianceMatrix ).transpose();
|
|
72
|
+
_covarianceMatrix.multiply( _covarianceMatrixTranspose );
|
|
73
|
+
|
|
74
|
+
const elements = _covarianceMatrix.elements;
|
|
75
|
+
|
|
76
|
+
target[ offset ] = elements[ 0 ];
|
|
77
|
+
target[ offset + 1 ] = elements[ 3 ];
|
|
78
|
+
target[ offset + 2 ] = elements[ 6 ];
|
|
79
|
+
target[ offset + 3 ] = elements[ 4 ];
|
|
80
|
+
target[ offset + 4 ] = elements[ 7 ];
|
|
81
|
+
target[ offset + 5 ] = elements[ 8 ];
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function createPackedSphericalHarmonicsBand( count, degree ) {
|
|
86
|
+
|
|
87
|
+
const packed = new Uint32Array( count * SH_BAND_WORDS[ degree ] );
|
|
88
|
+
packed.fill( 0x80808080 );
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
packed,
|
|
92
|
+
bytes: new Uint8ClampedArray( packed.buffer )
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function createSphericalHarmonicsAttribute( values, count, degree ) {
|
|
98
|
+
|
|
99
|
+
const words = SH_BAND_WORDS[ degree ];
|
|
100
|
+
|
|
101
|
+
if ( values instanceof Uint32Array === false ) {
|
|
102
|
+
|
|
103
|
+
throw new Error( `THREE.createGaussianSplatGeometry: sphericalHarmonics${ degree } must use packed uint32 words.` );
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if ( values.length !== count * words ) {
|
|
108
|
+
|
|
109
|
+
throw new Error( `THREE.createGaussianSplatGeometry: Invalid sphericalHarmonics${ degree } packed length.` );
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return new BufferAttribute( values, words );
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function getSphericalHarmonicsDegree( geometry ) {
|
|
118
|
+
|
|
119
|
+
if ( geometry === undefined || geometry.isBufferGeometry !== true ) return 0;
|
|
120
|
+
|
|
121
|
+
let degree = 0;
|
|
122
|
+
|
|
123
|
+
for ( let i = 1; i <= 3; i ++ ) {
|
|
124
|
+
|
|
125
|
+
const attribute = geometry.getAttribute( `sphericalHarmonics${ i }` );
|
|
126
|
+
|
|
127
|
+
if ( attribute === undefined ) break;
|
|
128
|
+
|
|
129
|
+
if ( attribute.itemSize !== SH_BAND_WORDS[ i ] ) {
|
|
130
|
+
|
|
131
|
+
throw new Error( `THREE.getSphericalHarmonicsDegree: Invalid sphericalHarmonics${ i } itemSize.` );
|
|
132
|
+
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if ( attribute.array instanceof Uint32Array === false ) {
|
|
136
|
+
|
|
137
|
+
throw new Error( `THREE.getSphericalHarmonicsDegree: sphericalHarmonics${ i } must use packed uint32 words.` );
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
degree = i;
|
|
142
|
+
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
for ( let i = degree + 1; i <= 3; i ++ ) {
|
|
146
|
+
|
|
147
|
+
if ( geometry.getAttribute( `sphericalHarmonics${ i }` ) !== undefined ) {
|
|
148
|
+
|
|
149
|
+
throw new Error( 'THREE.getSphericalHarmonicsDegree: Spherical harmonics attributes must be contiguous.' );
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const position = geometry.getAttribute( 'position' );
|
|
156
|
+
|
|
157
|
+
if ( position !== undefined ) {
|
|
158
|
+
|
|
159
|
+
for ( let i = 1; i <= degree; i ++ ) {
|
|
160
|
+
|
|
161
|
+
if ( geometry.getAttribute( `sphericalHarmonics${ i }` ).count !== position.count ) {
|
|
162
|
+
|
|
163
|
+
throw new Error( 'THREE.getSphericalHarmonicsDegree: Spherical harmonics attribute counts must match position.' );
|
|
164
|
+
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return degree;
|
|
172
|
+
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Creates Gaussian splat geometry from packed attribute arrays. Higher-order
|
|
177
|
+
* spherical harmonics must be supplied as packed `Uint32Array` words
|
|
178
|
+
* (`SH_BAND_WORDS[ degree ]` words per splat, four clamped-byte coefficients
|
|
179
|
+
* per word using `( value - 128 ) / 128`).
|
|
180
|
+
*
|
|
181
|
+
* @param {Float32Array} centers - Splat centers.
|
|
182
|
+
* @param {Float32Array} covariances - Splat covariance matrices.
|
|
183
|
+
* @param {Uint8Array|Uint8ClampedArray} colors - RGBA colors.
|
|
184
|
+
* @param {Object} [sphericalHarmonics={}] - Optional packed SH band arrays.
|
|
185
|
+
* @return {BufferGeometry} The Gaussian splat geometry.
|
|
186
|
+
*/
|
|
187
|
+
function createGaussianSplatGeometry( centers, covariances, colors, sphericalHarmonics = {} ) {
|
|
188
|
+
|
|
189
|
+
const geometry = new BufferGeometry();
|
|
190
|
+
geometry.setAttribute( 'position', new BufferAttribute( centers, 3 ) );
|
|
191
|
+
geometry.setAttribute( 'covariance', new BufferAttribute( covariances, 6 ) );
|
|
192
|
+
geometry.setAttribute( 'color', new BufferAttribute( colors, 4, true ) );
|
|
193
|
+
|
|
194
|
+
const count = centers.length / 3;
|
|
195
|
+
|
|
196
|
+
for ( let i = 1; i <= 3; i ++ ) {
|
|
197
|
+
|
|
198
|
+
const values = sphericalHarmonics[ `sh${ i }` ] || sphericalHarmonics[ `sphericalHarmonics${ i }` ];
|
|
199
|
+
|
|
200
|
+
if ( values !== undefined ) {
|
|
201
|
+
|
|
202
|
+
geometry.setAttribute( `sphericalHarmonics${ i }`, createSphericalHarmonicsAttribute( values, count, i ) );
|
|
203
|
+
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
getSphericalHarmonicsDegree( geometry );
|
|
209
|
+
geometry.computeBoundingBox();
|
|
210
|
+
geometry.computeBoundingSphere();
|
|
211
|
+
|
|
212
|
+
return geometry;
|
|
213
|
+
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export {
|
|
217
|
+
SH_BAND_COMPONENTS,
|
|
218
|
+
SH_BAND_WORDS,
|
|
219
|
+
SH_C0,
|
|
220
|
+
createGaussianSplatGeometry,
|
|
221
|
+
createPackedSphericalHarmonicsBand,
|
|
222
|
+
getSphericalHarmonicsDegree,
|
|
223
|
+
linearToSH0,
|
|
224
|
+
sh0ToLinear,
|
|
225
|
+
sigmoid,
|
|
226
|
+
writeColorBytes,
|
|
227
|
+
writeColorBytesFromSH0,
|
|
228
|
+
writeCovariance
|
|
229
|
+
};
|
|
@@ -24,7 +24,7 @@ let fullscreenQuad;
|
|
|
24
24
|
* Returns an uncompressed version of the given compressed texture.
|
|
25
25
|
*
|
|
26
26
|
* This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},
|
|
27
|
-
* import the function from {@link WebGPUTextureUtils}.
|
|
27
|
+
* import the function from {@link module:WebGPUTextureUtils}.
|
|
28
28
|
*
|
|
29
29
|
* @param {CompressedTexture} texture - The compressed texture.
|
|
30
30
|
* @param {number} [maxTextureSize=Infinity] - The maximum size of the uncompressed texture.
|
|
@@ -18,7 +18,7 @@ const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
|
18
18
|
* Returns an uncompressed version of the given compressed texture.
|
|
19
19
|
*
|
|
20
20
|
* This module can only be used with {@link WebGPURenderer}. When using {@link WebGLRenderer},
|
|
21
|
-
* import the function from {@link WebGLTextureUtils}.
|
|
21
|
+
* import the function from {@link module:WebGLTextureUtils}.
|
|
22
22
|
*
|
|
23
23
|
* @async
|
|
24
24
|
* @param {CompressedTexture} blitTexture - The compressed texture.
|
|
@@ -26,27 +26,13 @@ function setupWebGLXRFallback( renderer, createFallbackRenderer, onFallback = ()
|
|
|
26
26
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
if ( session !== null && renderer.backend.isWebGPUBackend === true &&
|
|
29
|
+
if ( session !== null && renderer.backend.isWebGPUBackend === true && typeof globalThis.XRGPUBinding === 'undefined' ) {
|
|
30
30
|
|
|
31
31
|
return switchToFallbackRenderer( session, renderer );
|
|
32
32
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return await setSession( session );
|
|
38
|
-
|
|
39
|
-
} catch ( error ) {
|
|
40
|
-
|
|
41
|
-
if ( session === null || renderer.backend.isWebGPUBackend !== true ) {
|
|
42
|
-
|
|
43
|
-
throw error;
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return switchToFallbackRenderer( session, renderer );
|
|
48
|
-
|
|
49
|
-
}
|
|
35
|
+
return setSession( session );
|
|
50
36
|
|
|
51
37
|
};
|
|
52
38
|
|
|
@@ -325,6 +325,7 @@ class XRControllerModelFactory {
|
|
|
325
325
|
|
|
326
326
|
const controllerModel = new XRControllerModel();
|
|
327
327
|
let scene = null;
|
|
328
|
+
let connectionId = 0; // used to invalidate async operations of previous connections, see #34264
|
|
328
329
|
|
|
329
330
|
controller.addEventListener( 'connected', ( event ) => {
|
|
330
331
|
|
|
@@ -332,15 +333,22 @@ class XRControllerModelFactory {
|
|
|
332
333
|
|
|
333
334
|
if ( xrInputSource.targetRayMode !== 'tracked-pointer' || ! xrInputSource.gamepad || xrInputSource.hand ) return;
|
|
334
335
|
|
|
336
|
+
const id = ++ connectionId;
|
|
337
|
+
|
|
335
338
|
fetchProfile( xrInputSource, this.path, DEFAULT_PROFILE ).then( ( { profile, assetPath } ) => {
|
|
336
339
|
|
|
340
|
+
if ( id !== connectionId ) return;
|
|
341
|
+
|
|
337
342
|
controllerModel.motionController = new MotionController(
|
|
338
343
|
xrInputSource,
|
|
339
344
|
profile,
|
|
340
345
|
assetPath
|
|
341
346
|
);
|
|
342
347
|
|
|
343
|
-
const
|
|
348
|
+
const assetUrl = controllerModel.motionController.assetUrl;
|
|
349
|
+
|
|
350
|
+
const cachedAsset = this._assetCache[ assetUrl ];
|
|
351
|
+
|
|
344
352
|
if ( cachedAsset ) {
|
|
345
353
|
|
|
346
354
|
scene = cachedAsset.scene.clone();
|
|
@@ -358,9 +366,11 @@ class XRControllerModelFactory {
|
|
|
358
366
|
}
|
|
359
367
|
|
|
360
368
|
this.gltfLoader.setPath( '' );
|
|
361
|
-
this.gltfLoader.load(
|
|
369
|
+
this.gltfLoader.load( assetUrl, ( asset ) => {
|
|
370
|
+
|
|
371
|
+
this._assetCache[ assetUrl ] = asset;
|
|
362
372
|
|
|
363
|
-
|
|
373
|
+
if ( id !== connectionId ) return;
|
|
364
374
|
|
|
365
375
|
scene = asset.scene.clone();
|
|
366
376
|
|
|
@@ -372,7 +382,7 @@ class XRControllerModelFactory {
|
|
|
372
382
|
null,
|
|
373
383
|
() => {
|
|
374
384
|
|
|
375
|
-
throw new Error( `THREE.XRControllerModelFactory: Asset ${
|
|
385
|
+
throw new Error( `THREE.XRControllerModelFactory: Asset ${assetUrl} missing or malformed.` );
|
|
376
386
|
|
|
377
387
|
} );
|
|
378
388
|
|
|
@@ -388,6 +398,8 @@ class XRControllerModelFactory {
|
|
|
388
398
|
|
|
389
399
|
controller.addEventListener( 'disconnected', () => {
|
|
390
400
|
|
|
401
|
+
connectionId ++;
|
|
402
|
+
|
|
391
403
|
controllerModel.motionController = null;
|
|
392
404
|
controllerModel.remove( scene );
|
|
393
405
|
scene = null;
|