@gnsx/three 0.185.15 → 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 +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,271 @@
|
|
|
1
|
+
import { StorageBufferAttribute, DynamicDrawUsage } from '@gnsx/three/webgpu';
|
|
2
|
+
import { Fn, Loop, atomicAdd, atomicLoad, atomicStore, instanceIndex, storage, uint } from '@gnsx/three/tsl';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A reusable GPU counting sort.
|
|
6
|
+
*
|
|
7
|
+
* This computes a stable-ish permutation of the integers `[0, count)` that orders them by an
|
|
8
|
+
* arbitrary, user supplied `uint` key ("bin") in the range `[0, binCount)`. It is a good fit for
|
|
9
|
+
* approximate ordering of large element counts (hundreds of thousands to millions) where an exact
|
|
10
|
+
* comparison sort such as a bitonic sort (see {@link BitonicSort}) would be too slow: a counting
|
|
11
|
+
* sort only requires a fixed number of passes (reset, histogram, prefix sum, scatter) regardless of
|
|
12
|
+
* `count`, at the cost of only being accurate to the resolution of `binCount` - elements that land
|
|
13
|
+
* in the same bin end up in an unspecified relative order.
|
|
14
|
+
*
|
|
15
|
+
* This class does not compute the sort key itself. Instead, a TSL function is supplied via
|
|
16
|
+
* {@link CountingSort#setBinNode} that maps the current `instanceIndex` to a bin, and an equivalent
|
|
17
|
+
* plain JavaScript function can be supplied to {@link CountingSort#computeCPU} for platforms without
|
|
18
|
+
* compute shader support (e.g. the WebGL backend of {@link WebGPURenderer}).
|
|
19
|
+
*
|
|
20
|
+
* ```js
|
|
21
|
+
* const sort = new CountingSort( count, { binCount: 4096 } );
|
|
22
|
+
* sort.setBinNode( () => {
|
|
23
|
+
*
|
|
24
|
+
* // return a `Node<uint>` bin index for `instanceIndex`, e.g. derived from a depth value.
|
|
25
|
+
*
|
|
26
|
+
* } );
|
|
27
|
+
*
|
|
28
|
+
* sort.compute( renderer );
|
|
29
|
+
*
|
|
30
|
+
* // `sort.orderRead` now holds a storage buffer of `count` indices, ordered by bin.
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @three_import import { CountingSort } from 'three/addons/gpgpu/CountingSort.js';
|
|
34
|
+
*/
|
|
35
|
+
class CountingSort {
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Constructs a new counting sort.
|
|
39
|
+
*
|
|
40
|
+
* @param {number} count - The number of elements to sort.
|
|
41
|
+
* @param {Object} [options={}] - Options that modify the counting sort.
|
|
42
|
+
* @param {number} [options.binCount=4096] - The number of bins/buckets the sort key is quantized into. Larger values improve sort accuracy at the cost of a longer (but still single-pass) prefix sum.
|
|
43
|
+
* @param {number} [options.workgroupSize=256] - The workgroup size of the compute shaders executed during the sort.
|
|
44
|
+
*/
|
|
45
|
+
constructor( count, { binCount = 4096, workgroupSize = 256 } = {} ) {
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The number of elements to sort.
|
|
49
|
+
*
|
|
50
|
+
* @type {number}
|
|
51
|
+
*/
|
|
52
|
+
this.count = count;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The number of bins/buckets the sort key is quantized into.
|
|
56
|
+
*
|
|
57
|
+
* @type {number}
|
|
58
|
+
*/
|
|
59
|
+
this.binCount = binCount;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The workgroup size of the compute shaders executed during the sort.
|
|
63
|
+
*
|
|
64
|
+
* @type {number}
|
|
65
|
+
*/
|
|
66
|
+
this.workgroupSize = workgroupSize;
|
|
67
|
+
|
|
68
|
+
const orderData = new Uint32Array( count );
|
|
69
|
+
for ( let i = 0; i < count; i ++ ) orderData[ i ] = i;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* The buffer attribute holding the sorted order (a permutation of `[0, count)`). This is
|
|
73
|
+
* also the attribute that is kept up to date by {@link CountingSort#computeCPU}.
|
|
74
|
+
*
|
|
75
|
+
* @type {StorageBufferAttribute}
|
|
76
|
+
*/
|
|
77
|
+
this.orderAttribute = new StorageBufferAttribute( orderData, 1, Uint32Array );
|
|
78
|
+
|
|
79
|
+
const binAttribute = new StorageBufferAttribute( new Uint32Array( count ), 1, Uint32Array );
|
|
80
|
+
const histogramAttribute = new StorageBufferAttribute( new Uint32Array( binCount ), 1, Uint32Array );
|
|
81
|
+
const offsetAttribute = new StorageBufferAttribute( new Uint32Array( binCount ), 1, Uint32Array );
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* A read-only storage node for the sorted order buffer.
|
|
85
|
+
*
|
|
86
|
+
* @type {StorageBufferNode}
|
|
87
|
+
*/
|
|
88
|
+
this.orderRead = storage( this.orderAttribute, 'uint', count ).toReadOnly();
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* A writable storage node for the sorted order buffer.
|
|
92
|
+
*
|
|
93
|
+
* @type {StorageBufferNode}
|
|
94
|
+
*/
|
|
95
|
+
this.orderWrite = storage( this.orderAttribute, 'uint', count );
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* A read-only storage node holding each element's bin, computed during the histogram pass.
|
|
99
|
+
*
|
|
100
|
+
* @type {StorageBufferNode}
|
|
101
|
+
*/
|
|
102
|
+
this.binRead = storage( binAttribute, 'uint', count ).toReadOnly();
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* A writable storage node holding each element's bin.
|
|
106
|
+
*
|
|
107
|
+
* @type {StorageBufferNode}
|
|
108
|
+
*/
|
|
109
|
+
this.binWrite = storage( binAttribute, 'uint', count );
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* An atomic storage node used to accumulate the per-bin histogram.
|
|
113
|
+
*
|
|
114
|
+
* @type {StorageBufferNode}
|
|
115
|
+
*/
|
|
116
|
+
this.histogramAtomic = storage( histogramAttribute, 'uint', binCount ).toAtomic();
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* An atomic storage node used both for the exclusive prefix sum of the histogram and, during
|
|
120
|
+
* the scatter pass, as a per-bin write cursor.
|
|
121
|
+
*
|
|
122
|
+
* @type {StorageBufferNode}
|
|
123
|
+
*/
|
|
124
|
+
this.offsetAtomic = storage( offsetAttribute, 'uint', binCount ).toAtomic();
|
|
125
|
+
|
|
126
|
+
this._webGLBuffersEnabled = false;
|
|
127
|
+
|
|
128
|
+
this._cpuBins = new Uint32Array( count );
|
|
129
|
+
this._cpuCounts = new Uint32Array( binCount );
|
|
130
|
+
this._cpuOffsets = new Uint32Array( binCount );
|
|
131
|
+
|
|
132
|
+
this._resetNode = null;
|
|
133
|
+
this._histogramNode = null;
|
|
134
|
+
this._prefixNode = null;
|
|
135
|
+
this._scatterNode = null;
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Sets the TSL function used to compute the bin of the element currently referenced by
|
|
141
|
+
* `instanceIndex`, and (re)builds the compute nodes used by {@link CountingSort#compute}.
|
|
142
|
+
*
|
|
143
|
+
* @param {Function} binNode - A parameterless function returning a `Node<uint>` in `[0, binCount)`.
|
|
144
|
+
*/
|
|
145
|
+
setBinNode( binNode ) {
|
|
146
|
+
|
|
147
|
+
const { binCount, workgroupSize, count } = this;
|
|
148
|
+
|
|
149
|
+
this._resetNode = Fn( () => {
|
|
150
|
+
|
|
151
|
+
atomicStore( this.histogramAtomic.element( instanceIndex ), uint( 0 ) );
|
|
152
|
+
atomicStore( this.offsetAtomic.element( instanceIndex ), uint( 0 ) );
|
|
153
|
+
|
|
154
|
+
} )().compute( binCount, [ workgroupSize ] ).setName( 'CountingSortReset' );
|
|
155
|
+
|
|
156
|
+
this._histogramNode = Fn( () => {
|
|
157
|
+
|
|
158
|
+
const bin = binNode().toVar( 'bin' );
|
|
159
|
+
|
|
160
|
+
this.binWrite.element( instanceIndex ).assign( bin );
|
|
161
|
+
atomicAdd( this.histogramAtomic.element( bin ), uint( 1 ) );
|
|
162
|
+
|
|
163
|
+
} )().compute( count, [ workgroupSize ] ).setName( 'CountingSortHistogram' );
|
|
164
|
+
|
|
165
|
+
this._prefixNode = Fn( () => {
|
|
166
|
+
|
|
167
|
+
const sum = uint( 0 ).toVar( 'sum' );
|
|
168
|
+
|
|
169
|
+
Loop( { start: 0, end: binCount, type: 'uint', name: 'bin', condition: '<' }, ( { bin } ) => {
|
|
170
|
+
|
|
171
|
+
const binCountValue = atomicLoad( this.histogramAtomic.element( bin ) ).toVar( 'count' );
|
|
172
|
+
atomicStore( this.offsetAtomic.element( bin ), sum );
|
|
173
|
+
sum.addAssign( binCountValue );
|
|
174
|
+
|
|
175
|
+
} );
|
|
176
|
+
|
|
177
|
+
} )().compute( 1 ).setName( 'CountingSortPrefix' );
|
|
178
|
+
|
|
179
|
+
this._scatterNode = Fn( () => {
|
|
180
|
+
|
|
181
|
+
const bin = this.binRead.element( instanceIndex ).toVar( 'bin' );
|
|
182
|
+
const targetIndex = atomicAdd( this.offsetAtomic.element( bin ), uint( 1 ) ).toVar( 'targetIndex' );
|
|
183
|
+
|
|
184
|
+
this.orderWrite.element( targetIndex ).assign( instanceIndex );
|
|
185
|
+
|
|
186
|
+
} )().compute( count, [ workgroupSize ] ).setName( 'CountingSortScatter' );
|
|
187
|
+
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Executes a complete counting sort on the GPU, updating {@link CountingSort#orderRead}.
|
|
192
|
+
*
|
|
193
|
+
* @param {Renderer} renderer - The current scene's renderer.
|
|
194
|
+
*/
|
|
195
|
+
compute( renderer ) {
|
|
196
|
+
|
|
197
|
+
renderer.compute( this._resetNode );
|
|
198
|
+
renderer.compute( this._histogramNode );
|
|
199
|
+
renderer.compute( this._prefixNode );
|
|
200
|
+
renderer.compute( this._scatterNode );
|
|
201
|
+
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Executes a complete counting sort on the CPU, updating {@link CountingSort#orderAttribute}.
|
|
206
|
+
* Intended as a fallback for backends without compute shader support.
|
|
207
|
+
*
|
|
208
|
+
* @param {Function} binFn - A function taking an element index and returning its bin (a plain number in `[0, binCount)`).
|
|
209
|
+
*/
|
|
210
|
+
computeCPU( binFn ) {
|
|
211
|
+
|
|
212
|
+
const { count, binCount } = this;
|
|
213
|
+
const order = this.orderAttribute.array;
|
|
214
|
+
const bins = this._cpuBins;
|
|
215
|
+
const counts = this._cpuCounts;
|
|
216
|
+
const offsets = this._cpuOffsets;
|
|
217
|
+
|
|
218
|
+
counts.fill( 0 );
|
|
219
|
+
|
|
220
|
+
for ( let i = 0; i < count; i ++ ) {
|
|
221
|
+
|
|
222
|
+
const bin = binFn( i );
|
|
223
|
+
|
|
224
|
+
bins[ i ] = bin;
|
|
225
|
+
counts[ bin ] ++;
|
|
226
|
+
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
let sum = 0;
|
|
230
|
+
|
|
231
|
+
for ( let i = 0; i < binCount; i ++ ) {
|
|
232
|
+
|
|
233
|
+
offsets[ i ] = sum;
|
|
234
|
+
sum += counts[ i ];
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
for ( let i = 0; i < count; i ++ ) {
|
|
239
|
+
|
|
240
|
+
order[ offsets[ bins[ i ] ] ++ ] = i;
|
|
241
|
+
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
this.orderAttribute.needsUpdate = true;
|
|
245
|
+
|
|
246
|
+
if ( this.orderAttribute.pbo !== undefined ) {
|
|
247
|
+
|
|
248
|
+
this.orderAttribute.pbo.needsUpdate = true;
|
|
249
|
+
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Enables the WebGL-specific storage buffer path (PBO + dynamic draw usage) for the order buffer.
|
|
256
|
+
* Only needed when {@link CountingSort#computeCPU} is used with the WebGL backend of {@link WebGPURenderer}.
|
|
257
|
+
*/
|
|
258
|
+
enableWebGLBuffers() {
|
|
259
|
+
|
|
260
|
+
if ( this._webGLBuffersEnabled === true ) return;
|
|
261
|
+
|
|
262
|
+
this.orderAttribute.setUsage( DynamicDrawUsage );
|
|
263
|
+
this.orderRead.setPBO( true );
|
|
264
|
+
|
|
265
|
+
this._webGLBuffersEnabled = true;
|
|
266
|
+
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export { CountingSort };
|
|
@@ -1,173 +1,27 @@
|
|
|
1
1
|
import {
|
|
2
|
-
Data3DTexture,
|
|
3
|
-
FloatType,
|
|
4
2
|
InstancedBufferAttribute,
|
|
5
3
|
InstancedMesh,
|
|
6
|
-
LinearFilter,
|
|
7
4
|
Matrix4,
|
|
8
|
-
|
|
9
|
-
ShaderMaterial,
|
|
5
|
+
NodeMaterial,
|
|
10
6
|
SphereGeometry,
|
|
11
7
|
Vector3
|
|
12
|
-
} from '@gnsx/three';
|
|
13
|
-
|
|
14
|
-
import { NodeMaterial } from '@gnsx/three/webgpu';
|
|
15
|
-
import {
|
|
16
|
-
attribute,
|
|
17
|
-
Fn,
|
|
18
|
-
getLightProbeGridIrradianceAtUV,
|
|
19
|
-
normalWorld,
|
|
20
|
-
texture3D,
|
|
21
|
-
uniform,
|
|
22
|
-
vec4
|
|
23
|
-
} from '@gnsx/three/tsl';
|
|
24
|
-
// !WITH_GENESYS
|
|
25
|
-
|
|
26
|
-
// WITH_GENESYS
|
|
27
|
-
const _emptyTexture = /*@__PURE__*/ new Data3DTexture( new Float32Array( 1 * 1 * 28 * 4 ), 1, 1, 28 );
|
|
28
|
-
|
|
29
|
-
_emptyTexture.format = RGBAFormat;
|
|
30
|
-
_emptyTexture.type = FloatType;
|
|
31
|
-
_emptyTexture.minFilter = LinearFilter;
|
|
32
|
-
_emptyTexture.magFilter = LinearFilter;
|
|
33
|
-
_emptyTexture.needsUpdate = true;
|
|
34
|
-
|
|
35
|
-
function createNodeMaterial( probes ) {
|
|
36
|
-
|
|
37
|
-
const probesSH = texture3D( probes.texture || _emptyTexture );
|
|
38
|
-
const probesResolution = uniform( new Vector3( 1, 1, 1 ) );
|
|
39
|
-
const instanceUVW = attribute( 'instanceUVW', 'vec3' );
|
|
40
|
-
|
|
41
|
-
const fragmentNode = Fn( () => {
|
|
42
|
-
|
|
43
|
-
const irradiance = getLightProbeGridIrradianceAtUV( {
|
|
44
|
-
probesSH,
|
|
45
|
-
probesResolution,
|
|
46
|
-
gridUVW: instanceUVW,
|
|
47
|
-
worldNormal: normalWorld
|
|
48
|
-
} );
|
|
49
|
-
|
|
50
|
-
return vec4( irradiance, 1.0 );
|
|
51
|
-
|
|
52
|
-
} )();
|
|
53
|
-
|
|
54
|
-
const material = new NodeMaterial();
|
|
55
|
-
material.fragmentNode = fragmentNode;
|
|
56
|
-
|
|
57
|
-
return { material, probesSH, probesResolution };
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
// !WITH_GENESYS
|
|
61
|
-
|
|
62
|
-
function createShaderMaterial() {
|
|
63
|
-
|
|
64
|
-
return new ShaderMaterial( {
|
|
65
|
-
|
|
66
|
-
uniforms: {
|
|
67
|
-
|
|
68
|
-
probesSH: { value: null },
|
|
69
|
-
probesResolution: { value: new Vector3() },
|
|
70
|
-
|
|
71
|
-
},
|
|
72
|
-
|
|
73
|
-
vertexShader: /* glsl */`
|
|
74
|
-
|
|
75
|
-
attribute vec3 instanceUVW;
|
|
76
|
-
|
|
77
|
-
varying vec3 vWorldNormal;
|
|
78
|
-
varying vec3 vUVW;
|
|
79
|
-
|
|
80
|
-
void main() {
|
|
81
|
-
|
|
82
|
-
vUVW = instanceUVW;
|
|
83
|
-
vWorldNormal = normalize( mat3( modelMatrix ) * normal );
|
|
84
|
-
gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4( position, 1.0 );
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
`,
|
|
89
|
-
|
|
90
|
-
fragmentShader: /* glsl */`
|
|
91
|
-
|
|
92
|
-
precision highp sampler3D;
|
|
93
|
-
|
|
94
|
-
uniform sampler3D probesSH;
|
|
95
|
-
uniform vec3 probesResolution;
|
|
96
|
-
|
|
97
|
-
varying vec3 vWorldNormal;
|
|
98
|
-
varying vec3 vUVW;
|
|
99
|
-
|
|
100
|
-
void main() {
|
|
101
|
-
|
|
102
|
-
// Atlas UV mapping — must match lightprobes_pars_fragment.glsl.js
|
|
103
|
-
float nz = probesResolution.z;
|
|
104
|
-
float paddedSlices = nz + 2.0;
|
|
105
|
-
float atlasDepth = 7.0 * paddedSlices;
|
|
106
|
-
float uvZBase = vUVW.z * nz + 1.0;
|
|
107
|
-
|
|
108
|
-
vec4 s0 = texture( probesSH, vec3( vUVW.xy, ( uvZBase ) / atlasDepth ) );
|
|
109
|
-
vec4 s1 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + paddedSlices ) / atlasDepth ) );
|
|
110
|
-
vec4 s2 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 2.0 * paddedSlices ) / atlasDepth ) );
|
|
111
|
-
vec4 s3 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 3.0 * paddedSlices ) / atlasDepth ) );
|
|
112
|
-
vec4 s4 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 4.0 * paddedSlices ) / atlasDepth ) );
|
|
113
|
-
vec4 s5 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 5.0 * paddedSlices ) / atlasDepth ) );
|
|
114
|
-
vec4 s6 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 6.0 * paddedSlices ) / atlasDepth ) );
|
|
115
|
-
|
|
116
|
-
// Unpack 9 vec3 SH L2 coefficients
|
|
117
|
-
|
|
118
|
-
vec3 c0 = s0.xyz;
|
|
119
|
-
vec3 c1 = vec3( s0.w, s1.xy );
|
|
120
|
-
vec3 c2 = vec3( s1.zw, s2.x );
|
|
121
|
-
vec3 c3 = s2.yzw;
|
|
122
|
-
vec3 c4 = s3.xyz;
|
|
123
|
-
vec3 c5 = vec3( s3.w, s4.xy );
|
|
124
|
-
vec3 c6 = vec3( s4.zw, s5.x );
|
|
125
|
-
vec3 c7 = s5.yzw;
|
|
126
|
-
vec3 c8 = s6.xyz;
|
|
127
|
-
|
|
128
|
-
vec3 n = normalize( vWorldNormal );
|
|
129
|
-
|
|
130
|
-
float x = n.x, y = n.y, z = n.z;
|
|
131
|
-
|
|
132
|
-
// band 0
|
|
133
|
-
vec3 result = c0 * 0.886227;
|
|
134
|
-
|
|
135
|
-
// band 1,
|
|
136
|
-
result += c1 * 2.0 * 0.511664 * y;
|
|
137
|
-
result += c2 * 2.0 * 0.511664 * z;
|
|
138
|
-
result += c3 * 2.0 * 0.511664 * x;
|
|
139
|
-
|
|
140
|
-
// band 2,
|
|
141
|
-
result += c4 * 2.0 * 0.429043 * x * y;
|
|
142
|
-
result += c5 * 2.0 * 0.429043 * y * z;
|
|
143
|
-
result += c6 * ( 0.743125 * z * z - 0.247708 );
|
|
144
|
-
result += c7 * 2.0 * 0.429043 * x * z;
|
|
145
|
-
result += c8 * 0.429043 * ( x * x - y * y );
|
|
146
|
-
|
|
147
|
-
gl_FragColor = vec4( max( result, vec3( 0.0 ) ), 1.0 );
|
|
148
|
-
|
|
149
|
-
#include <tonemapping_fragment>
|
|
150
|
-
#include <colorspace_fragment>
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
`
|
|
155
|
-
|
|
156
|
-
} );
|
|
157
|
-
|
|
158
|
-
}
|
|
8
|
+
} from '@gnsx/three/webgpu';
|
|
9
|
+
import { array, attribute, Fn, getShIrradianceAt, normalWorld, texture3D, uniform, vec3, vec4 } from '@gnsx/three/tsl';
|
|
159
10
|
|
|
160
11
|
/**
|
|
161
|
-
* Visualizes
|
|
162
|
-
*
|
|
12
|
+
* Visualizes a {@link LightProbeGrid} by rendering a sphere at each probe
|
|
13
|
+
* position, shaded with the probe's L2 spherical harmonics. Uses a single
|
|
14
|
+
* `InstancedMesh` draw call for all probes.
|
|
163
15
|
*
|
|
164
|
-
*
|
|
16
|
+
* This helper can only be used with {@link WebGPURenderer}.
|
|
17
|
+
* When using {@link WebGLRenderer}, import from `LightProbeGridHelperWebGL.js`.
|
|
165
18
|
*
|
|
166
19
|
* ```js
|
|
167
20
|
* const helper = new LightProbeGridHelper( probes );
|
|
168
21
|
* scene.add( helper );
|
|
169
22
|
* ```
|
|
170
23
|
*
|
|
24
|
+
* @private
|
|
171
25
|
* @augments InstancedMesh
|
|
172
26
|
* @three_import import { LightProbeGridHelper } from 'three/addons/helpers/LightProbeGridHelper.js';
|
|
173
27
|
*/
|
|
@@ -178,18 +32,16 @@ class LightProbeGridHelper extends InstancedMesh {
|
|
|
178
32
|
*
|
|
179
33
|
* @param {LightProbeGrid} probes - The probe grid to visualize.
|
|
180
34
|
* @param {number} [sphereSize=0.12] - The radius of each probe sphere.
|
|
181
|
-
* @param {Object} [options] - The helper options.
|
|
182
|
-
* @param {boolean} [options.webgpu=false] - Whether to use a WebGPU-compatible node material.
|
|
183
35
|
*/
|
|
184
|
-
constructor( probes, sphereSize = 0.12
|
|
36
|
+
constructor( probes, sphereSize = 0.12 ) {
|
|
185
37
|
|
|
186
38
|
const geometry = new SphereGeometry( sphereSize, 16, 16 );
|
|
187
|
-
const
|
|
39
|
+
const material = new NodeMaterial();
|
|
188
40
|
|
|
189
41
|
const res = probes.resolution;
|
|
190
42
|
const count = res.x * res.y * res.z;
|
|
191
43
|
|
|
192
|
-
super( geometry,
|
|
44
|
+
super( geometry, material, count );
|
|
193
45
|
|
|
194
46
|
/**
|
|
195
47
|
* The probe grid to visualize.
|
|
@@ -200,18 +52,49 @@ class LightProbeGridHelper extends InstancedMesh {
|
|
|
200
52
|
|
|
201
53
|
this.type = 'LightProbeGridHelper';
|
|
202
54
|
|
|
203
|
-
//
|
|
204
|
-
|
|
205
|
-
this.
|
|
206
|
-
|
|
55
|
+
// Atlas and resolution are swappable uniforms, so the shading node builds once.
|
|
56
|
+
|
|
57
|
+
this._atlas = texture3D( probes.texture );
|
|
58
|
+
this._resolution = uniform( new Vector3() );
|
|
59
|
+
|
|
60
|
+
const nz = this._resolution.z;
|
|
61
|
+
const paddedSlices = nz.add( 2.0 );
|
|
62
|
+
const atlasDepth = paddedSlices.mul( 7.0 );
|
|
63
|
+
|
|
64
|
+
material.fragmentNode = Fn( () => {
|
|
65
|
+
|
|
66
|
+
const uvw = attribute( 'instanceUVW', 'vec3' );
|
|
67
|
+
const uvZBase = uvw.z.mul( nz ).add( 1.0 );
|
|
68
|
+
|
|
69
|
+
const slice = ( t ) => this._atlas.sample( vec3( uvw.xy, uvZBase.add( paddedSlices.mul( t ) ).div( atlasDepth ) ) );
|
|
70
|
+
|
|
71
|
+
const s0 = slice( 0 ), s1 = slice( 1 ), s2 = slice( 2 ), s3 = slice( 3 );
|
|
72
|
+
const s4 = slice( 4 ), s5 = slice( 5 ), s6 = slice( 6 );
|
|
73
|
+
|
|
74
|
+
const sh = array( [
|
|
75
|
+
s0.xyz,
|
|
76
|
+
vec3( s0.w, s1.xy ),
|
|
77
|
+
vec3( s1.zw, s2.x ),
|
|
78
|
+
s2.yzw,
|
|
79
|
+
s3.xyz,
|
|
80
|
+
vec3( s3.w, s4.xy ),
|
|
81
|
+
vec3( s4.zw, s5.x ),
|
|
82
|
+
s5.yzw,
|
|
83
|
+
s6.xyz
|
|
84
|
+
] );
|
|
85
|
+
|
|
86
|
+
return vec4( getShIrradianceAt( normalWorld, sh ).max( vec3( 0.0 ) ), 1.0 );
|
|
87
|
+
|
|
88
|
+
} )();
|
|
207
89
|
|
|
208
90
|
this.update();
|
|
209
91
|
|
|
210
92
|
}
|
|
211
93
|
|
|
212
94
|
/**
|
|
213
|
-
* Rebuilds instance matrices and UVW attributes from the current probe grid
|
|
214
|
-
*
|
|
95
|
+
* Rebuilds instance matrices and UVW attributes from the current probe grid,
|
|
96
|
+
* and rebinds the shading node to its atlas. Call this after changing
|
|
97
|
+
* `probes` or after re-baking.
|
|
215
98
|
*/
|
|
216
99
|
update() {
|
|
217
100
|
|
|
@@ -219,17 +102,17 @@ class LightProbeGridHelper extends InstancedMesh {
|
|
|
219
102
|
const res = probes.resolution;
|
|
220
103
|
const count = res.x * res.y * res.z;
|
|
221
104
|
|
|
105
|
+
// Resize instance matrix buffer if needed.
|
|
106
|
+
|
|
222
107
|
if ( this.instanceMatrix.count !== count ) {
|
|
223
108
|
|
|
224
|
-
// WITH_GENESYS
|
|
225
|
-
this.instanceMatrix.dispose();
|
|
226
|
-
// !WITH_GENESYS
|
|
227
109
|
this.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );
|
|
228
110
|
|
|
229
111
|
}
|
|
230
112
|
|
|
231
113
|
this.count = count;
|
|
232
114
|
|
|
115
|
+
const uvwArray = new Float32Array( count * 3 );
|
|
233
116
|
const matrix = new Matrix4();
|
|
234
117
|
const probePos = new Vector3();
|
|
235
118
|
|
|
@@ -241,6 +124,11 @@ class LightProbeGridHelper extends InstancedMesh {
|
|
|
241
124
|
|
|
242
125
|
for ( let ix = 0; ix < res.x; ix ++ ) {
|
|
243
126
|
|
|
127
|
+
// Remap to texel centers (must match LightProbeGridNode).
|
|
128
|
+
uvwArray[ i * 3 ] = ( ix + 0.5 ) / res.x;
|
|
129
|
+
uvwArray[ i * 3 + 1 ] = ( iy + 0.5 ) / res.y;
|
|
130
|
+
uvwArray[ i * 3 + 2 ] = ( iz + 0.5 ) / res.z;
|
|
131
|
+
|
|
244
132
|
probes.getProbePosition( ix, iy, iz, probePos );
|
|
245
133
|
matrix.makeTranslation( probePos.x, probePos.y, probePos.z );
|
|
246
134
|
this.setMatrixAt( i, matrix );
|
|
@@ -255,65 +143,10 @@ class LightProbeGridHelper extends InstancedMesh {
|
|
|
255
143
|
|
|
256
144
|
this.instanceMatrix.needsUpdate = true;
|
|
257
145
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
if ( instanceUVW === undefined || instanceUVW.count !== count ) {
|
|
261
|
-
|
|
262
|
-
// WITH_GENESYS
|
|
263
|
-
if ( instanceUVW !== undefined ) {
|
|
264
|
-
|
|
265
|
-
instanceUVW.dispose();
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
// !WITH_GENESYS
|
|
269
|
-
|
|
270
|
-
const uvwArray = new Float32Array( count * 3 );
|
|
271
|
-
|
|
272
|
-
i = 0;
|
|
273
|
-
|
|
274
|
-
for ( let iz = 0; iz < res.z; iz ++ ) {
|
|
275
|
-
|
|
276
|
-
for ( let iy = 0; iy < res.y; iy ++ ) {
|
|
277
|
-
|
|
278
|
-
for ( let ix = 0; ix < res.x; ix ++ ) {
|
|
279
|
-
|
|
280
|
-
// Remap to texel centers (must match lightprobes_pars_fragment.glsl.js)
|
|
281
|
-
uvwArray[ i * 3 ] = ( ix + 0.5 ) / res.x;
|
|
282
|
-
uvwArray[ i * 3 + 1 ] = ( iy + 0.5 ) / res.y;
|
|
283
|
-
uvwArray[ i * 3 + 2 ] = ( iz + 0.5 ) / res.z;
|
|
146
|
+
this.geometry.setAttribute( 'instanceUVW', new InstancedBufferAttribute( uvwArray, 3 ) );
|
|
284
147
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
instanceUVW = new InstancedBufferAttribute( uvwArray, 3 );
|
|
294
|
-
this.geometry.setAttribute( 'instanceUVW', instanceUVW );
|
|
295
|
-
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Update texture uniforms
|
|
299
|
-
|
|
300
|
-
// WITH_GENESYS
|
|
301
|
-
if ( this._probesSH !== null && this._probesResolution !== null ) {
|
|
302
|
-
|
|
303
|
-
this._probesSH.value = probes.texture || _emptyTexture;
|
|
304
|
-
this._probesResolution.value.copy( probes.resolution );
|
|
305
|
-
|
|
306
|
-
} else {
|
|
307
|
-
|
|
308
|
-
// !WITH_GENESYS
|
|
309
|
-
|
|
310
|
-
this.material.uniforms.probesSH.value = probes.texture;
|
|
311
|
-
this.material.uniforms.probesResolution.value.copy( probes.resolution );
|
|
312
|
-
|
|
313
|
-
// WITH_GENESYS
|
|
314
|
-
|
|
315
|
-
}
|
|
316
|
-
// !WITH_GENESYS
|
|
148
|
+
this._atlas.value = probes.texture;
|
|
149
|
+
this._resolution.value.copy( res );
|
|
317
150
|
|
|
318
151
|
}
|
|
319
152
|
|
|
@@ -323,18 +156,6 @@ class LightProbeGridHelper extends InstancedMesh {
|
|
|
323
156
|
*/
|
|
324
157
|
dispose() {
|
|
325
158
|
|
|
326
|
-
// WITH_GENESYS
|
|
327
|
-
this.instanceMatrix.dispose();
|
|
328
|
-
|
|
329
|
-
const instanceUVW = this.geometry.getAttribute( 'instanceUVW' );
|
|
330
|
-
|
|
331
|
-
if ( instanceUVW !== undefined ) {
|
|
332
|
-
|
|
333
|
-
instanceUVW.dispose();
|
|
334
|
-
|
|
335
|
-
}
|
|
336
|
-
// !WITH_GENESYS
|
|
337
|
-
|
|
338
159
|
this.geometry.dispose();
|
|
339
160
|
this.material.dispose();
|
|
340
161
|
|