@gnsx/three 0.185.16 → 0.186.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +10 -82600
- package/build/three.core.js +1309 -807
- package/build/three.module.js +439 -338
- package/build/three.tsl.js +74 -44
- package/build/three.webgpu.js +6036 -2184
- package/build/three.webgpu.nodes.js +6020 -2184
- package/examples/jsm/Addons.js +6 -6
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +44 -20
- package/examples/jsm/controls/OrbitControls.js +9 -0
- package/examples/jsm/controls/TrackballControls.js +109 -4
- package/examples/jsm/csm/CSMShadowNode.js +13 -0
- package/examples/jsm/exporters/GLTFExporter.js +23 -7
- package/examples/jsm/exporters/USDZExporter.js +2 -2
- package/examples/jsm/generators/CityGenerator.js +377 -45
- package/examples/jsm/generators/ForestGenerator.js +12 -12
- package/examples/jsm/generators/TerrainGenerator.js +49 -37
- package/examples/jsm/generators/TreeGenerator.js +70 -76
- package/examples/jsm/generators/city/BenchGenerator.js +127 -0
- package/examples/jsm/generators/city/CarGenerator.js +479 -0
- package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
- package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
- package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
- package/examples/jsm/generators/city/PersonGenerator.js +447 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
- package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
- package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
- package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
- package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
- package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
- package/examples/jsm/gpgpu/CountingSort.js +271 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
- package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/examples/jsm/inspector/Extension.js +94 -0
- package/examples/jsm/inspector/Inspector.js +145 -41
- package/examples/jsm/inspector/RendererInspector.js +100 -52
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
- package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
- package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
- package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
- package/examples/jsm/inspector/tabs/Memory.js +0 -2
- package/examples/jsm/inspector/tabs/Settings.js +4 -0
- package/examples/jsm/inspector/tabs/Timeline.js +223 -171
- package/examples/jsm/inspector/tabs/Viewer.js +515 -21
- package/examples/jsm/inspector/ui/List.js +15 -9
- package/examples/jsm/inspector/ui/Profiler.js +170 -14
- package/examples/jsm/inspector/ui/Style.js +269 -23
- package/examples/jsm/inspector/ui/Tab.js +2 -0
- package/examples/jsm/inspector/ui/Values.js +14 -2
- package/examples/jsm/interactive/HTMLMesh.js +19 -3
- package/examples/jsm/lighting/LightProbeGrid.js +484 -889
- package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
- package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
- package/examples/jsm/lights/SunLight.js +95 -0
- package/examples/jsm/lights/SunLightNode.js +56 -0
- package/examples/jsm/lights/SunLightShadow.js +319 -0
- package/examples/jsm/lights/SunShadowNode.js +312 -0
- package/examples/jsm/loaders/3DMLoader.js +150 -49
- package/examples/jsm/loaders/3MFLoader.js +202 -1
- package/examples/jsm/loaders/FBXLoader.js +81 -5
- package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
- package/examples/jsm/loaders/GLTFLoader.js +79 -14
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
- package/examples/jsm/loaders/KSPLATLoader.js +463 -0
- package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/SPLATLoader.js +139 -0
- package/examples/jsm/loaders/SPZLoader.js +561 -0
- package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
- package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
- package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
- package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
- package/examples/jsm/loaders/usd/USDAParser.js +15 -2
- package/examples/jsm/loaders/usd/USDCParser.js +1 -4
- package/examples/jsm/loaders/usd/USDComposer.js +80 -42
- package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
- package/examples/jsm/misc/RollerCoaster.js +2 -2
- package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
- package/examples/jsm/misc/Sculptor.js +1679 -0
- package/examples/jsm/misc/SculptorMesh.js +1504 -0
- package/examples/jsm/misc/SculptorTools.js +1180 -0
- package/examples/jsm/misc/SculptorUtils.js +345 -0
- package/examples/jsm/misc/TubePainter.js +28 -16
- package/examples/jsm/misc/VolumeSlice.js +24 -24
- package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
- package/examples/jsm/objects/GaussianSplat.js +1039 -0
- package/examples/jsm/objects/Sky.js +66 -45
- package/examples/jsm/objects/SkyMesh.js +70 -51
- package/examples/jsm/physics/JoltPhysics.js +1 -1
- package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/GTAOPass.js +1 -1
- package/examples/jsm/postprocessing/OutlinePass.js +5 -5
- package/examples/jsm/postprocessing/SAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +4 -2
- package/examples/jsm/postprocessing/SavePass.js +1 -1
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
- package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +1 -1
- package/examples/jsm/shaders/FilmShader.js +2 -1
- package/examples/jsm/transpiler/AST.js +21 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
- package/examples/jsm/transpiler/TSLEncoder.js +82 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
- package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
- package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
- package/examples/jsm/tsl/display/BloomNode.js +55 -30
- package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
- package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
- package/examples/jsm/tsl/display/FSR1Node.js +8 -4
- package/examples/jsm/tsl/display/GTAONode.js +199 -86
- package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
- package/examples/jsm/tsl/display/GodraysNode.js +5 -2
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
- package/examples/jsm/tsl/display/LensflareNode.js +5 -2
- package/examples/jsm/tsl/display/OITPassNode.js +352 -0
- package/examples/jsm/tsl/display/OutlineNode.js +2 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
- package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
- package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
- package/examples/jsm/tsl/display/SMAANode.js +22 -61
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
- package/examples/jsm/tsl/display/SSAONode.js +436 -0
- package/examples/jsm/tsl/display/SSGINode.js +5 -2
- package/examples/jsm/tsl/display/SSRNode.js +7 -2
- package/examples/jsm/tsl/display/SSSNode.js +5 -2
- package/examples/jsm/tsl/display/SharpenNode.js +5 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
- package/examples/jsm/tsl/display/TAAUNode.js +22 -125
- package/examples/jsm/tsl/display/TRAANode.js +16 -142
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
- package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
- package/examples/jsm/tsl/display/hashBlur.js +3 -2
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
- package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
- package/examples/jsm/tsl/utils/Raymarching.js +5 -5
- package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
- package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
- package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
- package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
- package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
- package/package.json +9 -16
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +73 -43
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +1 -0
- package/src/animation/AnimationClip.js +15 -2
- package/src/animation/AnimationObjectGroup.js +18 -6
- package/src/animation/AnimationUtils.js +26 -0
- package/src/animation/KeyframeTrack.js +37 -0
- package/src/constants.js +23 -1
- package/src/core/BufferAttribute.js +3 -2
- package/src/core/BufferGeometry.js +1 -1
- package/src/core/InterleavedBuffer.js +5 -1
- package/src/core/Object3D.js +40 -12
- package/src/core/Raycaster.js +4 -0
- package/src/core/RenderTarget.js +99 -9
- package/src/core/RenderTarget3D.js +12 -8
- package/src/extras/Controls.js +0 -8
- package/src/extras/PMREMGenerator.js +99 -205
- package/src/geometries/TorusGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +2 -0
- package/src/helpers/AxesHelper.js +2 -0
- package/src/helpers/Box3Helper.js +2 -0
- package/src/helpers/BoxHelper.js +2 -0
- package/src/helpers/CameraHelper.js +2 -0
- package/src/helpers/DirectionalLightHelper.js +2 -0
- package/src/helpers/GridHelper.js +2 -0
- package/src/helpers/HemisphereLightHelper.js +2 -0
- package/src/helpers/PlaneHelper.js +2 -0
- package/src/helpers/PointLightHelper.js +2 -0
- package/src/helpers/PolarGridHelper.js +2 -0
- package/src/helpers/SkeletonHelper.js +2 -0
- package/src/helpers/SpotLightHelper.js +2 -0
- package/src/lights/Light.js +0 -10
- package/src/lights/LightShadow.js +43 -12
- package/src/lights/SpotLightShadow.js +18 -0
- package/src/loaders/BufferGeometryLoader.js +5 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ObjectLoader.js +8 -5
- package/src/materials/Material.js +80 -57
- package/src/materials/MeshPhysicalMaterial.js +32 -0
- package/src/materials/nodes/Line2NodeMaterial.js +17 -8
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
- package/src/materials/nodes/NodeMaterial.js +19 -13
- package/src/materials/nodes/PointsNodeMaterial.js +2 -1
- package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
- package/src/math/Frustum.js +9 -0
- package/src/math/FrustumArray.js +1 -1
- package/src/math/MathUtils.js +5 -3
- package/src/math/Matrix4.js +2 -9
- package/src/math/Plane.js +30 -1
- package/src/math/Quaternion.js +0 -10
- package/src/math/Ray.js +95 -45
- package/src/math/Triangle.js +0 -2
- package/src/math/Vector3.js +2 -2
- package/src/math/Vector4.js +0 -4
- package/src/math/interpolants/BezierInterpolant.js +36 -23
- package/src/nodes/Nodes.js +2 -0
- package/src/nodes/TSL.js +11 -3
- package/src/nodes/accessors/Batch.js +85 -13
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/BuiltinNode.js +1 -1
- package/src/nodes/accessors/Instance.js +19 -18
- package/src/nodes/accessors/MaterialNode.js +9 -0
- package/src/nodes/accessors/ModelNode.js +85 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
- package/src/nodes/accessors/ReferenceElementNode.js +72 -0
- package/src/nodes/accessors/ReferenceNode.js +1 -70
- package/src/nodes/accessors/Skinning.js +124 -12
- package/src/nodes/accessors/StorageTextureNode.js +7 -3
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +51 -21
- package/src/nodes/accessors/TextureSizeNode.js +4 -2
- package/src/nodes/accessors/UniformArrayNode.js +30 -5
- package/src/nodes/code/CodeNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +12 -2
- package/src/nodes/core/ArrayNode.js +2 -2
- package/src/nodes/core/ContextNode.js +57 -4
- package/src/nodes/core/IndexNode.js +69 -4
- package/src/nodes/core/InspectorNode.js +2 -2
- package/src/nodes/core/MRTNode.js +44 -2
- package/src/nodes/core/Node.js +6 -3
- package/src/nodes/core/NodeBuilder.js +65 -50
- package/src/nodes/core/NodeFrame.js +11 -3
- package/src/nodes/core/NodeUtils.js +88 -0
- package/src/nodes/core/PropertyNode.js +8 -0
- package/src/nodes/core/StackNode.js +0 -1
- package/src/nodes/core/StructNode.js +4 -3
- package/src/nodes/core/UniformGroupNode.js +3 -2
- package/src/nodes/core/UniformNode.js +26 -12
- package/src/nodes/core/VarNode.js +0 -1
- package/src/nodes/display/BumpMapNode.js +2 -2
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/PassNode.js +76 -15
- package/src/nodes/display/ScreenNode.js +22 -65
- package/src/nodes/fog/Fog.js +4 -4
- package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
- package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
- package/src/nodes/functions/BSDF/LTC.js +1 -1
- package/src/nodes/functions/PhongLightingModel.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +83 -25
- package/src/nodes/functions/ToonLightingModel.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
- package/src/nodes/gpgpu/BarrierNode.js +13 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +20 -17
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
- package/src/nodes/lighting/EnvironmentNode.js +40 -4
- package/src/nodes/lighting/LightsNode.js +20 -4
- package/src/nodes/lighting/ShadowBaseNode.js +158 -1
- package/src/nodes/lighting/ShadowFilterNode.js +2 -106
- package/src/nodes/lighting/ShadowNode.js +22 -91
- package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
- package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
- package/src/nodes/materialx/MaterialXCore.js +37 -0
- package/src/nodes/materialx/MaterialXNodes.js +64 -72
- package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
- package/src/nodes/math/BitcountNode.js +24 -4
- package/src/nodes/math/MathNode.js +4 -4
- package/src/nodes/math/MathUtils.js +15 -4
- package/src/nodes/math/OperatorNode.js +2 -2
- package/src/nodes/math/PackFloatNode.js +29 -1
- package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
- package/src/nodes/math/UnpackFloatNode.js +30 -2
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +31 -74
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLCore.js +1 -31
- package/src/nodes/utils/EventNode.js +75 -0
- package/src/nodes/utils/LoopNode.js +54 -13
- package/src/nodes/utils/PostProcessingUtils.js +23 -2
- package/src/nodes/utils/RTTNode.js +97 -32
- package/src/nodes/utils/ReflectorNode.js +8 -4
- package/src/nodes/utils/RotateNode.js +85 -8
- package/src/nodes/utils/SpriteUtils.js +58 -23
- package/src/objects/BatchedMesh.js +6 -0
- package/src/objects/InstancedMesh.js +1 -1
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +12 -0
- package/src/objects/Mesh.js +12 -0
- package/src/objects/Points.js +12 -0
- package/src/objects/Sprite.js +12 -0
- package/src/renderers/WebGLRenderer.js +93 -27
- package/src/renderers/common/Animation.js +12 -2
- package/src/renderers/common/Backend.js +38 -10
- package/src/renderers/common/BindGroup.js +0 -1
- package/src/renderers/common/Bindings.js +50 -4
- package/src/renderers/common/BundleGroup.js +4 -0
- package/src/renderers/common/ClippingContext.js +11 -1
- package/src/renderers/common/Color4.js +9 -0
- package/src/renderers/common/Constants.js +0 -5
- package/src/renderers/common/DirectRenderPipeline.js +233 -0
- package/src/renderers/common/Geometries.js +24 -3
- package/src/renderers/common/Info.js +3 -3
- package/src/renderers/common/InspectorBase.js +37 -8
- package/src/renderers/common/Lighting.js +11 -4
- package/src/renderers/common/Pipelines.js +6 -4
- package/src/renderers/common/QuadMesh.js +16 -2
- package/src/renderers/common/RenderContext.js +8 -0
- package/src/renderers/common/RenderList.js +53 -19
- package/src/renderers/common/RenderLists.js +58 -11
- package/src/renderers/common/RenderObject.js +14 -0
- package/src/renderers/common/RenderObjects.js +14 -9
- package/src/renderers/common/RenderPipeline.js +52 -44
- package/src/renderers/common/Renderer.js +226 -55
- package/src/renderers/common/Storage3DTexture.js +16 -0
- package/src/renderers/common/Textures.js +3 -3
- package/src/renderers/common/XRManager.js +79 -72
- package/src/renderers/common/extras/PMREMGenerator.js +76 -144
- package/src/renderers/common/nodes/NodeManager.js +144 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
- package/src/renderers/shaders/DFGLUTData.js +2 -1
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/shaders/UniformsLib.js +16 -0
- package/src/renderers/webgl/WebGLAnimation.js +2 -2
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLLights.js +74 -4
- package/src/renderers/webgl/WebGLMaterials.js +6 -0
- package/src/renderers/webgl/WebGLOutput.js +36 -24
- package/src/renderers/webgl/WebGLProgram.js +3 -0
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLRenderLists.js +6 -10
- package/src/renderers/webgl/WebGLShadowMap.js +47 -44
- package/src/renderers/webgl/WebGLTextures.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
- package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
- package/src/renderers/webgpu/WebGPUBackend.js +513 -145
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
- package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
- package/src/renderers/webxr/WebXRManager.js +25 -2
- package/src/scenes/Scene.js +3 -3
- package/src/textures/CompressedArrayTexture.js +16 -0
- package/src/textures/Data3DTexture.js +16 -0
- package/src/textures/DataArrayTexture.js +16 -0
- package/src/textures/DepthTexture.js +3 -3
- package/src/textures/Texture.js +3 -3
- package/src/textures/{Source.js → TextureSource.js} +39 -8
- package/src/utils.js +6 -79
- package/build/three.core.min.js +0 -6
- package/build/three.module.min.js +0 -6
- package/build/three.tsl.min.js +0 -6
- package/build/three.webgpu.min.js +0 -6
- package/build/three.webgpu.nodes.min.js +0 -6
- package/examples/jsm/libs/ecsy.module.js +0 -1792
- package/examples/jsm/loaders/LottieLoader.js +0 -130
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Fn, int, uint, float, vec2, vec3, vec4, If } from '../tsl/TSLBase.js';
|
|
2
|
-
import { cos, sin, abs, max, exp2, log2, clamp, fract, mix, floor, normalize, cross, dot, sqrt } from '../math/MathNode.js';
|
|
2
|
+
import { cos, sin, abs, min, max, exp, exp2, log, log2, clamp, fract, mix, floor, normalize, cross, dot, sqrt } from '../math/MathNode.js';
|
|
3
3
|
import { mul } from '../math/OperatorNode.js';
|
|
4
4
|
import { select } from '../math/ConditionalNode.js';
|
|
5
|
-
import { Loop
|
|
5
|
+
import { Loop } from '../utils/LoopNode.js';
|
|
6
|
+
|
|
7
|
+
const GOLDEN_ANGLE = 2.399963229728653;
|
|
6
8
|
|
|
7
9
|
// These defines must match with PMREMGenerator
|
|
8
10
|
|
|
@@ -143,53 +145,6 @@ const roughnessToMip = /*@__PURE__*/ Fn( ( [ roughness ] ) => {
|
|
|
143
145
|
]
|
|
144
146
|
} );
|
|
145
147
|
|
|
146
|
-
// RH coordinate system; PMREM face-indexing convention
|
|
147
|
-
export const getDirection = /*@__PURE__*/ Fn( ( [ uv_immutable, face ] ) => {
|
|
148
|
-
|
|
149
|
-
const uv = uv_immutable.toVar();
|
|
150
|
-
uv.assign( mul( 2.0, uv ).sub( 1.0 ) );
|
|
151
|
-
const direction = vec3( uv, 1.0 ).toVar();
|
|
152
|
-
|
|
153
|
-
If( face.equal( 0.0 ), () => {
|
|
154
|
-
|
|
155
|
-
direction.assign( direction.zyx ); // ( 1, v, u ) pos x
|
|
156
|
-
|
|
157
|
-
} ).ElseIf( face.equal( 1.0 ), () => {
|
|
158
|
-
|
|
159
|
-
direction.assign( direction.xzy );
|
|
160
|
-
direction.xz.mulAssign( - 1.0 ); // ( -u, 1, -v ) pos y
|
|
161
|
-
|
|
162
|
-
} ).ElseIf( face.equal( 2.0 ), () => {
|
|
163
|
-
|
|
164
|
-
direction.x.mulAssign( - 1.0 ); // ( -u, v, 1 ) pos z
|
|
165
|
-
|
|
166
|
-
} ).ElseIf( face.equal( 3.0 ), () => {
|
|
167
|
-
|
|
168
|
-
direction.assign( direction.zyx );
|
|
169
|
-
direction.xz.mulAssign( - 1.0 ); // ( -1, v, -u ) neg x
|
|
170
|
-
|
|
171
|
-
} ).ElseIf( face.equal( 4.0 ), () => {
|
|
172
|
-
|
|
173
|
-
direction.assign( direction.xzy );
|
|
174
|
-
direction.xy.mulAssign( - 1.0 ); // ( -u, -1, v ) neg y
|
|
175
|
-
|
|
176
|
-
} ).ElseIf( face.equal( 5.0 ), () => {
|
|
177
|
-
|
|
178
|
-
direction.z.mulAssign( - 1.0 ); // ( u, v, -1 ) neg zS
|
|
179
|
-
|
|
180
|
-
} );
|
|
181
|
-
|
|
182
|
-
return direction;
|
|
183
|
-
|
|
184
|
-
} ).setLayout( {
|
|
185
|
-
name: 'getDirection',
|
|
186
|
-
type: 'vec3',
|
|
187
|
-
inputs: [
|
|
188
|
-
{ name: 'uv', type: 'vec2' },
|
|
189
|
-
{ name: 'face', type: 'float' }
|
|
190
|
-
]
|
|
191
|
-
} );
|
|
192
|
-
|
|
193
148
|
//
|
|
194
149
|
|
|
195
150
|
export const textureCubeUV = /*@__PURE__*/ Fn( ( [ envMap, sampleDir_immutable, roughness_immutable, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ] ) => {
|
|
@@ -241,49 +196,51 @@ const bilinearCubeUV = /*@__PURE__*/ Fn( ( [ envMap, direction_immutable, mipInt
|
|
|
241
196
|
|
|
242
197
|
} );
|
|
243
198
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
199
|
+
// Gaussian blur along a golden-angle spiral, importance-sampled by stratified
|
|
200
|
+
// inverse-CDF so every sample carries equal Gaussian weight.
|
|
201
|
+
export const sphericalGaussianBlur = /*@__PURE__*/ Fn( ( { SAMPLES, sigma, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {
|
|
247
202
|
|
|
248
|
-
|
|
249
|
-
const sampleDirection = outputDirection.mul( cosTheta )
|
|
250
|
-
.add( axis.cross( outputDirection ).mul( sin( theta ) ) )
|
|
251
|
-
.add( axis.mul( axis.dot( outputDirection ).mul( cosTheta.oneMinus() ) ) );
|
|
203
|
+
const color = vec3( 0.0 ).toVar();
|
|
252
204
|
|
|
253
|
-
|
|
205
|
+
If( sigma.equal( 0.0 ), () => {
|
|
254
206
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
export const blur = /*@__PURE__*/ Fn( ( { n, latitudinal, poleAxis, outputDirection, weights, samples, dTheta, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {
|
|
207
|
+
color.assign( bilinearCubeUV( envMap, outputDirection, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ) );
|
|
258
208
|
|
|
259
|
-
|
|
209
|
+
} ).Else( () => {
|
|
260
210
|
|
|
261
|
-
|
|
211
|
+
const up = select( abs( outputDirection.z ).lessThan( 0.999 ), vec3( 0.0, 0.0, 1.0 ), vec3( 1.0, 0.0, 0.0 ) );
|
|
212
|
+
const tangent = normalize( cross( up, outputDirection ) ).toVar();
|
|
213
|
+
const bitangent = cross( outputDirection, tangent ).toVar();
|
|
262
214
|
|
|
263
|
-
|
|
215
|
+
// Truncate the kernel at three standard deviations or at the antipode.
|
|
216
|
+
const thetaMax = min( sigma.mul( 3.0 ), Math.PI );
|
|
217
|
+
const truncation = exp( thetaMax.mul( thetaMax ).mul( - 0.5 ).div( sigma.mul( sigma ) ) ).oneMinus().toVar();
|
|
264
218
|
|
|
265
|
-
|
|
219
|
+
const accumWeight = float( 0.0 ).toVar();
|
|
266
220
|
|
|
267
|
-
|
|
221
|
+
Loop( { start: int( 0 ), end: SAMPLES }, ( { i } ) => {
|
|
268
222
|
|
|
269
|
-
|
|
270
|
-
|
|
223
|
+
// Stratified inverse-CDF sampling of the Gaussian, placed on a golden-angle spiral.
|
|
224
|
+
const stratum = float( i ).add( 0.5 ).div( float( SAMPLES ) );
|
|
225
|
+
const theta = sigma.mul( sqrt( log( stratum.mul( truncation ).oneMinus() ).mul( - 2.0 ) ) ).toVar();
|
|
226
|
+
const phi = float( i ).mul( GOLDEN_ANGLE ).toVar();
|
|
271
227
|
|
|
272
|
-
|
|
228
|
+
const offset = tangent.mul( cos( phi ) ).add( bitangent.mul( sin( phi ) ) );
|
|
229
|
+
const sampleDirection = outputDirection.mul( cos( theta ) ).add( offset.mul( sin( theta ) ) );
|
|
273
230
|
|
|
274
|
-
|
|
231
|
+
// Correct the planar sample density to solid angle.
|
|
232
|
+
const weight = sin( theta ).div( theta ).toVar();
|
|
275
233
|
|
|
276
|
-
|
|
234
|
+
color.addAssign( bilinearCubeUV( envMap, sampleDirection, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ).mul( weight ) );
|
|
235
|
+
accumWeight.addAssign( weight );
|
|
277
236
|
|
|
278
237
|
} );
|
|
279
238
|
|
|
280
|
-
|
|
281
|
-
gl_FragColor.addAssign( weights.element( i ).mul( getSample( { theta: theta.mul( - 1.0 ), axis, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) ) );
|
|
282
|
-
gl_FragColor.addAssign( weights.element( i ).mul( getSample( { theta, axis, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) ) );
|
|
239
|
+
color.divAssign( accumWeight );
|
|
283
240
|
|
|
284
241
|
} );
|
|
285
242
|
|
|
286
|
-
return vec4(
|
|
243
|
+
return vec4( color, 1.0 );
|
|
287
244
|
|
|
288
245
|
} );
|
|
289
246
|
|
|
@@ -10,7 +10,7 @@ import { uv } from '../accessors/UV.js';
|
|
|
10
10
|
* @param {Node<vec2>} coord - The uv to generate the circle.
|
|
11
11
|
* @return {Node<float>} The circle shape.
|
|
12
12
|
*/
|
|
13
|
-
export const shapeCircle = Fn( ( [ coord = uv() ], { renderer, material } ) => {
|
|
13
|
+
export const shapeCircle = /*@__PURE__*/ Fn( ( [ coord = uv() ], { renderer, material } ) => {
|
|
14
14
|
|
|
15
15
|
const len2 = lengthSq( coord.mul( 2 ).sub( 1 ) );
|
|
16
16
|
|
package/src/nodes/tsl/TSLCore.js
CHANGED
|
@@ -8,7 +8,7 @@ import FlipNode from '../utils/FlipNode.js';
|
|
|
8
8
|
import ConstNode from '../core/ConstNode.js';
|
|
9
9
|
import MemberNode from '../utils/MemberNode.js';
|
|
10
10
|
import StackTrace from '../core/StackTrace.js';
|
|
11
|
-
import { getValueFromType, getValueType } from '../core/NodeUtils.js';
|
|
11
|
+
import { getValueFromType, getValueType, isArrayAsParameter } from '../core/NodeUtils.js';
|
|
12
12
|
import { warn, error } from '../../utils.js';
|
|
13
13
|
|
|
14
14
|
let currentStack = null;
|
|
@@ -703,12 +703,6 @@ class ShaderCallNodeInternal extends Node {
|
|
|
703
703
|
|
|
704
704
|
}
|
|
705
705
|
|
|
706
|
-
function isArrayAsParameter( params ) {
|
|
707
|
-
|
|
708
|
-
return params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
|
|
709
|
-
|
|
710
|
-
}
|
|
711
|
-
|
|
712
706
|
function getLayoutParameters( params ) {
|
|
713
707
|
|
|
714
708
|
let output;
|
|
@@ -1269,27 +1263,3 @@ export const split = ( node, channels ) => new SplitNode( nodeObject( node ), ch
|
|
|
1269
1263
|
|
|
1270
1264
|
addMethodChaining( 'element', element );
|
|
1271
1265
|
addMethodChaining( 'convert', convert );
|
|
1272
|
-
|
|
1273
|
-
// deprecated
|
|
1274
|
-
|
|
1275
|
-
/**
|
|
1276
|
-
* @tsl
|
|
1277
|
-
* @function
|
|
1278
|
-
* @deprecated since r176. Use {@link Stack} instead.
|
|
1279
|
-
*
|
|
1280
|
-
* @param {Node} node - The node to add.
|
|
1281
|
-
* @returns {Function}
|
|
1282
|
-
*/
|
|
1283
|
-
export const append = ( node ) => { // @deprecated, r176
|
|
1284
|
-
|
|
1285
|
-
warn( 'TSL: append() has been renamed to Stack().', new StackTrace() );
|
|
1286
|
-
return Stack( node );
|
|
1287
|
-
|
|
1288
|
-
};
|
|
1289
|
-
|
|
1290
|
-
addMethodChaining( 'append', ( node ) => { // @deprecated, r176
|
|
1291
|
-
|
|
1292
|
-
warn( 'TSL: .append() has been renamed to .toStack().', new StackTrace() );
|
|
1293
|
-
return Stack( node );
|
|
1294
|
-
|
|
1295
|
-
} );
|
|
@@ -39,6 +39,10 @@ class EventNode extends Node {
|
|
|
39
39
|
|
|
40
40
|
this.updateType = NodeUpdateType.FRAME;
|
|
41
41
|
|
|
42
|
+
} else if ( eventType === EventNode.AFTER_OBJECT ) {
|
|
43
|
+
|
|
44
|
+
this.updateAfterType = NodeUpdateType.OBJECT;
|
|
45
|
+
|
|
42
46
|
} else if ( eventType === EventNode.BEFORE_OBJECT ) {
|
|
43
47
|
|
|
44
48
|
this.updateBeforeType = NodeUpdateType.OBJECT;
|
|
@@ -55,6 +59,36 @@ class EventNode extends Node {
|
|
|
55
59
|
|
|
56
60
|
}
|
|
57
61
|
|
|
62
|
+
setup( builder ) {
|
|
63
|
+
|
|
64
|
+
const { eventType, callback } = this;
|
|
65
|
+
|
|
66
|
+
if ( eventType === EventNode.BEFORE_RENDER_PIPELINE ) {
|
|
67
|
+
|
|
68
|
+
const callbacks = builder.context.onBeforePipelineCallbacks;
|
|
69
|
+
|
|
70
|
+
if ( callbacks ) {
|
|
71
|
+
|
|
72
|
+
callbacks.push( callback );
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
} else if ( eventType === EventNode.AFTER_RENDER_PIPELINE ) {
|
|
77
|
+
|
|
78
|
+
const callbacks = builder.context.onAfterPipelineCallbacks;
|
|
79
|
+
|
|
80
|
+
if ( callbacks ) {
|
|
81
|
+
|
|
82
|
+
callbacks.push( callback );
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return super.setup( builder );
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
58
92
|
update( frame ) {
|
|
59
93
|
|
|
60
94
|
this.callback( frame );
|
|
@@ -67,14 +101,23 @@ class EventNode extends Node {
|
|
|
67
101
|
|
|
68
102
|
}
|
|
69
103
|
|
|
104
|
+
updateAfter( frame ) {
|
|
105
|
+
|
|
106
|
+
this.callback( frame );
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
|
|
70
110
|
}
|
|
71
111
|
|
|
72
112
|
EventNode.OBJECT = 'object';
|
|
73
113
|
EventNode.MATERIAL = 'material';
|
|
74
114
|
EventNode.FRAME = 'frame';
|
|
115
|
+
EventNode.AFTER_OBJECT = 'afterObject';
|
|
75
116
|
EventNode.BEFORE_OBJECT = 'beforeObject';
|
|
76
117
|
EventNode.BEFORE_MATERIAL = 'beforeMaterial';
|
|
77
118
|
EventNode.BEFORE_FRAME = 'beforeFrame';
|
|
119
|
+
EventNode.BEFORE_RENDER_PIPELINE = 'beforeRenderPipeline';
|
|
120
|
+
EventNode.AFTER_RENDER_PIPELINE = 'afterRenderPipeline';
|
|
78
121
|
|
|
79
122
|
export default EventNode;
|
|
80
123
|
|
|
@@ -117,6 +160,16 @@ export const OnMaterialUpdate = ( callback ) => createEvent( EventNode.MATERIAL,
|
|
|
117
160
|
*/
|
|
118
161
|
export const OnFrameUpdate = ( callback ) => createEvent( EventNode.FRAME, callback );
|
|
119
162
|
|
|
163
|
+
/**
|
|
164
|
+
* Creates an event that triggers a function every time an object (Mesh|Sprite) has been rendered.
|
|
165
|
+
*
|
|
166
|
+
* The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
|
|
167
|
+
*
|
|
168
|
+
* @param {Function} callback - The callback function.
|
|
169
|
+
* @returns {EventNode}
|
|
170
|
+
*/
|
|
171
|
+
export const OnAfterObjectUpdate = ( callback ) => createEvent( EventNode.AFTER_OBJECT, callback );
|
|
172
|
+
|
|
120
173
|
/**
|
|
121
174
|
* Creates an event that triggers a function before an object (Mesh|Sprite) is updated.
|
|
122
175
|
*
|
|
@@ -146,3 +199,25 @@ export const OnBeforeMaterialUpdate = ( callback ) => createEvent( EventNode.BEF
|
|
|
146
199
|
* @returns {EventNode}
|
|
147
200
|
*/
|
|
148
201
|
export const OnBeforeFrameUpdate = ( callback ) => createEvent( EventNode.BEFORE_FRAME, callback );
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Creates an event that triggers a function before the render pipeline is rendered.
|
|
205
|
+
*
|
|
206
|
+
* The node must be part of a node chain that is used as the output of a `RenderPipeline`,
|
|
207
|
+
* otherwise the event is ignored.
|
|
208
|
+
*
|
|
209
|
+
* @param {Function} callback - The callback function.
|
|
210
|
+
* @returns {EventNode}
|
|
211
|
+
*/
|
|
212
|
+
export const OnBeforeRenderPipeline = ( callback ) => createEvent( EventNode.BEFORE_RENDER_PIPELINE, callback );
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Creates an event that triggers a function after the render pipeline is rendered.
|
|
216
|
+
*
|
|
217
|
+
* The node must be part of a node chain that is used as the output of a `RenderPipeline`,
|
|
218
|
+
* otherwise the event is ignored.
|
|
219
|
+
*
|
|
220
|
+
* @param {Function} callback - The callback function.
|
|
221
|
+
* @returns {EventNode}
|
|
222
|
+
*/
|
|
223
|
+
export const OnAfterRenderPipeline = ( callback ) => createEvent( EventNode.AFTER_RENDER_PIPELINE, callback );
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
2
|
import { expression } from '../code/ExpressionNode.js';
|
|
3
|
-
import { nodeArray, Fn } from '../tsl/TSLBase.js';
|
|
3
|
+
import { nodeArray, Fn, bool } from '../tsl/TSLBase.js';
|
|
4
4
|
import { error } from '../../utils.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -36,7 +36,7 @@ import { error } from '../../utils.js';
|
|
|
36
36
|
*
|
|
37
37
|
* } );
|
|
38
38
|
* ```
|
|
39
|
-
* The module also provides `Break()` and `Continue()` TSL
|
|
39
|
+
* The module also provides `Break()` and `Continue()` TSL expressions for loop control.
|
|
40
40
|
* @augments Node
|
|
41
41
|
*/
|
|
42
42
|
class LoopNode extends Node {
|
|
@@ -50,7 +50,7 @@ class LoopNode extends Node {
|
|
|
50
50
|
/**
|
|
51
51
|
* Constructs a new loop node.
|
|
52
52
|
*
|
|
53
|
-
* @param {Array<
|
|
53
|
+
* @param {Array<LoopNode~Params|loopBodyCallback>} params - Any number of loop parameters followed by the loop body.
|
|
54
54
|
*/
|
|
55
55
|
constructor( params = [] ) {
|
|
56
56
|
|
|
@@ -88,10 +88,11 @@ class LoopNode extends Node {
|
|
|
88
88
|
//
|
|
89
89
|
|
|
90
90
|
const inputs = {};
|
|
91
|
+
const params = this._getInternalParams();
|
|
91
92
|
|
|
92
|
-
for ( let i = 0, l =
|
|
93
|
+
for ( let i = 0, l = params.length - 1; i < l; i ++ ) {
|
|
93
94
|
|
|
94
|
-
const param =
|
|
95
|
+
const param = params[ i ];
|
|
95
96
|
|
|
96
97
|
const name = ( param.isNode !== true && param.name ) || this.getVarName( i );
|
|
97
98
|
const type = ( param.isNode !== true && param.type ) || 'int';
|
|
@@ -102,16 +103,16 @@ class LoopNode extends Node {
|
|
|
102
103
|
|
|
103
104
|
const stack = builder.addStack();
|
|
104
105
|
|
|
105
|
-
const fnCall =
|
|
106
|
+
const fnCall = params[ params.length - 1 ]( inputs );
|
|
106
107
|
|
|
107
108
|
properties.returnsNode = fnCall.context( { nodeLoop: fnCall } );
|
|
108
109
|
properties.stackNode = stack;
|
|
109
110
|
|
|
110
|
-
const baseParam =
|
|
111
|
+
const baseParam = params[ 0 ];
|
|
111
112
|
|
|
112
113
|
if ( baseParam.isNode !== true && typeof baseParam.update === 'function' ) {
|
|
113
114
|
|
|
114
|
-
const fnUpdateCall = Fn(
|
|
115
|
+
const fnUpdateCall = Fn( baseParam.update )( inputs );
|
|
115
116
|
|
|
116
117
|
properties.updateNode = fnUpdateCall.context( { nodeLoop: fnUpdateCall } );
|
|
117
118
|
|
|
@@ -123,6 +124,20 @@ class LoopNode extends Node {
|
|
|
123
124
|
|
|
124
125
|
}
|
|
125
126
|
|
|
127
|
+
_getInternalParams() {
|
|
128
|
+
|
|
129
|
+
const params = this.params;
|
|
130
|
+
|
|
131
|
+
if ( typeof params[ 0 ] === 'function' ) {
|
|
132
|
+
|
|
133
|
+
return [ bool( true ), params[ 0 ] ];
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return params;
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
126
141
|
setup( builder ) {
|
|
127
142
|
|
|
128
143
|
// setup properties
|
|
@@ -142,7 +157,7 @@ class LoopNode extends Node {
|
|
|
142
157
|
|
|
143
158
|
const properties = this.getProperties( builder );
|
|
144
159
|
|
|
145
|
-
const params = this.
|
|
160
|
+
const params = this._getInternalParams();
|
|
146
161
|
const stackNode = properties.stackNode;
|
|
147
162
|
|
|
148
163
|
for ( let i = 0, l = params.length - 1; i < l; i ++ ) {
|
|
@@ -306,7 +321,7 @@ class LoopNode extends Node {
|
|
|
306
321
|
|
|
307
322
|
builder.removeFlowTab().addFlowCode( '\n' + builder.tab + stackSnippet );
|
|
308
323
|
|
|
309
|
-
for ( let i = 0, l =
|
|
324
|
+
for ( let i = 0, l = params.length - 1; i < l; i ++ ) {
|
|
310
325
|
|
|
311
326
|
builder.addFlowCode( ( i === 0 ? '' : builder.tab ) + '}\n\n' ).removeFlowTab();
|
|
312
327
|
|
|
@@ -325,13 +340,13 @@ export default LoopNode;
|
|
|
325
340
|
*
|
|
326
341
|
* @tsl
|
|
327
342
|
* @function
|
|
328
|
-
* @param {...
|
|
343
|
+
* @param {...(LoopNode~Params|loopBodyCallback)} params - Any number of loop parameters followed by the loop body.
|
|
329
344
|
* @returns {LoopNode}
|
|
330
345
|
*/
|
|
331
346
|
export const Loop = ( ...params ) => new LoopNode( nodeArray( params, 'int' ) ).toStack();
|
|
332
347
|
|
|
333
348
|
/**
|
|
334
|
-
* TSL function for
|
|
349
|
+
* TSL function for inserting a `continue` expression into the shader.
|
|
335
350
|
*
|
|
336
351
|
* @tsl
|
|
337
352
|
* @function
|
|
@@ -340,10 +355,36 @@ export const Loop = ( ...params ) => new LoopNode( nodeArray( params, 'int' ) ).
|
|
|
340
355
|
export const Continue = () => expression( 'continue' ).toStack();
|
|
341
356
|
|
|
342
357
|
/**
|
|
343
|
-
* TSL function for
|
|
358
|
+
* TSL function for inserting a `break` expression into the shader.
|
|
344
359
|
*
|
|
345
360
|
* @tsl
|
|
346
361
|
* @function
|
|
347
362
|
* @returns {ExpressionNode}
|
|
348
363
|
*/
|
|
349
364
|
export const Break = () => expression( 'break' ).toStack();
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* The parameters of a loop. A number or int/uint node defines the loop's end value,
|
|
368
|
+
* a bool node defines a `while` loop and an object allows a more detailed configuration.
|
|
369
|
+
*
|
|
370
|
+
* @typedef {number|Node<int>|Node<uint>|Node<bool>|LoopNode~ObjectParams} LoopNode~Params
|
|
371
|
+
*/
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* A detailed loop configuration.
|
|
375
|
+
*
|
|
376
|
+
* @typedef {Object} LoopNode~ObjectParams
|
|
377
|
+
* @property {number|Node<int>|Node<uint>} [start=0] - The initial value of the loop variable.
|
|
378
|
+
* @property {number|Node<int>|Node<uint>} [end] - The value the loop variable is compared against. If omitted, the loop counts down from `start - 1` to `0`.
|
|
379
|
+
* @property {string} [name] - The name of the loop variable. Defaults to `i`, `j`, `k` and so on.
|
|
380
|
+
* @property {string} [type='int'] - The data type of the loop variable.
|
|
381
|
+
* @property {('<'|'<='|'>'|'>=')} [condition] - The comparison operator. The loop runs as long as the comparison is true. Inferred from `start` and `end` if not set.
|
|
382
|
+
* @property {string|number|Function|Node} [update] - Defines how the loop variable is updated after each iteration. Inferred from `condition` and `type` if not set.
|
|
383
|
+
*/
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* The loop body.
|
|
387
|
+
*
|
|
388
|
+
* @callback loopBodyCallback
|
|
389
|
+
* @param {Object<string, Node>} inputs - The loop variables of the current `Loop()` call, keyed by their name.
|
|
390
|
+
*/
|
|
@@ -54,6 +54,27 @@ export const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionM
|
|
|
54
54
|
|
|
55
55
|
} );
|
|
56
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Converts a clip-space position into a screen position expressed as uv coordinates.
|
|
59
|
+
*
|
|
60
|
+
* @tsl
|
|
61
|
+
* @function
|
|
62
|
+
* @param {Node<vec4>} clipPosition - The position in clip space.
|
|
63
|
+
* @return {Node<vec2>} The screen position expressed as uv coordinates.
|
|
64
|
+
*/
|
|
65
|
+
export const getScreenPositionFromClip = /*@__PURE__*/ Fn( ( [ clipPosition ] ) => {
|
|
66
|
+
|
|
67
|
+
const screen = clipPosition.xy.div( clipPosition.w ).mul( 0.5 ).add( 0.5 ).toVar();
|
|
68
|
+
return vec2( screen.x, screen.y.oneMinus() );
|
|
69
|
+
|
|
70
|
+
} ).setLayout( {
|
|
71
|
+
name: 'getScreenPositionFromClip',
|
|
72
|
+
type: 'vec2',
|
|
73
|
+
inputs: [
|
|
74
|
+
{ name: 'clipPosition', type: 'vec4' }
|
|
75
|
+
]
|
|
76
|
+
} );
|
|
77
|
+
|
|
57
78
|
/**
|
|
58
79
|
* Computes a normal vector based on depth data. Can be used as a fallback when no normal render
|
|
59
80
|
* target is available or if flat surface normals are required.
|
|
@@ -110,7 +131,7 @@ export const getNormalFromDepth = /*@__PURE__*/ Fn( ( [ uv, depthTexture, projec
|
|
|
110
131
|
* @param {Node<vec2>} position - The input position, usually screen coordinates.
|
|
111
132
|
* @return {Node<float>} The noise value.
|
|
112
133
|
*/
|
|
113
|
-
export const interleavedGradientNoise = Fn( ( [ position ] ) => {
|
|
134
|
+
export const interleavedGradientNoise = /*@__PURE__*/ Fn( ( [ position ] ) => {
|
|
114
135
|
|
|
115
136
|
return fract( float( 52.9829189 ).mul( fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) ) );
|
|
116
137
|
|
|
@@ -136,7 +157,7 @@ export const interleavedGradientNoise = Fn( ( [ position ] ) => {
|
|
|
136
157
|
* @param {Node<float>} phi - Rotation angle in radians (typically from IGN * 2π).
|
|
137
158
|
* @return {Node<vec2>} A 2D point on the unit disk.
|
|
138
159
|
*/
|
|
139
|
-
export const vogelDiskSample = Fn( ( [ sampleIndex, samplesCount, phi ] ) => {
|
|
160
|
+
export const vogelDiskSample = /*@__PURE__*/ Fn( ( [ sampleIndex, samplesCount, phi ] ) => {
|
|
140
161
|
|
|
141
162
|
const goldenAngle = float( 2.399963229728653 ); // 2π * (2 - φ) where φ is golden ratio
|
|
142
163
|
const r = sqrt( float( sampleIndex ).add( 0.5 ).div( float( samplesCount ) ) );
|