@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
|
@@ -188,9 +188,13 @@ class TSLEncoder {
|
|
|
188
188
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
if ( node.name === 'array' ) {
|
|
192
192
|
|
|
193
|
-
|
|
193
|
+
this.addImport( 'array' );
|
|
194
|
+
|
|
195
|
+
code = `array( [ ${ params.join( ', ' ) } ] )`;
|
|
196
|
+
|
|
197
|
+
} else if ( textureLookupFunctions.includes( node.name ) ) {
|
|
194
198
|
|
|
195
199
|
code = `${ params[ 0 ] }.sample( ${ params[ 1 ] } )`;
|
|
196
200
|
|
|
@@ -368,12 +372,10 @@ class TSLEncoder {
|
|
|
368
372
|
|
|
369
373
|
} else {
|
|
370
374
|
|
|
371
|
-
|
|
375
|
+
throw new Error( 'THREE.TSLEncoder: Unknown AST node type "' + node.constructor.name + '"' );
|
|
372
376
|
|
|
373
377
|
}
|
|
374
378
|
|
|
375
|
-
if ( ! code ) code = '/* unknown statement */';
|
|
376
|
-
|
|
377
379
|
return code;
|
|
378
380
|
|
|
379
381
|
}
|
|
@@ -479,6 +481,38 @@ ${ this.tab }} )`;
|
|
|
479
481
|
|
|
480
482
|
}
|
|
481
483
|
|
|
484
|
+
isVariableUsed( node, varName ) {
|
|
485
|
+
|
|
486
|
+
if ( ! node ) return false;
|
|
487
|
+
|
|
488
|
+
if ( node.isAccessor && node.property === varName ) return true;
|
|
489
|
+
|
|
490
|
+
for ( const key in node ) {
|
|
491
|
+
|
|
492
|
+
if ( key === 'parent' ) continue;
|
|
493
|
+
|
|
494
|
+
const child = node[ key ];
|
|
495
|
+
|
|
496
|
+
if ( Array.isArray( child ) ) {
|
|
497
|
+
|
|
498
|
+
for ( const item of child ) {
|
|
499
|
+
|
|
500
|
+
if ( this.isVariableUsed( item, varName ) ) return true;
|
|
501
|
+
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
} else if ( child && child.isASTNode ) {
|
|
505
|
+
|
|
506
|
+
if ( this.isVariableUsed( child, varName ) ) return true;
|
|
507
|
+
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
return false;
|
|
513
|
+
|
|
514
|
+
}
|
|
515
|
+
|
|
482
516
|
emitLoop( node ) {
|
|
483
517
|
|
|
484
518
|
const start = this.emitExpression( node.initialization.value );
|
|
@@ -504,7 +538,7 @@ ${ this.tab }} )`;
|
|
|
504
538
|
|
|
505
539
|
} else if ( node.afterthought.isOperator ) {
|
|
506
540
|
|
|
507
|
-
if ( node.afterthought.right.isAccessor || node.afterthought.right.isNumber ) {
|
|
541
|
+
if ( node.afterthought.right && ( node.afterthought.right.isAccessor || node.afterthought.right.isNumber ) ) {
|
|
508
542
|
|
|
509
543
|
updateParam = `, update: ${ this.emitExpression( node.afterthought.right ) }`;
|
|
510
544
|
|
|
@@ -516,7 +550,22 @@ ${ this.tab }} )`;
|
|
|
516
550
|
|
|
517
551
|
}
|
|
518
552
|
|
|
519
|
-
let
|
|
553
|
+
let loopParams;
|
|
554
|
+
|
|
555
|
+
if ( start === '0' && nameParam === '' && typeParam === '' && conditionParam === '' && updateParam === '' ) {
|
|
556
|
+
|
|
557
|
+
loopParams = end;
|
|
558
|
+
|
|
559
|
+
} else {
|
|
560
|
+
|
|
561
|
+
loopParams = `{ start: ${ start }, end: ${ end + nameParam + typeParam + conditionParam + updateParam } }`;
|
|
562
|
+
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
const isUsed = this.isVariableUsed( node.body, name );
|
|
566
|
+
const callbackParams = isUsed ? `( { ${ name } } ) =>` : '() =>';
|
|
567
|
+
|
|
568
|
+
let loopStr = `Loop( ${ loopParams }, ${ callbackParams } {\n\n`;
|
|
520
569
|
|
|
521
570
|
loopStr += this.emitBody( node.body ) + '\n\n';
|
|
522
571
|
|
|
@@ -590,10 +639,10 @@ ${ this.tab }} )`;
|
|
|
590
639
|
const { initialization, condition, afterthought } = node;
|
|
591
640
|
|
|
592
641
|
if ( ( initialization && initialization.isVariableDeclaration && initialization.next === null ) &&
|
|
593
|
-
( condition && condition.left.isAccessor && condition.left.property === initialization.name ) &&
|
|
642
|
+
( condition && condition.left && condition.left.isAccessor && condition.left.property === initialization.name ) &&
|
|
594
643
|
( afterthought && (
|
|
595
|
-
( afterthought.isUnary && ( initialization.name === afterthought.expression.property ) ) ||
|
|
596
|
-
( afterthought.isOperator && ( initialization.name === afterthought.left.property ) )
|
|
644
|
+
( afterthought.isUnary && afterthought.expression && ( initialization.name === afterthought.expression.property ) ) ||
|
|
645
|
+
( afterthought.isOperator && afterthought.left && ( initialization.name === afterthought.left.property ) )
|
|
597
646
|
) )
|
|
598
647
|
) {
|
|
599
648
|
|
|
@@ -632,8 +681,31 @@ ${ this.tab }} )`;
|
|
|
632
681
|
|
|
633
682
|
}
|
|
634
683
|
|
|
684
|
+
emitDoWhile( node ) {
|
|
685
|
+
|
|
686
|
+
const condition = this.emitExpression( node.condition );
|
|
687
|
+
const body = this.emitBody( node.body );
|
|
688
|
+
|
|
689
|
+
let loopStr = `Loop( () => {\n\n${ body }\n\n${ this.tab }\tIf( ${ condition }.not(), () => {\n\n${ this.tab }\t\tBreak();\n\n${ this.tab }\t} );\n\n`;
|
|
690
|
+
|
|
691
|
+
loopStr += this.tab + '} )';
|
|
692
|
+
|
|
693
|
+
this.imports.add( 'Loop' );
|
|
694
|
+
this.imports.add( 'If' );
|
|
695
|
+
this.imports.add( 'Break' );
|
|
696
|
+
|
|
697
|
+
return loopStr;
|
|
698
|
+
|
|
699
|
+
}
|
|
700
|
+
|
|
635
701
|
emitWhile( node ) {
|
|
636
702
|
|
|
703
|
+
if ( node.doWhile ) {
|
|
704
|
+
|
|
705
|
+
return this.emitDoWhile( node );
|
|
706
|
+
|
|
707
|
+
}
|
|
708
|
+
|
|
637
709
|
const condition = this.emitExpression( node.condition );
|
|
638
710
|
|
|
639
711
|
let whileStr = `Loop( ${ condition }, () => {\n\n`;
|
|
@@ -194,6 +194,23 @@ class WGSLEncoder {
|
|
|
194
194
|
|
|
195
195
|
code += `( ${ params } )`;
|
|
196
196
|
|
|
197
|
+
} else if ( fnName === 'array' ) {
|
|
198
|
+
|
|
199
|
+
const params = node.params.map( p => this.emitExpression( p ) );
|
|
200
|
+
|
|
201
|
+
if ( node.params.length > 0 && node.params[ 0 ].getType() ) {
|
|
202
|
+
|
|
203
|
+
const elemType = this.getWgslType( node.params[ 0 ].getType() );
|
|
204
|
+
const count = node.params.length;
|
|
205
|
+
|
|
206
|
+
code = `array<${ elemType }, ${ count }>( ${ params.join( ', ' ) } )`;
|
|
207
|
+
|
|
208
|
+
} else {
|
|
209
|
+
|
|
210
|
+
code = `array( ${ params.join( ', ' ) } )`;
|
|
211
|
+
|
|
212
|
+
}
|
|
213
|
+
|
|
197
214
|
} else if ( fnName.startsWith( 'texture' ) ) {
|
|
198
215
|
|
|
199
216
|
// Handle texture functions separately due to sampler handling
|
|
@@ -335,9 +352,7 @@ class WGSLEncoder {
|
|
|
335
352
|
|
|
336
353
|
} else {
|
|
337
354
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
code = `/* unknown node: ${ node.constructor.name } */`;
|
|
355
|
+
throw new Error( 'THREE.WGSLEncoder: Unknown AST node type "' + node.constructor.name + '"' );
|
|
341
356
|
|
|
342
357
|
}
|
|
343
358
|
|
|
@@ -494,6 +509,12 @@ class WGSLEncoder {
|
|
|
494
509
|
const cond = this.emitExpression( node.condition );
|
|
495
510
|
const body = this.emitBody( node.body );
|
|
496
511
|
|
|
512
|
+
if ( node.doWhile ) {
|
|
513
|
+
|
|
514
|
+
return `loop {\n\n${ body }\n\n${ this.tab }\tcontinuing {\n${ this.tab }\t\tbreak if ( ! ( ${ cond } ) );\n${ this.tab }\t}\n${ this.tab }}`;
|
|
515
|
+
|
|
516
|
+
}
|
|
517
|
+
|
|
497
518
|
return `while ( ${ cond } ) {\n\n${ body }\n\n${ this.tab }}`;
|
|
498
519
|
|
|
499
520
|
}
|
|
@@ -577,7 +598,15 @@ class WGSLEncoder {
|
|
|
577
598
|
|
|
578
599
|
}
|
|
579
600
|
|
|
580
|
-
|
|
601
|
+
let typeStr = `: ${ type }`;
|
|
602
|
+
|
|
603
|
+
if ( current.value && current.value.isFunctionCall && current.value.name === 'array' ) {
|
|
604
|
+
|
|
605
|
+
typeStr = '';
|
|
606
|
+
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
declarations.push( `${ keyword } ${ current.name }${ typeStr }${ valueStr }` );
|
|
581
610
|
|
|
582
611
|
current = current.next;
|
|
583
612
|
|
|
@@ -34,7 +34,6 @@ import {
|
|
|
34
34
|
// - Storage textures not supported
|
|
35
35
|
// - Fog / environment do not automatically update - must call "dispose"
|
|
36
36
|
// - instanced mesh geometry cannot be shared
|
|
37
|
-
// - Node materials cannot be used with "compile" function
|
|
38
37
|
|
|
39
38
|
// hash any object parameters that will impact the resulting shader so we can force
|
|
40
39
|
// a program update
|
|
@@ -108,7 +107,7 @@ class SceneContext {
|
|
|
108
107
|
|
|
109
108
|
const { lightsNode, environmentNode, fogNode } = this;
|
|
110
109
|
const lightsHash = lightsNode.getCacheKey();
|
|
111
|
-
const envHash = environmentNode ? environmentNode.getCacheKey : 0;
|
|
110
|
+
const envHash = environmentNode ? environmentNode.getCacheKey() : 0;
|
|
112
111
|
const fogHash = fogNode ? fogNode.getCacheKey() : 0;
|
|
113
112
|
return NodeUtils.hashArray( [ lightsHash, envHash, fogHash ] );
|
|
114
113
|
|
|
@@ -116,21 +115,7 @@ class SceneContext {
|
|
|
116
115
|
|
|
117
116
|
update() {
|
|
118
117
|
|
|
119
|
-
const { scene
|
|
120
|
-
|
|
121
|
-
// update lighting
|
|
122
|
-
const sceneLights = [];
|
|
123
|
-
scene.traverse( object => {
|
|
124
|
-
|
|
125
|
-
if ( object.isLight ) {
|
|
126
|
-
|
|
127
|
-
sceneLights.push( object );
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
} );
|
|
132
|
-
|
|
133
|
-
lightsNode.setLights( sceneLights );
|
|
118
|
+
const { scene } = this;
|
|
134
119
|
|
|
135
120
|
// update fog
|
|
136
121
|
if ( this.prevFog !== scene.fog ) {
|
|
@@ -245,6 +230,12 @@ class RendererProxy {
|
|
|
245
230
|
|
|
246
231
|
}
|
|
247
232
|
|
|
233
|
+
getCanvasTarget() {
|
|
234
|
+
|
|
235
|
+
return null;
|
|
236
|
+
|
|
237
|
+
}
|
|
238
|
+
|
|
248
239
|
hasCompatibility( name ) {
|
|
249
240
|
|
|
250
241
|
if ( name === Compatibility.TEXTURE_COMPARE ) {
|
|
@@ -402,50 +393,41 @@ export class WebGLNodesHandler {
|
|
|
402
393
|
}
|
|
403
394
|
|
|
404
395
|
|
|
405
|
-
renderStart( scene, camera ) {
|
|
396
|
+
renderStart( scene, camera, targetScene = scene ) {
|
|
406
397
|
|
|
407
398
|
const { nodeFrame, renderStack, renderer, sceneContexts } = this;
|
|
408
399
|
nodeFrame.update();
|
|
409
400
|
nodeFrame.camera = camera;
|
|
410
|
-
nodeFrame.scene =
|
|
401
|
+
nodeFrame.scene = targetScene;
|
|
411
402
|
nodeFrame.frameId ++;
|
|
412
403
|
|
|
413
|
-
let sceneContext = sceneContexts.get(
|
|
404
|
+
let sceneContext = sceneContexts.get( targetScene );
|
|
414
405
|
if ( ! sceneContext ) {
|
|
415
406
|
|
|
416
|
-
sceneContext = new SceneContext( renderer,
|
|
417
|
-
sceneContexts.set(
|
|
407
|
+
sceneContext = new SceneContext( renderer, targetScene );
|
|
408
|
+
sceneContexts.set( targetScene, sceneContext );
|
|
418
409
|
|
|
419
410
|
}
|
|
420
411
|
|
|
412
|
+
renderer.lighting.beginRender( targetScene );
|
|
421
413
|
sceneContext.update();
|
|
422
414
|
renderStack.push( { sceneContext, camera } );
|
|
423
415
|
|
|
424
|
-
|
|
425
|
-
// traversal and build
|
|
426
|
-
const {
|
|
427
|
-
customProgramCacheKeyCallback,
|
|
428
|
-
onBeforeRenderCallback,
|
|
429
|
-
} = this;
|
|
430
|
-
|
|
431
|
-
scene.traverse( object => {
|
|
432
|
-
|
|
433
|
-
if ( object.material && object.material.isNodeMaterial ) {
|
|
416
|
+
}
|
|
434
417
|
|
|
435
|
-
|
|
436
|
-
object.material.onBeforeRender = onBeforeRenderCallback;
|
|
418
|
+
updateLights( lights ) {
|
|
437
419
|
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
} );
|
|
420
|
+
const frame = this.renderStack[ this.renderStack.length - 1 ];
|
|
421
|
+
frame.sceneContext.lightsNode.setLights( lights );
|
|
441
422
|
|
|
442
423
|
}
|
|
443
424
|
|
|
444
425
|
renderEnd() {
|
|
445
426
|
|
|
446
|
-
const { nodeFrame, renderStack } = this;
|
|
427
|
+
const { nodeFrame, renderer, renderStack } = this;
|
|
447
428
|
|
|
448
|
-
renderStack.pop();
|
|
429
|
+
const { sceneContext } = renderStack.pop();
|
|
430
|
+
renderer.lighting.finishRender( sceneContext.scene );
|
|
449
431
|
|
|
450
432
|
const frame = renderStack[ renderStack.length - 1 ];
|
|
451
433
|
if ( frame ) {
|
|
@@ -458,6 +440,14 @@ export class WebGLNodesHandler {
|
|
|
458
440
|
|
|
459
441
|
}
|
|
460
442
|
|
|
443
|
+
setObject( object, material ) {
|
|
444
|
+
|
|
445
|
+
this.nodeFrame.object = object;
|
|
446
|
+
material.customProgramCacheKey = this.customProgramCacheKeyCallback;
|
|
447
|
+
material.onBeforeRender = this.onBeforeRenderCallback;
|
|
448
|
+
|
|
449
|
+
}
|
|
450
|
+
|
|
461
451
|
build( material, object, parameters ) {
|
|
462
452
|
|
|
463
453
|
const {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Matrix3, NodeMaterial, Vector3 } from '@gnsx/three/webgpu';
|
|
2
|
-
import { clamp, Fn, vec4, uv, uniform, max } from '@gnsx/three/tsl';
|
|
2
|
+
import { clamp, Fn, vec4, uv, uniform, max, context } from '@gnsx/three/tsl';
|
|
3
3
|
import StereoCompositePassNode from './StereoCompositePassNode.js';
|
|
4
4
|
import { frameCorners } from '../../utils/CameraUtils.js';
|
|
5
5
|
|
|
@@ -523,7 +523,8 @@ class AnaglyphPassNode extends StereoCompositePassNode {
|
|
|
523
523
|
} );
|
|
524
524
|
|
|
525
525
|
const material = this._material || ( this._material = new NodeMaterial() );
|
|
526
|
-
material.
|
|
526
|
+
material.contextNode = context( builder.getSharedContext() );
|
|
527
|
+
material.fragmentNode = anaglyph();
|
|
527
528
|
material.name = 'Anaglyph';
|
|
528
529
|
material.needsUpdate = true;
|
|
529
530
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, TempNode, NodeUpdateType } from '@gnsx/three/webgpu';
|
|
2
|
-
import { Fn, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, luminance, abs, exp, max } from '@gnsx/three/tsl';
|
|
2
|
+
import { Fn, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, luminance, abs, exp, max, context } from '@gnsx/three/tsl';
|
|
3
3
|
|
|
4
4
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
5
|
|
|
@@ -302,7 +302,8 @@ class BilateralBlurNode extends TempNode {
|
|
|
302
302
|
//
|
|
303
303
|
|
|
304
304
|
const material = this._material || ( this._material = new NodeMaterial() );
|
|
305
|
-
material.
|
|
305
|
+
material.contextNode = context( builder.getSharedContext() );
|
|
306
|
+
material.fragmentNode = blur();
|
|
306
307
|
material.name = 'Bilateral_blur';
|
|
307
308
|
material.needsUpdate = true;
|
|
308
309
|
|
|
@@ -323,6 +324,8 @@ class BilateralBlurNode extends TempNode {
|
|
|
323
324
|
*/
|
|
324
325
|
dispose() {
|
|
325
326
|
|
|
327
|
+
super.dispose();
|
|
328
|
+
|
|
326
329
|
this._horizontalRT.dispose();
|
|
327
330
|
this._verticalRT.dispose();
|
|
328
331
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HalfFloatType, RenderTarget, Vector2, Vector3, TempNode, QuadMesh, NodeMaterial, RendererUtils, NodeUpdateType } from '@gnsx/three/webgpu';
|
|
2
|
-
import { nodeObject, Fn, float, uv, passTexture, uniform, Loop, texture, luminance, smoothstep, mix, vec4, uniformArray, add, int } from '@gnsx/three/tsl';
|
|
2
|
+
import { nodeObject, Fn, float, uv, passTexture, uniform, Loop, texture, luminance, smoothstep, mix, vec4, uniformArray, add, int, array, context } from '@gnsx/three/tsl';
|
|
3
3
|
|
|
4
4
|
const _quadMesh = /*@__PURE__*/ new QuadMesh();
|
|
5
5
|
const _size = /*@__PURE__*/ new Vector2();
|
|
@@ -106,6 +106,15 @@ class BloomNode extends TempNode {
|
|
|
106
106
|
*/
|
|
107
107
|
this.smoothWidth = uniform( 0.01 );
|
|
108
108
|
|
|
109
|
+
/**
|
|
110
|
+
* A per-mip tint color for the bloom, applied during the composite pass.
|
|
111
|
+
* Defaults to white (no tint) for each of the mips. Mutate the vectors to
|
|
112
|
+
* colorize the bloom (e.g. for a warm or anamorphic look).
|
|
113
|
+
*
|
|
114
|
+
* @type {Array<Vector3>}
|
|
115
|
+
*/
|
|
116
|
+
this.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];
|
|
117
|
+
|
|
109
118
|
/**
|
|
110
119
|
* Scale factor for the internal render targets.
|
|
111
120
|
*
|
|
@@ -399,10 +408,13 @@ class BloomNode extends TempNode {
|
|
|
399
408
|
*/
|
|
400
409
|
setup( builder ) {
|
|
401
410
|
|
|
411
|
+
const sharedContext = context( builder.getSharedContext() );
|
|
412
|
+
|
|
402
413
|
// luminosity high pass material
|
|
403
414
|
|
|
404
415
|
this._highPassFilterMaterial = this._highPassFilterMaterial || new NodeMaterial();
|
|
405
|
-
this._highPassFilterMaterial.
|
|
416
|
+
this._highPassFilterMaterial.contextNode = sharedContext;
|
|
417
|
+
this._highPassFilterMaterial.fragmentNode = this.highPassFn( { input: this.inputNode, threshold: this.threshold, smoothWidth: this.smoothWidth } );
|
|
406
418
|
this._highPassFilterMaterial.name = 'Bloom_highPass';
|
|
407
419
|
this._highPassFilterMaterial.needsUpdate = true;
|
|
408
420
|
|
|
@@ -414,29 +426,14 @@ class BloomNode extends TempNode {
|
|
|
414
426
|
|
|
415
427
|
for ( let i = 0; i < this._nMips; i ++ ) {
|
|
416
428
|
|
|
417
|
-
this._separableBlurMaterials.push( this._getSeparableBlurMaterial(
|
|
429
|
+
this._separableBlurMaterials.push( this._getSeparableBlurMaterial( sharedContext, kernelSizeArray[ i ] ) );
|
|
418
430
|
|
|
419
431
|
}
|
|
420
432
|
|
|
421
433
|
// composite material
|
|
422
434
|
|
|
423
|
-
const bloomFactors =
|
|
424
|
-
const bloomTintColors = uniformArray(
|
|
425
|
-
|
|
426
|
-
const lerpBloomFactor = Fn( ( [ factor, radius ] ) => {
|
|
427
|
-
|
|
428
|
-
const mirrorFactor = float( 1.2 ).sub( factor );
|
|
429
|
-
return mix( factor, mirrorFactor, radius );
|
|
430
|
-
|
|
431
|
-
} ).setLayout( {
|
|
432
|
-
name: 'lerpBloomFactor',
|
|
433
|
-
type: 'float',
|
|
434
|
-
inputs: [
|
|
435
|
-
{ name: 'factor', type: 'float' },
|
|
436
|
-
{ name: 'radius', type: 'float' },
|
|
437
|
-
]
|
|
438
|
-
} );
|
|
439
|
-
|
|
435
|
+
const bloomFactors = array( [ 1.0, 0.8, 0.6, 0.4, 0.2 ] );
|
|
436
|
+
const bloomTintColors = uniformArray( this.bloomTintColors );
|
|
440
437
|
|
|
441
438
|
const compositePass = Fn( () => {
|
|
442
439
|
|
|
@@ -453,7 +450,8 @@ class BloomNode extends TempNode {
|
|
|
453
450
|
} );
|
|
454
451
|
|
|
455
452
|
this._compositeMaterial = this._compositeMaterial || new NodeMaterial();
|
|
456
|
-
this._compositeMaterial.
|
|
453
|
+
this._compositeMaterial.contextNode = sharedContext;
|
|
454
|
+
this._compositeMaterial.fragmentNode = compositePass();
|
|
457
455
|
this._compositeMaterial.name = 'Bloom_comp';
|
|
458
456
|
this._compositeMaterial.needsUpdate = true;
|
|
459
457
|
|
|
@@ -469,6 +467,8 @@ class BloomNode extends TempNode {
|
|
|
469
467
|
*/
|
|
470
468
|
dispose() {
|
|
471
469
|
|
|
470
|
+
super.dispose();
|
|
471
|
+
|
|
472
472
|
for ( let i = 0; i < this._renderTargetsHorizontal.length; i ++ ) {
|
|
473
473
|
|
|
474
474
|
this._renderTargetsHorizontal[ i ].dispose();
|
|
@@ -498,11 +498,11 @@ class BloomNode extends TempNode {
|
|
|
498
498
|
* Create a separable blur material for the given kernel radius.
|
|
499
499
|
*
|
|
500
500
|
* @private
|
|
501
|
-
* @param {
|
|
501
|
+
* @param {NodeContext} sharedContext
|
|
502
502
|
* @param {number} kernelRadius - The kernel radius.
|
|
503
503
|
* @return {NodeMaterial}
|
|
504
504
|
*/
|
|
505
|
-
_getSeparableBlurMaterial(
|
|
505
|
+
_getSeparableBlurMaterial( sharedContext, kernelRadius ) {
|
|
506
506
|
|
|
507
507
|
const coefficients = [];
|
|
508
508
|
const sigma = kernelRadius / 3;
|
|
@@ -513,10 +513,28 @@ class BloomNode extends TempNode {
|
|
|
513
513
|
|
|
514
514
|
}
|
|
515
515
|
|
|
516
|
+
// Merge adjacent taps into single bilinear fetches (linear sampling).
|
|
517
|
+
|
|
518
|
+
const centerWeight = coefficients[ 0 ];
|
|
519
|
+
const offsets = [];
|
|
520
|
+
const weights = [];
|
|
521
|
+
|
|
522
|
+
for ( let i = 1; i < kernelRadius; i += 2 ) {
|
|
523
|
+
|
|
524
|
+
const wa = coefficients[ i ];
|
|
525
|
+
const wb = ( i + 1 ) < kernelRadius ? coefficients[ i + 1 ] : 0;
|
|
526
|
+
const w = wa + wb;
|
|
527
|
+
|
|
528
|
+
offsets.push( ( i * wa + ( i + 1 ) * wb ) / w );
|
|
529
|
+
weights.push( w );
|
|
530
|
+
|
|
531
|
+
}
|
|
532
|
+
|
|
516
533
|
//
|
|
517
534
|
|
|
518
535
|
const colorTexture = texture( null );
|
|
519
|
-
const
|
|
536
|
+
const gaussianOffsets = array( offsets );
|
|
537
|
+
const gaussianWeights = array( weights );
|
|
520
538
|
const invSize = uniform( new Vector2() );
|
|
521
539
|
const direction = uniform( new Vector2( 0.5, 0.5 ) );
|
|
522
540
|
|
|
@@ -525,13 +543,12 @@ class BloomNode extends TempNode {
|
|
|
525
543
|
|
|
526
544
|
const separableBlurPass = Fn( () => {
|
|
527
545
|
|
|
528
|
-
const diffuseSum = sampleTexel( uvNode ).rgb.mul(
|
|
546
|
+
const diffuseSum = sampleTexel( uvNode ).rgb.mul( centerWeight ).toVar();
|
|
529
547
|
|
|
530
|
-
Loop( { start: int(
|
|
548
|
+
Loop( { start: int( 0 ), end: int( offsets.length ), type: 'int', condition: '<' }, ( { i } ) => {
|
|
531
549
|
|
|
532
|
-
const
|
|
533
|
-
const
|
|
534
|
-
const uvOffset = direction.mul( invSize ).mul( x );
|
|
550
|
+
const w = gaussianWeights.element( i );
|
|
551
|
+
const uvOffset = direction.mul( invSize ).mul( gaussianOffsets.element( i ) );
|
|
535
552
|
const sample1 = sampleTexel( uvNode.add( uvOffset ) ).rgb;
|
|
536
553
|
const sample2 = sampleTexel( uvNode.sub( uvOffset ) ).rgb;
|
|
537
554
|
diffuseSum.addAssign( add( sample1, sample2 ).mul( w ) );
|
|
@@ -543,7 +560,8 @@ class BloomNode extends TempNode {
|
|
|
543
560
|
} );
|
|
544
561
|
|
|
545
562
|
const separableBlurMaterial = new NodeMaterial();
|
|
546
|
-
separableBlurMaterial.
|
|
563
|
+
separableBlurMaterial.contextNode = sharedContext;
|
|
564
|
+
separableBlurMaterial.fragmentNode = separableBlurPass();
|
|
547
565
|
separableBlurMaterial.name = 'Bloom_separable';
|
|
548
566
|
separableBlurMaterial.needsUpdate = true;
|
|
549
567
|
|
|
@@ -558,6 +576,13 @@ class BloomNode extends TempNode {
|
|
|
558
576
|
|
|
559
577
|
}
|
|
560
578
|
|
|
579
|
+
const lerpBloomFactor = Fn( ( { factor, radius } ) => {
|
|
580
|
+
|
|
581
|
+
const mirrorFactor = float( 1.2 ).sub( factor );
|
|
582
|
+
return mix( factor, mirrorFactor, radius );
|
|
583
|
+
|
|
584
|
+
}, { factor: 'float', radius: 'float', return: 'float' } );
|
|
585
|
+
|
|
561
586
|
/**
|
|
562
587
|
* TSL function for creating a bloom effect.
|
|
563
588
|
*
|
|
@@ -56,12 +56,20 @@ class DenoiseNode extends TempNode {
|
|
|
56
56
|
*/
|
|
57
57
|
this.normalNode = normalNode;
|
|
58
58
|
|
|
59
|
+
/**
|
|
60
|
+
* The internal noise texture.
|
|
61
|
+
*
|
|
62
|
+
* @private
|
|
63
|
+
* @type {DataTexture}
|
|
64
|
+
*/
|
|
65
|
+
this._noiseTexture = generateDefaultNoise();
|
|
66
|
+
|
|
59
67
|
/**
|
|
60
68
|
* The node represents the internal noise texture.
|
|
61
69
|
*
|
|
62
70
|
* @type {TextureNode}
|
|
63
71
|
*/
|
|
64
|
-
this.noiseNode = texture(
|
|
72
|
+
this.noiseNode = texture( this._noiseTexture );
|
|
65
73
|
|
|
66
74
|
/**
|
|
67
75
|
* The luma Phi value.
|
|
@@ -252,6 +260,18 @@ class DenoiseNode extends TempNode {
|
|
|
252
260
|
|
|
253
261
|
}
|
|
254
262
|
|
|
263
|
+
/**
|
|
264
|
+
* Frees internal resources. This method should be called
|
|
265
|
+
* when the effect is no longer required.
|
|
266
|
+
*/
|
|
267
|
+
dispose() {
|
|
268
|
+
|
|
269
|
+
super.dispose();
|
|
270
|
+
|
|
271
|
+
this._noiseTexture.dispose();
|
|
272
|
+
|
|
273
|
+
}
|
|
274
|
+
|
|
255
275
|
}
|
|
256
276
|
|
|
257
277
|
export default DenoiseNode;
|