@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
|
@@ -260,7 +260,8 @@ class StorageTextureNode extends TextureNode {
|
|
|
260
260
|
|
|
261
261
|
const textureProperty = super.generate( builder, 'property' );
|
|
262
262
|
const uvSnippet = uvNode.build( builder, this.value.is3DTexture === true ? 'uvec3' : 'uvec2' );
|
|
263
|
-
const
|
|
263
|
+
const storeType = builder.getTypeFromLength( 4, builder.getComponentTypeFromTexture( this.value ) );
|
|
264
|
+
const storeSnippet = storeNode.build( builder, storeType );
|
|
264
265
|
const depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null;
|
|
265
266
|
|
|
266
267
|
const snippet = builder.generateTextureStore( this.value, textureProperty, uvSnippet, depthSnippet, storeSnippet );
|
|
@@ -297,11 +298,14 @@ export const storageTexture = /*@__PURE__*/ nodeProxy( StorageTextureNode ).setP
|
|
|
297
298
|
|
|
298
299
|
|
|
299
300
|
/**
|
|
300
|
-
*
|
|
301
|
+
* TSL function for storing a value in a storage texture.
|
|
302
|
+
*
|
|
303
|
+
* Unlike {@link storageTexture}, this function also accepts an existing storage
|
|
304
|
+
* texture node and is intended for performing the store operation itself.
|
|
301
305
|
*
|
|
302
306
|
* @tsl
|
|
303
307
|
* @function
|
|
304
|
-
* @param {StorageTexture|StorageTextureNode} value - The storage texture.
|
|
308
|
+
* @param {StorageTexture|StorageTextureNode} value - The storage texture or storage texture node.
|
|
305
309
|
* @param {Node<vec2|vec3>} uvNode - The uv node.
|
|
306
310
|
* @param {?Node} [storeNode=null] - The value node that should be stored in the texture.
|
|
307
311
|
* @returns {StorageTextureNode}
|
|
@@ -7,6 +7,7 @@ import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
|
|
|
7
7
|
import { nodeProxy, vec3, nodeObject, int, Fn } from '../tsl/TSLBase.js';
|
|
8
8
|
import { step } from '../math/MathNode.js';
|
|
9
9
|
import { NodeUpdateType } from '../core/constants.js';
|
|
10
|
+
import { getTextureType } from '../core/NodeUtils.js';
|
|
10
11
|
|
|
11
12
|
import { Compatibility, GreaterCompare, GreaterEqualCompare, IntType, LessCompare, LessEqualCompare, NearestFilter, UnsignedIntType } from '../../constants.js';
|
|
12
13
|
|
|
@@ -179,6 +180,15 @@ class TextureNode extends UniformNode {
|
|
|
179
180
|
*/
|
|
180
181
|
this._flipYUniform = null;
|
|
181
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Whether the node is used as a comparison sampler, e.g. via `samplerComparison()`.
|
|
185
|
+
*
|
|
186
|
+
* @private
|
|
187
|
+
* @type {boolean}
|
|
188
|
+
* @default false
|
|
189
|
+
*/
|
|
190
|
+
this._samplerComparison = false;
|
|
191
|
+
|
|
182
192
|
this.setUpdateMatrix( uvNode === null );
|
|
183
193
|
|
|
184
194
|
}
|
|
@@ -228,25 +238,13 @@ class TextureNode extends UniformNode {
|
|
|
228
238
|
*/
|
|
229
239
|
generateNodeType( /*builder*/ ) {
|
|
230
240
|
|
|
231
|
-
if ( this.
|
|
232
|
-
|
|
233
|
-
if ( this.gatherNode === null ) return 'float';
|
|
241
|
+
if ( this.gatherNode !== null ) {
|
|
234
242
|
|
|
235
243
|
return 'vec4';
|
|
236
244
|
|
|
237
245
|
}
|
|
238
246
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
return 'uvec4';
|
|
242
|
-
|
|
243
|
-
} else if ( this.value.type === IntType ) {
|
|
244
|
-
|
|
245
|
-
return 'ivec4';
|
|
246
|
-
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return 'vec4';
|
|
247
|
+
return getTextureType( this.value );
|
|
250
248
|
|
|
251
249
|
}
|
|
252
250
|
|
|
@@ -576,6 +574,18 @@ class TextureNode extends UniformNode {
|
|
|
576
574
|
|
|
577
575
|
if ( /^sampler/.test( output ) ) {
|
|
578
576
|
|
|
577
|
+
if ( output === 'samplerComparison' ) {
|
|
578
|
+
|
|
579
|
+
this._samplerComparison = true;
|
|
580
|
+
|
|
581
|
+
// texture nodes with the same texture share a single uniform so it's
|
|
582
|
+
// important to set the flag on the node the binding refers to as well
|
|
583
|
+
|
|
584
|
+
const sharedNode = this.getSharedNode( builder );
|
|
585
|
+
sharedNode._samplerComparison = true;
|
|
586
|
+
|
|
587
|
+
}
|
|
588
|
+
|
|
579
589
|
return textureProperty + '_sampler';
|
|
580
590
|
|
|
581
591
|
} else if ( builder.isReference( output ) ) {
|
|
@@ -586,7 +596,7 @@ class TextureNode extends UniformNode {
|
|
|
586
596
|
|
|
587
597
|
const nodeData = builder.getDataFromNode( this );
|
|
588
598
|
|
|
589
|
-
|
|
599
|
+
const nodeType = this.getNodeType( builder );
|
|
590
600
|
|
|
591
601
|
let propertyName = nodeData.propertyName;
|
|
592
602
|
|
|
@@ -605,12 +615,6 @@ class TextureNode extends UniformNode {
|
|
|
605
615
|
const offsetSnippet = offsetNode ? this.generateOffset( builder, offsetNode ) : null;
|
|
606
616
|
const flipYSnippet = this._flipYUniform ? this._flipYUniform.build( builder, 'bool' ) : null;
|
|
607
617
|
|
|
608
|
-
if ( gatherSnippet ) {
|
|
609
|
-
|
|
610
|
-
nodeType = 'vec4';
|
|
611
|
-
|
|
612
|
-
}
|
|
613
|
-
|
|
614
618
|
let finalDepthSnippet = depthSnippet;
|
|
615
619
|
|
|
616
620
|
if ( finalDepthSnippet === null && texture.isArrayTexture && this.isTexture3DNode !== true ) {
|
|
@@ -625,6 +629,20 @@ class TextureNode extends UniformNode {
|
|
|
625
629
|
|
|
626
630
|
let snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, biasSnippet, finalDepthSnippet, compareSnippet, gradSnippet, gatherSnippet, offsetSnippet, flipYSnippet );
|
|
627
631
|
|
|
632
|
+
let snippetType;
|
|
633
|
+
|
|
634
|
+
if ( texture.isDepthTexture === true && gatherSnippet === null ) {
|
|
635
|
+
|
|
636
|
+
snippetType = 'float';
|
|
637
|
+
|
|
638
|
+
} else {
|
|
639
|
+
|
|
640
|
+
snippetType = texture.type === UnsignedIntType ? 'uvec4' : ( texture.type === IntType ? 'ivec4' : 'vec4' );
|
|
641
|
+
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
snippet = builder.format( snippet, snippetType, nodeType );
|
|
645
|
+
|
|
628
646
|
if ( compareStepSnippet !== null ) {
|
|
629
647
|
|
|
630
648
|
const compareFunction = texture.compareFunction;
|
|
@@ -846,6 +864,18 @@ class TextureNode extends UniformNode {
|
|
|
846
864
|
|
|
847
865
|
}
|
|
848
866
|
|
|
867
|
+
/**
|
|
868
|
+
* Returns `true` if the texture is sampled with a depth comparison,
|
|
869
|
+
* meaning the node must be bound with a comparison sampler.
|
|
870
|
+
*
|
|
871
|
+
* @return {boolean} Whether comparison sampling is used or not.
|
|
872
|
+
*/
|
|
873
|
+
isSampleCompare() {
|
|
874
|
+
|
|
875
|
+
return this.compareNode !== null || this._samplerComparison === true;
|
|
876
|
+
|
|
877
|
+
}
|
|
878
|
+
|
|
849
879
|
/**
|
|
850
880
|
* Samples the texture by defining a depth node.
|
|
851
881
|
*
|
|
@@ -52,12 +52,14 @@ class TextureSizeNode extends Node {
|
|
|
52
52
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
generate( builder
|
|
55
|
+
generate( builder ) {
|
|
56
56
|
|
|
57
57
|
const textureProperty = this.textureNode.build( builder, 'property' );
|
|
58
58
|
const level = this.levelNode === null ? '0' : this.levelNode.build( builder, 'int' );
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
const snippet = builder.generateTextureSize( this.textureNode.value, textureProperty, level );
|
|
61
|
+
|
|
62
|
+
return builder.format( snippet, this.getNodeType( builder ) );
|
|
61
63
|
|
|
62
64
|
}
|
|
63
65
|
|
|
@@ -186,13 +186,38 @@ class UniformArrayNode extends BufferNode {
|
|
|
186
186
|
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
+
update( /*frame*/ ) {
|
|
190
|
+
|
|
191
|
+
this.updateBuffer();
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
|
|
189
195
|
/**
|
|
190
|
-
*
|
|
191
|
-
* in the array to the internal, correctly padded value buffer.
|
|
196
|
+
* Composes a user-defined update with the buffer transfer.
|
|
192
197
|
*
|
|
193
|
-
* @param {
|
|
198
|
+
* @param {Function} callback - The update function.
|
|
199
|
+
* @param {string} updateType - The update type.
|
|
200
|
+
* @return {UniformArrayNode} A reference to this node.
|
|
194
201
|
*/
|
|
195
|
-
|
|
202
|
+
onUpdate( callback, updateType ) {
|
|
203
|
+
|
|
204
|
+
callback = callback.bind( this );
|
|
205
|
+
|
|
206
|
+
return super.onUpdate( ( frame, self ) => {
|
|
207
|
+
|
|
208
|
+
callback( frame, self );
|
|
209
|
+
|
|
210
|
+
this.updateBuffer();
|
|
211
|
+
|
|
212
|
+
}, updateType );
|
|
213
|
+
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* The method makes sure to correctly transfer the data from the (complex) objects
|
|
218
|
+
* in the array to the internal, correctly padded value buffer.
|
|
219
|
+
*/
|
|
220
|
+
updateBuffer() {
|
|
196
221
|
|
|
197
222
|
const { array, value } = this;
|
|
198
223
|
|
|
@@ -315,7 +340,7 @@ class UniformArrayNode extends BufferNode {
|
|
|
315
340
|
this.bufferCount = length;
|
|
316
341
|
this.bufferType = paddedType;
|
|
317
342
|
|
|
318
|
-
this.
|
|
343
|
+
this.updateBuffer(); // initialize the buffer values
|
|
319
344
|
|
|
320
345
|
return super.setup( builder );
|
|
321
346
|
|
|
@@ -126,9 +126,19 @@ class FunctionNode extends CodeNode {
|
|
|
126
126
|
|
|
127
127
|
if ( name !== '' ) {
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
const nodeData = builder.getDataFromNode( this );
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
if ( nodeData.declarationRegistered !== true ) {
|
|
132
|
+
|
|
133
|
+
// use a custom property name
|
|
134
|
+
|
|
135
|
+
nodeCode.name = name;
|
|
136
|
+
|
|
137
|
+
builder.registerDeclaration( nodeCode );
|
|
138
|
+
|
|
139
|
+
nodeData.declarationRegistered = true;
|
|
140
|
+
|
|
141
|
+
}
|
|
132
142
|
|
|
133
143
|
}
|
|
134
144
|
|
|
@@ -154,7 +154,7 @@ export const array = ( ...params ) => {
|
|
|
154
154
|
|
|
155
155
|
if ( params.length === 1 ) {
|
|
156
156
|
|
|
157
|
-
const values = params[ 0 ];
|
|
157
|
+
const values = params[ 0 ].map( ( value ) => nodeObject( value ) );
|
|
158
158
|
|
|
159
159
|
node = new ArrayNode( null, values.length, values );
|
|
160
160
|
|
|
@@ -167,7 +167,7 @@ export const array = ( ...params ) => {
|
|
|
167
167
|
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
return
|
|
170
|
+
return node;
|
|
171
171
|
|
|
172
172
|
};
|
|
173
173
|
|
|
@@ -123,11 +123,17 @@ class ContextNode extends Node {
|
|
|
123
123
|
|
|
124
124
|
analyze( builder ) {
|
|
125
125
|
|
|
126
|
-
const
|
|
126
|
+
const usageCount = builder.increaseUsage( this );
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
if ( usageCount === 1 ) {
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
const previousContext = builder.addContext( this.value );
|
|
131
|
+
|
|
132
|
+
this.node.build( builder, this );
|
|
133
|
+
|
|
134
|
+
builder.setContext( previousContext );
|
|
135
|
+
|
|
136
|
+
}
|
|
131
137
|
|
|
132
138
|
}
|
|
133
139
|
|
|
@@ -135,10 +141,12 @@ class ContextNode extends Node {
|
|
|
135
141
|
|
|
136
142
|
const previousContext = builder.addContext( this.value );
|
|
137
143
|
|
|
138
|
-
this.node.build( builder );
|
|
144
|
+
const node = this.node.build( builder );
|
|
139
145
|
|
|
140
146
|
builder.setContext( previousContext );
|
|
141
147
|
|
|
148
|
+
return node;
|
|
149
|
+
|
|
142
150
|
}
|
|
143
151
|
|
|
144
152
|
generate( builder, output ) {
|
|
@@ -257,6 +265,50 @@ export function builtinAOContext( aoNode, node = null ) {
|
|
|
257
265
|
|
|
258
266
|
}
|
|
259
267
|
|
|
268
|
+
/**
|
|
269
|
+
* TSL function for defining a built-in global illumination context for a given node. The AO node
|
|
270
|
+
* modulates the indirect lighting of the materials, the GI node is added to their irradiance
|
|
271
|
+
* without being modulated by the AO since it already accounts for occlusion.
|
|
272
|
+
*
|
|
273
|
+
* @tsl
|
|
274
|
+
* @function
|
|
275
|
+
* @param {Node<float>} aoNode - The ambient occlusion value node to apply.
|
|
276
|
+
* @param {Node<vec3>} giNode - The indirect diffuse irradiance node to add.
|
|
277
|
+
* @param {Node} [node=null] - The node whose context should be modified.
|
|
278
|
+
* @returns {ContextNode}
|
|
279
|
+
*/
|
|
280
|
+
export function builtinGIContext( aoNode, giNode, node = null ) {
|
|
281
|
+
|
|
282
|
+
// the lighting models multiply the whole indirect diffuse term by the AO, which would occlude
|
|
283
|
+
// the GI a second time. Dividing the GI by the AO cancels that out so only the environment
|
|
284
|
+
// lighting is modulated.
|
|
285
|
+
|
|
286
|
+
const ao = aoNode.max( 1e-3 );
|
|
287
|
+
|
|
288
|
+
return context( node, {
|
|
289
|
+
|
|
290
|
+
getAO: ( inputNode, { material } ) => {
|
|
291
|
+
|
|
292
|
+
if ( material.transparent === true ) return inputNode;
|
|
293
|
+
|
|
294
|
+
return inputNode !== null ? inputNode.mul( ao ) : ao;
|
|
295
|
+
|
|
296
|
+
},
|
|
297
|
+
|
|
298
|
+
getGI: ( inputNode, { material } ) => {
|
|
299
|
+
|
|
300
|
+
if ( material.transparent === true ) return inputNode;
|
|
301
|
+
|
|
302
|
+
const gi = giNode.div( ao );
|
|
303
|
+
|
|
304
|
+
return inputNode !== null ? inputNode.add( gi ) : gi;
|
|
305
|
+
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
} );
|
|
309
|
+
|
|
310
|
+
}
|
|
311
|
+
|
|
260
312
|
/**
|
|
261
313
|
* TSL function for defining a label context value for a given node.
|
|
262
314
|
*
|
|
@@ -281,3 +333,4 @@ addMethodChaining( 'uniformFlow', uniformFlow );
|
|
|
281
333
|
addMethodChaining( 'setName', setName );
|
|
282
334
|
addMethodChaining( 'builtinShadowContext', ( node, shadowNode, light ) => builtinShadowContext( shadowNode, light, node ) );
|
|
283
335
|
addMethodChaining( 'builtinAOContext', ( node, aoValue ) => builtinAOContext( aoValue, node ) );
|
|
336
|
+
addMethodChaining( 'builtinGIContext', ( node, aoValue, giValue ) => builtinGIContext( aoValue, giValue, node ) );
|
|
@@ -9,7 +9,7 @@ import { varying } from './VaryingNode.js';
|
|
|
9
9
|
* - `vertexIndex`: The index of a vertex within a mesh.
|
|
10
10
|
* - `instanceIndex`: The index of either a mesh instance or an invocation of a compute shader.
|
|
11
11
|
* - `drawIndex`: The index of a draw call.
|
|
12
|
-
* - `invocationLocalIndex`: The index of a compute invocation within the scope of a workgroup
|
|
12
|
+
* - `invocationLocalIndex`: The index of a compute invocation within the scope of a workgroup.
|
|
13
13
|
* - `invocationSubgroupIndex`: The index of a compute invocation within the scope of a subgroup.
|
|
14
14
|
* - `subgroupIndex`: The index of a compute invocation's subgroup within its workgroup.
|
|
15
15
|
*
|
|
@@ -26,7 +26,7 @@ class IndexNode extends Node {
|
|
|
26
26
|
/**
|
|
27
27
|
* Constructs a new index node.
|
|
28
28
|
*
|
|
29
|
-
* @param {('vertex'|'instance'|'subgroup'|'invocationLocal'|'
|
|
29
|
+
* @param {('vertex'|'instance'|'subgroup'|'invocationLocal'|'invocationSubgroup'|'draw')} scope - The scope of the index node.
|
|
30
30
|
*/
|
|
31
31
|
constructor( scope ) {
|
|
32
32
|
|
|
@@ -125,7 +125,29 @@ export default IndexNode;
|
|
|
125
125
|
export const vertexIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.VERTEX );
|
|
126
126
|
|
|
127
127
|
/**
|
|
128
|
-
* TSL object that represents
|
|
128
|
+
* TSL object that contextually represents specific index data depending on the shader stage.
|
|
129
|
+
*
|
|
130
|
+
* Within the vertex and fragment stages, `instanceIndex` will represent the index of the current mesh instance being evaluated by the shader.
|
|
131
|
+
* In these stages, use `instanceIndex` to modify a mesh based on its instance or to select per-instance data.
|
|
132
|
+
*
|
|
133
|
+
* ```js
|
|
134
|
+
* // instanceIndex will equal the current mesh's instance index between 0-500
|
|
135
|
+
* const material = new THREE.BasicNodeMaterial();
|
|
136
|
+
* material.positionNode = vec3( instanceIndex.mod( 10 ), instanceIndex.div( 10 ), 0 );
|
|
137
|
+
* const mesh = new THREE.InstancedMesh( geometry, material, 500 );
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* Within the compute stage, `instanceIndex` will represent the global index of a compute invocation within the 3-dimensional compute workgroup load.
|
|
141
|
+
* In this stage, use `instanceIndex` to modify or select data at a given index within a buffer, or derive values from the index itself.
|
|
142
|
+
*
|
|
143
|
+
* ```js
|
|
144
|
+
* // instanceIndex will equal value between 0 - 255
|
|
145
|
+
* const computeFn = Fn() => {
|
|
146
|
+
*
|
|
147
|
+
* storageBuffer.element( instanceIndex ).assign( instanceIndex );
|
|
148
|
+
*
|
|
149
|
+
* } )().compute( 255 )
|
|
150
|
+
* ```
|
|
129
151
|
*
|
|
130
152
|
* @tsl
|
|
131
153
|
* @type {IndexNode}
|
|
@@ -134,6 +156,21 @@ export const instanceIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.I
|
|
|
134
156
|
|
|
135
157
|
/**
|
|
136
158
|
* TSL object that represents the index of the subgroup the current compute invocation belongs to.
|
|
159
|
+
* Subgroup indices are local to the workgroups to which they belong.
|
|
160
|
+
*
|
|
161
|
+
* ```js
|
|
162
|
+
* // Execute 12 compute threads with a workgroup size of 9. Example assumes a subgroup size of 3.
|
|
163
|
+
* const computeFn = Fn( () => {
|
|
164
|
+
*
|
|
165
|
+
* storageBufferOne.element( instanceIndex ).assign( subgroupIndex );
|
|
166
|
+
* storageBufferTwo.element( instanceIndex ).assign( workgroupId.x );
|
|
167
|
+
*
|
|
168
|
+
* } )().compute( 12, [ 9 ] );
|
|
169
|
+
*
|
|
170
|
+
* // instanceIndex = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
|
|
171
|
+
* // Buffer One ( Subgroup Index ) = [ 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0 ];
|
|
172
|
+
* // Buffer Two ( Workgroup ID ) = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ];
|
|
173
|
+
* ```
|
|
137
174
|
*
|
|
138
175
|
* @tsl
|
|
139
176
|
* @type {IndexNode}
|
|
@@ -143,13 +180,41 @@ export const subgroupIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.S
|
|
|
143
180
|
/**
|
|
144
181
|
* TSL object that represents the index of a compute invocation within the scope of a subgroup.
|
|
145
182
|
*
|
|
183
|
+
* ```js
|
|
184
|
+
* // Execute 12 compute threads with a workgroup size of 12. Example assumes a subgroup size of 3.
|
|
185
|
+
* const computeFn = Fn( () => {
|
|
186
|
+
*
|
|
187
|
+
* storageBufferOne.element( instanceIndex ).assign( invocationSubgroupIndex );
|
|
188
|
+
* storageBufferTwo.element( instanceIndex ).assign( subgroupIndex );
|
|
189
|
+
*
|
|
190
|
+
* } )().compute( 12, [ 12 ] );
|
|
191
|
+
*
|
|
192
|
+
* // instanceIndex = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
|
|
193
|
+
* // Buffer One ( Invocation Subgroup Index ) = [ 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2 ];
|
|
194
|
+
* // Buffer Two ( Subgroup Index ) = [ 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3 ];
|
|
195
|
+
* ```
|
|
196
|
+
*
|
|
146
197
|
* @tsl
|
|
147
198
|
* @type {IndexNode}
|
|
148
199
|
*/
|
|
149
200
|
export const invocationSubgroupIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.INVOCATION_SUBGROUP );
|
|
150
201
|
|
|
151
202
|
/**
|
|
152
|
-
* TSL object that represents the index of a compute invocation within the scope of a workgroup
|
|
203
|
+
* TSL object that represents the index of a compute invocation within the scope of a workgroup.
|
|
204
|
+
*
|
|
205
|
+
* ```js
|
|
206
|
+
* // Execute 12 compute threads with a workgroup size of 4.
|
|
207
|
+
* const computeFn = Fn( () => {
|
|
208
|
+
*
|
|
209
|
+
* storageBufferOne.element( instanceIndex ).assign( invocationLocalIndex );
|
|
210
|
+
* storageBufferTwo.element( instanceIndex ).assign( workgroupId.x );
|
|
211
|
+
*
|
|
212
|
+
* } )().compute( 12, [ 4 ] );
|
|
213
|
+
*
|
|
214
|
+
* // instanceIndex = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
|
|
215
|
+
* // Buffer One ( Invocation Local Index ) = [ 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 ];
|
|
216
|
+
* // Buffer Two ( Workgroup ID ) = [ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2 ];
|
|
217
|
+
* ```
|
|
153
218
|
*
|
|
154
219
|
* @tsl
|
|
155
220
|
* @type {IndexNode}
|
|
@@ -117,7 +117,7 @@ export default InspectorNode;
|
|
|
117
117
|
* @param {Function|null} [callback=null] - Optional callback to modify the node during setup.
|
|
118
118
|
* @returns {Node} The inspector node.
|
|
119
119
|
*/
|
|
120
|
-
export function
|
|
120
|
+
export function inspect( node, name = '', callback = null ) {
|
|
121
121
|
|
|
122
122
|
node = nodeObject( node );
|
|
123
123
|
|
|
@@ -125,4 +125,4 @@ export function inspector( node, name = '', callback = null ) {
|
|
|
125
125
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
addMethodChaining( 'toInspector',
|
|
128
|
+
addMethodChaining( 'toInspector', inspect );
|
|
@@ -2,6 +2,7 @@ import OutputStructNode from './OutputStructNode.js';
|
|
|
2
2
|
import { nodeProxy } from '../tsl/TSLBase.js';
|
|
3
3
|
import { MaterialBlending, NoBlending } from '../../constants.js';
|
|
4
4
|
import BlendMode from '../../renderers/common/BlendMode.js';
|
|
5
|
+
import Color4 from '../../renderers/common/Color4.js';
|
|
5
6
|
|
|
6
7
|
// Predefined blend modes for MRT nodes.
|
|
7
8
|
const _noBlending = /**@__PURE__*/ new BlendMode( NoBlending );
|
|
@@ -78,6 +79,13 @@ class MRTNode extends OutputStructNode {
|
|
|
78
79
|
output: _materialBlending
|
|
79
80
|
};
|
|
80
81
|
|
|
82
|
+
/**
|
|
83
|
+
* A dictionary storing the clear colors for each output.
|
|
84
|
+
*
|
|
85
|
+
* @type {Object<string, Color4>}
|
|
86
|
+
*/
|
|
87
|
+
this.clearColors = {};
|
|
88
|
+
|
|
81
89
|
/**
|
|
82
90
|
* This flag can be used for type testing.
|
|
83
91
|
*
|
|
@@ -116,6 +124,38 @@ class MRTNode extends OutputStructNode {
|
|
|
116
124
|
|
|
117
125
|
}
|
|
118
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Sets the clear color for the given output name.
|
|
129
|
+
*
|
|
130
|
+
* @param {string} name - The name of the output.
|
|
131
|
+
* @param {number|string|Color} color - The clear color.
|
|
132
|
+
* @param {number} [alpha=1] - The clear alpha.
|
|
133
|
+
* @return {MRTNode} The current MRT node.
|
|
134
|
+
*/
|
|
135
|
+
setClearColor( name, color, alpha = 1 ) {
|
|
136
|
+
|
|
137
|
+
const clearColor = this.clearColors[ name ] || ( this.clearColors[ name ] = new Color4() );
|
|
138
|
+
|
|
139
|
+
clearColor.set( color );
|
|
140
|
+
clearColor.a = alpha;
|
|
141
|
+
|
|
142
|
+
return this;
|
|
143
|
+
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Returns the clear color for the given output name.
|
|
148
|
+
*
|
|
149
|
+
* @param {string} name - The name of the output.
|
|
150
|
+
* @return {?Color4} The clear color. Returns `null` if no clear color is defined
|
|
151
|
+
* which means the renderer's default clear policy is applied.
|
|
152
|
+
*/
|
|
153
|
+
getClearColor( name ) {
|
|
154
|
+
|
|
155
|
+
return this.clearColors[ name ] || null;
|
|
156
|
+
|
|
157
|
+
}
|
|
158
|
+
|
|
119
159
|
/**
|
|
120
160
|
* Returns `true` if the MRT node has an output with the given name.
|
|
121
161
|
*
|
|
@@ -149,10 +189,12 @@ class MRTNode extends OutputStructNode {
|
|
|
149
189
|
merge( mrtNode ) {
|
|
150
190
|
|
|
151
191
|
const outputs = { ...this.outputNodes, ...mrtNode.outputNodes };
|
|
152
|
-
const
|
|
192
|
+
const blendModes = { ...this.blendModes, ...mrtNode.blendModes };
|
|
193
|
+
const clearColors = { ...this.clearColors, ...mrtNode.clearColors };
|
|
153
194
|
|
|
154
195
|
const mrtTarget = mrt( outputs );
|
|
155
|
-
mrtTarget.
|
|
196
|
+
mrtTarget.blendModes = blendModes;
|
|
197
|
+
mrtTarget.clearColors = clearColors;
|
|
156
198
|
|
|
157
199
|
return mrtTarget;
|
|
158
200
|
|
package/src/nodes/core/Node.js
CHANGED
|
@@ -501,9 +501,10 @@ class Node extends EventDispatcher {
|
|
|
501
501
|
/**
|
|
502
502
|
* Returns the update type of {@link Node#update}.
|
|
503
503
|
*
|
|
504
|
+
* @param {NodeFrame} [frame] - The current node frame.
|
|
504
505
|
* @return {NodeUpdateType} The update type.
|
|
505
506
|
*/
|
|
506
|
-
getUpdateType() {
|
|
507
|
+
getUpdateType( /*frame*/ ) {
|
|
507
508
|
|
|
508
509
|
return this.updateType;
|
|
509
510
|
|
|
@@ -512,9 +513,10 @@ class Node extends EventDispatcher {
|
|
|
512
513
|
/**
|
|
513
514
|
* Returns the update type of {@link Node#updateBefore}.
|
|
514
515
|
*
|
|
516
|
+
* @param {NodeFrame} [frame] - The current node frame.
|
|
515
517
|
* @return {NodeUpdateType} The update type.
|
|
516
518
|
*/
|
|
517
|
-
getUpdateBeforeType() {
|
|
519
|
+
getUpdateBeforeType( /*frame*/ ) {
|
|
518
520
|
|
|
519
521
|
return this.updateBeforeType;
|
|
520
522
|
|
|
@@ -523,9 +525,10 @@ class Node extends EventDispatcher {
|
|
|
523
525
|
/**
|
|
524
526
|
* Returns the update type of {@link Node#updateAfter}.
|
|
525
527
|
*
|
|
528
|
+
* @param {NodeFrame} [frame] - The current node frame.
|
|
526
529
|
* @return {NodeUpdateType} The update type.
|
|
527
530
|
*/
|
|
528
|
-
getUpdateAfterType() {
|
|
531
|
+
getUpdateAfterType( /*frame*/ ) {
|
|
529
532
|
|
|
530
533
|
return this.updateAfterType;
|
|
531
534
|
|