@gnsx/three 0.185.16 → 0.186.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +10 -82600
- package/build/three.core.js +1309 -807
- 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/src/utils.js +6 -79
- 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,139 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FileLoader,
|
|
3
|
+
Loader
|
|
4
|
+
} from '@gnsx/three';
|
|
5
|
+
|
|
6
|
+
import { createGaussianSplatGeometry, writeCovariance } from '../utils/GaussianSplatUtils.js';
|
|
7
|
+
|
|
8
|
+
const ROW_SIZE_BYTES = 32;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A loader for standard fixed-width Gaussian splat `.splat` files.
|
|
12
|
+
*
|
|
13
|
+
* This loader decodes the format into `BufferGeometry` for use with
|
|
14
|
+
* `GaussianSplat`. Each 32-byte row stores center, scale, color and
|
|
15
|
+
* rotation data for one splat.
|
|
16
|
+
*
|
|
17
|
+
* ```js
|
|
18
|
+
* const loader = new SPLATLoader();
|
|
19
|
+
* const data = await loader.loadAsync( './models/gsplat/example.splat' );
|
|
20
|
+
* scene.add( new GaussianSplat( data ) );
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @augments Loader
|
|
24
|
+
* @three_import import { SPLATLoader } from 'three/addons/loaders/SPLATLoader.js';
|
|
25
|
+
*/
|
|
26
|
+
class SPLATLoader extends Loader {
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Constructs a new Gaussian splat loader.
|
|
30
|
+
*
|
|
31
|
+
* @param {LoadingManager} [manager] - The loading manager.
|
|
32
|
+
*/
|
|
33
|
+
constructor( manager ) {
|
|
34
|
+
|
|
35
|
+
super( manager );
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Starts loading from the given URL and passes the loaded splat data to
|
|
41
|
+
* the `onLoad()` callback.
|
|
42
|
+
*
|
|
43
|
+
* @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
|
|
44
|
+
* @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.
|
|
45
|
+
* @param {onProgressCallback} onProgress - Executed while the loading is in progress.
|
|
46
|
+
* @param {onErrorCallback} onError - Executed when errors occur.
|
|
47
|
+
*/
|
|
48
|
+
load( url, onLoad, onProgress, onError ) {
|
|
49
|
+
|
|
50
|
+
const scope = this;
|
|
51
|
+
|
|
52
|
+
const loader = new FileLoader( this.manager );
|
|
53
|
+
loader.setPath( this.path );
|
|
54
|
+
loader.setResponseType( 'arraybuffer' );
|
|
55
|
+
loader.setRequestHeader( this.requestHeader );
|
|
56
|
+
loader.setWithCredentials( this.withCredentials );
|
|
57
|
+
loader.load( url, function ( buffer ) {
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
|
|
61
|
+
onLoad( scope.parse( buffer ) );
|
|
62
|
+
|
|
63
|
+
} catch ( e ) {
|
|
64
|
+
|
|
65
|
+
if ( onError ) {
|
|
66
|
+
|
|
67
|
+
onError( e );
|
|
68
|
+
|
|
69
|
+
} else {
|
|
70
|
+
|
|
71
|
+
console.error( e );
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
scope.manager.itemError( url );
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
}, onProgress, onError );
|
|
80
|
+
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Parses the given fixed-width `.splat` data.
|
|
85
|
+
*
|
|
86
|
+
* @param {ArrayBuffer} buffer - The raw `.splat` file as an array buffer.
|
|
87
|
+
* @return {BufferGeometry} The parsed splat geometry.
|
|
88
|
+
*/
|
|
89
|
+
parse( buffer ) {
|
|
90
|
+
|
|
91
|
+
if ( buffer.byteLength % ROW_SIZE_BYTES !== 0 ) {
|
|
92
|
+
|
|
93
|
+
throw new Error( 'THREE.SPLATLoader: Invalid .splat byte length.' );
|
|
94
|
+
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const count = buffer.byteLength / ROW_SIZE_BYTES;
|
|
98
|
+
const centers = new Float32Array( count * 3 );
|
|
99
|
+
const covariances = new Float32Array( count * 6 );
|
|
100
|
+
const colors = new Uint8Array( count * 4 );
|
|
101
|
+
const view = new DataView( buffer );
|
|
102
|
+
const bytes = new Uint8Array( buffer );
|
|
103
|
+
|
|
104
|
+
for ( let i = 0; i < count; i ++ ) {
|
|
105
|
+
|
|
106
|
+
const rowOffset = i * ROW_SIZE_BYTES;
|
|
107
|
+
const i3 = i * 3;
|
|
108
|
+
const i4 = i * 4;
|
|
109
|
+
|
|
110
|
+
centers[ i3 ] = view.getFloat32( rowOffset, true );
|
|
111
|
+
centers[ i3 + 1 ] = view.getFloat32( rowOffset + 4, true );
|
|
112
|
+
centers[ i3 + 2 ] = view.getFloat32( rowOffset + 8, true );
|
|
113
|
+
|
|
114
|
+
const sx = view.getFloat32( rowOffset + 12, true );
|
|
115
|
+
const sy = view.getFloat32( rowOffset + 16, true );
|
|
116
|
+
const sz = view.getFloat32( rowOffset + 20, true );
|
|
117
|
+
|
|
118
|
+
colors[ i4 ] = bytes[ rowOffset + 24 ];
|
|
119
|
+
colors[ i4 + 1 ] = bytes[ rowOffset + 25 ];
|
|
120
|
+
colors[ i4 + 2 ] = bytes[ rowOffset + 26 ];
|
|
121
|
+
colors[ i4 + 3 ] = bytes[ rowOffset + 27 ];
|
|
122
|
+
|
|
123
|
+
// Standard .splat stores quaternion bytes as w, x, y, z.
|
|
124
|
+
const qw = ( bytes[ rowOffset + 28 ] - 128 ) / 128;
|
|
125
|
+
const qx = ( bytes[ rowOffset + 29 ] - 128 ) / 128;
|
|
126
|
+
const qy = ( bytes[ rowOffset + 30 ] - 128 ) / 128;
|
|
127
|
+
const qz = ( bytes[ rowOffset + 31 ] - 128 ) / 128;
|
|
128
|
+
|
|
129
|
+
writeCovariance( covariances, i * 6, sx, sy, sz, qx, qy, qz, qw );
|
|
130
|
+
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return createGaussianSplatGeometry( centers, covariances, colors );
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export { SPLATLoader };
|
|
@@ -0,0 +1,561 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DataUtils,
|
|
3
|
+
FileLoader,
|
|
4
|
+
Loader
|
|
5
|
+
} from '@gnsx/three';
|
|
6
|
+
|
|
7
|
+
import { gunzipSync } from '../libs/fflate.module.js';
|
|
8
|
+
import { ZSTDDecoder } from '../libs/zstddec.module.js';
|
|
9
|
+
import { SH_BAND_COMPONENTS, SH_BAND_WORDS, SH_C0, createGaussianSplatGeometry, createPackedSphericalHarmonicsBand, writeCovariance } from '../utils/GaussianSplatUtils.js';
|
|
10
|
+
|
|
11
|
+
const SPZ_MAGIC = 0x5053474e;
|
|
12
|
+
const HEADER_SIZE_BYTES = 16;
|
|
13
|
+
const SPZ_COLOR_SCALE = SH_C0 / 0.15;
|
|
14
|
+
const FLAG_LOD = 0x80;
|
|
15
|
+
const FLAG_HAS_EXTENSIONS = 0x02;
|
|
16
|
+
const MAX_SUPPORTED_SH_DEGREE = 3;
|
|
17
|
+
const SH_DEGREE_TO_VECTORS = [ 0, 3, 8, 15, 24 ];
|
|
18
|
+
|
|
19
|
+
let _zstd;
|
|
20
|
+
|
|
21
|
+
// Scales and colors are stored as single bytes, so all 256 possible outputs
|
|
22
|
+
// of their decode functions can be precomputed once.
|
|
23
|
+
const SCALE_LUT = new Float32Array( 256 );
|
|
24
|
+
const COLOR_LUT = new Uint8ClampedArray( 256 );
|
|
25
|
+
|
|
26
|
+
for ( let i = 0; i < 256; i ++ ) {
|
|
27
|
+
|
|
28
|
+
SCALE_LUT[ i ] = Math.exp( i / 16 - 10 );
|
|
29
|
+
COLOR_LUT[ i ] = ( ( i / 255 - 0.5 ) * SPZ_COLOR_SCALE + 0.5 ) * 255;
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Quaternion components are 10-bit sign-magnitude values (bit 9 is the sign,
|
|
34
|
+
// bits 0-8 are the magnitude scaled to [0, 1/sqrt(2)]), so all 1024 possible
|
|
35
|
+
// decoded values can be precomputed, avoiding an unpredictable sign branch in
|
|
36
|
+
// the hot loop.
|
|
37
|
+
const QUAT_COMPONENT_LUT = new Float64Array( 1024 );
|
|
38
|
+
|
|
39
|
+
for ( let i = 0; i < 1024; i ++ ) {
|
|
40
|
+
|
|
41
|
+
const value = Math.SQRT1_2 * ( ( i & 511 ) / 511 );
|
|
42
|
+
QUAT_COMPONENT_LUT[ i ] = ( i & 512 ) !== 0 ? - value : value;
|
|
43
|
+
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const _quaternion = [ 0, 0, 0, 0 ];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* A loader for compressed Gaussian splat `.spz` files.
|
|
50
|
+
*
|
|
51
|
+
* This loader decodes the format into `BufferGeometry` for use with
|
|
52
|
+
* `GaussianSplat`. Higher-order spherical harmonics are exposed as optional
|
|
53
|
+
* `sphericalHarmonics1` through `sphericalHarmonics3` packed uint32 geometry
|
|
54
|
+
* attributes (`SH_BAND_WORDS[ degree ]` words per splat). Coefficients use the
|
|
55
|
+
* clamped-byte encoding `( value - 128 ) / 128`, four bytes per word.
|
|
56
|
+
*
|
|
57
|
+
* ```js
|
|
58
|
+
* const loader = new SPZLoader();
|
|
59
|
+
* const data = await loader.loadAsync( './models/gsplat/example.spz' );
|
|
60
|
+
* scene.add( new GaussianSplat( data ) );
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @augments Loader
|
|
64
|
+
* @three_import import { SPZLoader } from 'three/addons/loaders/SPZLoader.js';
|
|
65
|
+
*/
|
|
66
|
+
class SPZLoader extends Loader {
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Constructs a new Gaussian splat SPZ loader.
|
|
70
|
+
*
|
|
71
|
+
* @param {LoadingManager} [manager] - The loading manager.
|
|
72
|
+
*/
|
|
73
|
+
constructor( manager ) {
|
|
74
|
+
|
|
75
|
+
super( manager );
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Starts loading from the given URL and passes the loaded splat data to
|
|
81
|
+
* the `onLoad()` callback.
|
|
82
|
+
*
|
|
83
|
+
* @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
|
|
84
|
+
* @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.
|
|
85
|
+
* @param {onProgressCallback} onProgress - Executed while the loading is in progress.
|
|
86
|
+
* @param {onErrorCallback} onError - Executed when errors occur.
|
|
87
|
+
*/
|
|
88
|
+
load( url, onLoad, onProgress, onError ) {
|
|
89
|
+
|
|
90
|
+
const scope = this;
|
|
91
|
+
|
|
92
|
+
const loader = new FileLoader( this.manager );
|
|
93
|
+
loader.setPath( this.path );
|
|
94
|
+
loader.setResponseType( 'arraybuffer' );
|
|
95
|
+
loader.setRequestHeader( this.requestHeader );
|
|
96
|
+
loader.setWithCredentials( this.withCredentials );
|
|
97
|
+
loader.load( url, function ( buffer ) {
|
|
98
|
+
|
|
99
|
+
scope.parse( buffer, onLoad, function ( e ) {
|
|
100
|
+
|
|
101
|
+
if ( onError ) {
|
|
102
|
+
|
|
103
|
+
onError( e );
|
|
104
|
+
|
|
105
|
+
} else {
|
|
106
|
+
|
|
107
|
+
console.error( e );
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
scope.manager.itemError( url );
|
|
112
|
+
|
|
113
|
+
} );
|
|
114
|
+
|
|
115
|
+
}, onProgress, onError );
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Decompresses and parses the given `.spz` data.
|
|
121
|
+
*
|
|
122
|
+
* @param {ArrayBuffer} buffer - The raw SPZ file as an array buffer.
|
|
123
|
+
* @param {function(BufferGeometry)} [onLoad] - Executed when the parsing process has been finished.
|
|
124
|
+
* @param {onErrorCallback} [onError] - Executed when errors occur.
|
|
125
|
+
* @return {BufferGeometry|Promise<BufferGeometry>|undefined} The parsed splat geometry, or a promise for SPZ v4 data.
|
|
126
|
+
*/
|
|
127
|
+
parse( buffer, onLoad, onError ) {
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
|
|
131
|
+
if ( buffer.byteLength >= 8 ) {
|
|
132
|
+
|
|
133
|
+
const view = new DataView( buffer );
|
|
134
|
+
const magic = view.getUint32( 0, true );
|
|
135
|
+
const version = view.getUint32( 4, true );
|
|
136
|
+
|
|
137
|
+
if ( magic === SPZ_MAGIC ) {
|
|
138
|
+
|
|
139
|
+
if ( version !== 4 ) {
|
|
140
|
+
|
|
141
|
+
throw new Error( `THREE.SPZLoader: SPZ version ${ version } is not supported.` );
|
|
142
|
+
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const promise = getZSTDDecoder()
|
|
146
|
+
.then( ( zstd ) => this.parseRawSPZV4( new Uint8Array( buffer ), zstd ) );
|
|
147
|
+
|
|
148
|
+
if ( onLoad !== undefined ) {
|
|
149
|
+
|
|
150
|
+
promise.then( onLoad ).catch( onError );
|
|
151
|
+
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return promise;
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const decompressed = gunzipSync( new Uint8Array( buffer ) );
|
|
161
|
+
const data = this.parseRawSPZ( decompressed );
|
|
162
|
+
|
|
163
|
+
if ( onLoad !== undefined ) onLoad( data );
|
|
164
|
+
|
|
165
|
+
return data;
|
|
166
|
+
|
|
167
|
+
} catch ( e ) {
|
|
168
|
+
|
|
169
|
+
if ( onError !== undefined ) {
|
|
170
|
+
|
|
171
|
+
onError( e );
|
|
172
|
+
return;
|
|
173
|
+
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
throw e;
|
|
177
|
+
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Parses raw SPZ data after gzip decompression.
|
|
184
|
+
*
|
|
185
|
+
* @param {Uint8Array} bytes - The decompressed SPZ data.
|
|
186
|
+
* @return {BufferGeometry} The parsed splat geometry.
|
|
187
|
+
*/
|
|
188
|
+
parseRawSPZ( bytes ) {
|
|
189
|
+
|
|
190
|
+
if ( bytes.byteLength < HEADER_SIZE_BYTES ) {
|
|
191
|
+
|
|
192
|
+
throw new Error( 'THREE.SPZLoader: Invalid SPZ header.' );
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const view = new DataView( bytes.buffer, bytes.byteOffset, bytes.byteLength );
|
|
197
|
+
const magic = view.getUint32( 0, true );
|
|
198
|
+
const version = view.getUint32( 4, true );
|
|
199
|
+
const count = view.getUint32( 8, true );
|
|
200
|
+
const storedShDegree = view.getUint8( 12 );
|
|
201
|
+
const fractionalBits = view.getUint8( 13 );
|
|
202
|
+
const flags = view.getUint8( 14 );
|
|
203
|
+
|
|
204
|
+
if ( magic !== SPZ_MAGIC ) {
|
|
205
|
+
|
|
206
|
+
throw new Error( 'THREE.SPZLoader: Invalid SPZ magic.' );
|
|
207
|
+
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if ( version < 1 || version > 3 ) {
|
|
211
|
+
|
|
212
|
+
throw new Error( `THREE.SPZLoader: SPZ version ${ version } is not supported.` );
|
|
213
|
+
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if ( storedShDegree >= SH_DEGREE_TO_VECTORS.length ) {
|
|
217
|
+
|
|
218
|
+
throw new Error( `THREE.SPZLoader: Unsupported SPZ spherical harmonics degree ${ storedShDegree }.` );
|
|
219
|
+
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Data beyond the supported degree is still present in the file and
|
|
223
|
+
// accounted for below, it's just not decoded into an attribute.
|
|
224
|
+
const shDegree = Math.min( storedShDegree, MAX_SUPPORTED_SH_DEGREE );
|
|
225
|
+
|
|
226
|
+
const positionsSize = count * 3 * ( version === 1 ? 2 : 3 );
|
|
227
|
+
const rotationsSize = count * ( version === 3 ? 4 : 3 );
|
|
228
|
+
const shSize = count * SH_DEGREE_TO_VECTORS[ storedShDegree ] * 3;
|
|
229
|
+
const lodSize = ( flags & FLAG_LOD ) !== 0 ? count * 6 : 0;
|
|
230
|
+
const expectedSize = HEADER_SIZE_BYTES + positionsSize + count + count * 3 + count * 3 + rotationsSize + shSize + lodSize;
|
|
231
|
+
|
|
232
|
+
if ( bytes.byteLength !== expectedSize ) {
|
|
233
|
+
|
|
234
|
+
throw new Error( 'THREE.SPZLoader: Invalid SPZ byte length.' );
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
let offset = HEADER_SIZE_BYTES;
|
|
239
|
+
const positions = bytes.subarray( offset, offset + positionsSize );
|
|
240
|
+
offset += positionsSize;
|
|
241
|
+
const alphas = bytes.subarray( offset, offset + count );
|
|
242
|
+
offset += count;
|
|
243
|
+
const colors = bytes.subarray( offset, offset + count * 3 );
|
|
244
|
+
offset += count * 3;
|
|
245
|
+
const scales = bytes.subarray( offset, offset + count * 3 );
|
|
246
|
+
offset += count * 3;
|
|
247
|
+
const rotations = bytes.subarray( offset, offset + rotationsSize );
|
|
248
|
+
offset += rotationsSize;
|
|
249
|
+
const sphericalHarmonics = bytes.subarray( offset, offset + shSize );
|
|
250
|
+
|
|
251
|
+
return parseSPZAttributes( {
|
|
252
|
+
positions,
|
|
253
|
+
alphas,
|
|
254
|
+
colors,
|
|
255
|
+
scales,
|
|
256
|
+
rotations,
|
|
257
|
+
sphericalHarmonics,
|
|
258
|
+
count,
|
|
259
|
+
version,
|
|
260
|
+
fractionalBits,
|
|
261
|
+
shDegree,
|
|
262
|
+
storedShDegree
|
|
263
|
+
} );
|
|
264
|
+
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Parses raw SPZ v4 data.
|
|
269
|
+
*
|
|
270
|
+
* @param {Uint8Array} bytes - The raw SPZ v4 data.
|
|
271
|
+
* @param {ZSTDDecoder} zstd - The initialized ZSTD decoder.
|
|
272
|
+
* @return {BufferGeometry} The parsed splat geometry.
|
|
273
|
+
*/
|
|
274
|
+
parseRawSPZV4( bytes, zstd ) {
|
|
275
|
+
|
|
276
|
+
const view = new DataView( bytes.buffer, bytes.byteOffset, bytes.byteLength );
|
|
277
|
+
const count = view.getUint32( 8, true );
|
|
278
|
+
const storedShDegree = view.getUint8( 12 );
|
|
279
|
+
const shDegree = Math.min( storedShDegree, MAX_SUPPORTED_SH_DEGREE );
|
|
280
|
+
const fractionalBits = view.getUint8( 13 );
|
|
281
|
+
const flags = view.getUint8( 14 );
|
|
282
|
+
const numStreams = view.getUint8( 15 );
|
|
283
|
+
const tocByteOffset = view.getUint32( 16, true );
|
|
284
|
+
|
|
285
|
+
if ( ( flags & FLAG_HAS_EXTENSIONS ) !== 0 ) {
|
|
286
|
+
|
|
287
|
+
console.warn( 'THREE.SPZLoader: SPZ vendor extensions are not supported and will be skipped.' );
|
|
288
|
+
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const positionsSize = count * 3 * 3;
|
|
292
|
+
const rotationsSize = count * 4;
|
|
293
|
+
const shSize = count * SH_DEGREE_TO_VECTORS[ storedShDegree ] * 3;
|
|
294
|
+
const streamSizes = [ positionsSize, count, count * 3, count * 3, rotationsSize, shSize ];
|
|
295
|
+
const toc = [];
|
|
296
|
+
let compressedOffset = tocByteOffset + numStreams * 16;
|
|
297
|
+
|
|
298
|
+
for ( let i = 0; i < numStreams; i ++ ) {
|
|
299
|
+
|
|
300
|
+
const entryOffset = tocByteOffset + i * 16;
|
|
301
|
+
const compressedSize = Number( view.getBigUint64( entryOffset, true ) );
|
|
302
|
+
toc.push( {
|
|
303
|
+
compressedOffset,
|
|
304
|
+
compressedSize
|
|
305
|
+
} );
|
|
306
|
+
compressedOffset += compressedSize;
|
|
307
|
+
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const streams = [];
|
|
311
|
+
let streamIndex = 0;
|
|
312
|
+
|
|
313
|
+
for ( let i = 0; i < streamSizes.length; i ++ ) {
|
|
314
|
+
|
|
315
|
+
const streamSize = streamSizes[ i ];
|
|
316
|
+
|
|
317
|
+
if ( streamSize === 0 ) {
|
|
318
|
+
|
|
319
|
+
streams.push( new Uint8Array() );
|
|
320
|
+
continue;
|
|
321
|
+
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const stream = toc[ streamIndex ++ ];
|
|
325
|
+
const compressed = bytes.subarray( stream.compressedOffset, stream.compressedOffset + stream.compressedSize );
|
|
326
|
+
streams.push( zstd.decode( compressed, streamSize ) );
|
|
327
|
+
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return parseSPZAttributes( {
|
|
331
|
+
positions: streams[ 0 ],
|
|
332
|
+
alphas: streams[ 1 ],
|
|
333
|
+
colors: streams[ 2 ],
|
|
334
|
+
scales: streams[ 3 ],
|
|
335
|
+
rotations: streams[ 4 ],
|
|
336
|
+
sphericalHarmonics: streams[ 5 ],
|
|
337
|
+
count,
|
|
338
|
+
version: 4,
|
|
339
|
+
fractionalBits,
|
|
340
|
+
shDegree,
|
|
341
|
+
storedShDegree
|
|
342
|
+
} );
|
|
343
|
+
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
function getZSTDDecoder() {
|
|
349
|
+
|
|
350
|
+
if ( _zstd === undefined ) {
|
|
351
|
+
|
|
352
|
+
const decoder = new ZSTDDecoder();
|
|
353
|
+
_zstd = decoder.init().then( () => decoder ).catch( ( e ) => {
|
|
354
|
+
|
|
355
|
+
_zstd = undefined;
|
|
356
|
+
throw e;
|
|
357
|
+
|
|
358
|
+
} );
|
|
359
|
+
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return _zstd;
|
|
363
|
+
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function parseSPZAttributes( {
|
|
367
|
+
positions,
|
|
368
|
+
alphas,
|
|
369
|
+
colors,
|
|
370
|
+
scales,
|
|
371
|
+
rotations,
|
|
372
|
+
sphericalHarmonics,
|
|
373
|
+
count,
|
|
374
|
+
version,
|
|
375
|
+
fractionalBits,
|
|
376
|
+
shDegree,
|
|
377
|
+
storedShDegree
|
|
378
|
+
} ) {
|
|
379
|
+
|
|
380
|
+
const centers = new Float32Array( count * 3 );
|
|
381
|
+
const covariances = new Float32Array( count * 6 );
|
|
382
|
+
const colorBytes = new Uint8ClampedArray( count * 4 );
|
|
383
|
+
const sphericalHarmonicsBands = {};
|
|
384
|
+
|
|
385
|
+
readCenters( positions, centers, 0, count, version, fractionalBits );
|
|
386
|
+
|
|
387
|
+
// The hot loop below avoids per-splat DataView reads by indexing into an
|
|
388
|
+
// aligned Uint32Array. When the rotation section is already 4-byte aligned
|
|
389
|
+
// (e.g. a freshly decoded ZSTD stream) it's read in place; otherwise it's
|
|
390
|
+
// copied into a new, aligned buffer first.
|
|
391
|
+
const packedRotations = version >= 3 ?
|
|
392
|
+
( rotations.byteOffset % 4 === 0 ?
|
|
393
|
+
new Uint32Array( rotations.buffer, rotations.byteOffset, count ) :
|
|
394
|
+
new Uint32Array( rotations.buffer.slice( rotations.byteOffset, rotations.byteOffset + count * 4 ) ) ) :
|
|
395
|
+
null;
|
|
396
|
+
|
|
397
|
+
const quaternion = _quaternion;
|
|
398
|
+
|
|
399
|
+
for ( let i = 0; i < count; i ++ ) {
|
|
400
|
+
|
|
401
|
+
const i3 = i * 3;
|
|
402
|
+
const i4 = i * 4;
|
|
403
|
+
const sx = SCALE_LUT[ scales[ i3 ] ];
|
|
404
|
+
const sy = SCALE_LUT[ scales[ i3 + 1 ] ];
|
|
405
|
+
const sz = SCALE_LUT[ scales[ i3 + 2 ] ];
|
|
406
|
+
|
|
407
|
+
if ( version >= 3 ) {
|
|
408
|
+
|
|
409
|
+
readSmallestThreeQuaternion( packedRotations[ i ], quaternion );
|
|
410
|
+
|
|
411
|
+
} else {
|
|
412
|
+
|
|
413
|
+
readXYZQuaternion( rotations, i3, quaternion );
|
|
414
|
+
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
writeCovariance( covariances, i * 6, sx, sy, sz, quaternion[ 0 ], quaternion[ 1 ], quaternion[ 2 ], quaternion[ 3 ] );
|
|
418
|
+
|
|
419
|
+
colorBytes[ i4 ] = COLOR_LUT[ colors[ i3 ] ];
|
|
420
|
+
colorBytes[ i4 + 1 ] = COLOR_LUT[ colors[ i3 + 1 ] ];
|
|
421
|
+
colorBytes[ i4 + 2 ] = COLOR_LUT[ colors[ i3 + 2 ] ];
|
|
422
|
+
colorBytes[ i4 + 3 ] = alphas[ i ];
|
|
423
|
+
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
readSphericalHarmonics( sphericalHarmonics, 0, count, shDegree, sphericalHarmonicsBands, storedShDegree );
|
|
427
|
+
|
|
428
|
+
return createGaussianSplatGeometry( centers, covariances, colorBytes, sphericalHarmonicsBands );
|
|
429
|
+
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
function readSphericalHarmonics( bytes, offset, count, degree, sphericalHarmonics, storedDegree = degree ) {
|
|
433
|
+
|
|
434
|
+
if ( degree === 0 ) return;
|
|
435
|
+
|
|
436
|
+
const bands = [];
|
|
437
|
+
|
|
438
|
+
for ( let band = 1; band <= degree; band ++ ) {
|
|
439
|
+
|
|
440
|
+
const packed = createPackedSphericalHarmonicsBand( count, band );
|
|
441
|
+
sphericalHarmonics[ `sh${ band }` ] = packed.packed;
|
|
442
|
+
bands.push( {
|
|
443
|
+
bytes: packed.bytes,
|
|
444
|
+
components: SH_BAND_COMPONENTS[ band ],
|
|
445
|
+
stride: SH_BAND_WORDS[ band ] * 4
|
|
446
|
+
} );
|
|
447
|
+
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
const sourceStride = SH_DEGREE_TO_VECTORS[ storedDegree ] * 3;
|
|
451
|
+
|
|
452
|
+
for ( let i = 0; i < count; i ++ ) {
|
|
453
|
+
|
|
454
|
+
const sourceOffset = offset + i * sourceStride;
|
|
455
|
+
let bandOffset = sourceOffset;
|
|
456
|
+
|
|
457
|
+
for ( let bandIndex = 0; bandIndex < bands.length; bandIndex ++ ) {
|
|
458
|
+
|
|
459
|
+
const band = bands[ bandIndex ];
|
|
460
|
+
const targetOffset = i * band.stride;
|
|
461
|
+
|
|
462
|
+
for ( let j = 0; j < band.components; j ++ ) {
|
|
463
|
+
|
|
464
|
+
band.bytes[ targetOffset + j ] = bytes[ bandOffset ++ ];
|
|
465
|
+
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
function readCenters( bytes, centers, offset, count, version, fractionalBits ) {
|
|
475
|
+
|
|
476
|
+
if ( version === 1 ) {
|
|
477
|
+
|
|
478
|
+
for ( let i = 0; i < count; i ++ ) {
|
|
479
|
+
|
|
480
|
+
const i3 = i * 3;
|
|
481
|
+
const rowOffset = offset + i3 * 2;
|
|
482
|
+
|
|
483
|
+
centers[ i3 ] = DataUtils.fromHalfFloat( bytes[ rowOffset ] | ( bytes[ rowOffset + 1 ] << 8 ) );
|
|
484
|
+
centers[ i3 + 1 ] = DataUtils.fromHalfFloat( bytes[ rowOffset + 2 ] | ( bytes[ rowOffset + 3 ] << 8 ) );
|
|
485
|
+
centers[ i3 + 2 ] = DataUtils.fromHalfFloat( bytes[ rowOffset + 4 ] | ( bytes[ rowOffset + 5 ] << 8 ) );
|
|
486
|
+
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
return;
|
|
490
|
+
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
const fixedScale = 1 / ( 1 << fractionalBits );
|
|
494
|
+
|
|
495
|
+
for ( let i = 0; i < count; i ++ ) {
|
|
496
|
+
|
|
497
|
+
const i3 = i * 3;
|
|
498
|
+
const rowOffset = offset + i * 9;
|
|
499
|
+
|
|
500
|
+
centers[ i3 ] = readInt24( bytes, rowOffset ) * fixedScale;
|
|
501
|
+
centers[ i3 + 1 ] = readInt24( bytes, rowOffset + 3 ) * fixedScale;
|
|
502
|
+
centers[ i3 + 2 ] = readInt24( bytes, rowOffset + 6 ) * fixedScale;
|
|
503
|
+
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
function readInt24( bytes, offset ) {
|
|
509
|
+
|
|
510
|
+
// The left shift by 8 followed by an arithmetic right shift sign-extends
|
|
511
|
+
// the 24-bit value.
|
|
512
|
+
return ( ( bytes[ offset ] << 8 ) | ( bytes[ offset + 1 ] << 16 ) | ( bytes[ offset + 2 ] << 24 ) ) >> 8;
|
|
513
|
+
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function readXYZQuaternion( bytes, offset, target ) {
|
|
517
|
+
|
|
518
|
+
const qx = bytes[ offset ] / 127.5 - 1;
|
|
519
|
+
const qy = bytes[ offset + 1 ] / 127.5 - 1;
|
|
520
|
+
const qz = bytes[ offset + 2 ] / 127.5 - 1;
|
|
521
|
+
|
|
522
|
+
target[ 0 ] = qx;
|
|
523
|
+
target[ 1 ] = qy;
|
|
524
|
+
target[ 2 ] = qz;
|
|
525
|
+
target[ 3 ] = Math.sqrt( Math.max( 0, 1 - qx * qx - qy * qy - qz * qz ) );
|
|
526
|
+
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
function readSmallestThreeQuaternion( packed, target ) {
|
|
530
|
+
|
|
531
|
+
const largestIndex = packed >>> 30;
|
|
532
|
+
|
|
533
|
+
// The three smallest components are packed from the lowest bits upward,
|
|
534
|
+
// filling the non-largest indices in descending order: the low 10 bits go
|
|
535
|
+
// to the highest remaining index, the top 10 bits to the lowest.
|
|
536
|
+
const a = QUAT_COMPONENT_LUT[ packed & 1023 ];
|
|
537
|
+
const b = QUAT_COMPONENT_LUT[ ( packed >>> 10 ) & 1023 ];
|
|
538
|
+
const c = QUAT_COMPONENT_LUT[ ( packed >>> 20 ) & 1023 ];
|
|
539
|
+
|
|
540
|
+
switch ( largestIndex ) {
|
|
541
|
+
|
|
542
|
+
case 0:
|
|
543
|
+
target[ 1 ] = c; target[ 2 ] = b; target[ 3 ] = a;
|
|
544
|
+
break;
|
|
545
|
+
case 1:
|
|
546
|
+
target[ 0 ] = c; target[ 2 ] = b; target[ 3 ] = a;
|
|
547
|
+
break;
|
|
548
|
+
case 2:
|
|
549
|
+
target[ 0 ] = c; target[ 1 ] = b; target[ 3 ] = a;
|
|
550
|
+
break;
|
|
551
|
+
default:
|
|
552
|
+
target[ 0 ] = c; target[ 1 ] = b; target[ 2 ] = a;
|
|
553
|
+
break;
|
|
554
|
+
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
target[ largestIndex ] = Math.sqrt( Math.max( 0, 1 - ( a * a + b * b + c * c ) ) );
|
|
558
|
+
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
export { SPZLoader };
|