@plastic-software/three 0.179.0 → 0.181.1
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 +1108 -591
- package/build/three.core.js +616 -345
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +488 -250
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +37 -6
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +6576 -2152
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +6575 -2151
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +1 -1
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +8 -8
- package/examples/jsm/controls/DragControls.js +7 -57
- package/examples/jsm/controls/FirstPersonControls.js +3 -3
- package/examples/jsm/controls/FlyControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +1 -1
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +33 -25
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +9 -2
- package/examples/jsm/geometries/DecalGeometry.js +2 -2
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +3 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/ViewHelper.js +43 -5
- package/examples/jsm/inspector/Inspector.js +427 -0
- package/examples/jsm/inspector/RendererInspector.js +415 -0
- package/examples/jsm/inspector/tabs/Console.js +204 -0
- package/examples/jsm/inspector/tabs/Parameters.js +332 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Viewer.js +166 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +170 -0
- package/examples/jsm/inspector/ui/Style.js +654 -0
- package/examples/jsm/inspector/ui/Tab.js +46 -0
- package/examples/jsm/inspector/ui/Values.js +423 -0
- package/examples/jsm/inspector/ui/utils.js +56 -0
- package/examples/jsm/interactive/HTMLMesh.js +6 -10
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +3 -3
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +5 -5
- package/examples/jsm/loaders/FBXLoader.js +2 -2
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GLTFLoader.js +14 -8
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +486 -0
- package/examples/jsm/loaders/KTX2Loader.js +136 -49
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +2 -2
- package/examples/jsm/loaders/MaterialXLoader.js +22 -5
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TTFLoader.js +4 -4
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +3 -3
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/SkyMesh.js +1 -1
- package/examples/jsm/objects/Water.js +3 -3
- package/examples/jsm/objects/WaterMesh.js +6 -6
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
- package/examples/jsm/renderers/SVGRenderer.js +1 -1
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +2 -2
- package/examples/jsm/shaders/GodRaysShader.js +1 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
- package/examples/jsm/shaders/SSRShader.js +1 -1
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
- package/examples/jsm/transpiler/TSLEncoder.js +9 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
- package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
- package/examples/jsm/tsl/display/BloomNode.js +7 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
- package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- package/examples/jsm/tsl/display/GTAONode.js +53 -5
- package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
- package/examples/jsm/tsl/display/OutlineNode.js +13 -2
- package/examples/jsm/tsl/display/SSGINode.js +654 -0
- package/examples/jsm/tsl/display/SSRNode.js +182 -65
- package/examples/jsm/tsl/display/SSSNode.js +488 -0
- package/examples/jsm/tsl/display/TRAANode.js +124 -7
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/hashBlur.js +16 -18
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
- package/package.json +5 -10
- package/src/Three.Core.js +4 -2
- package/src/Three.TSL.js +36 -5
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +2 -0
- package/src/animation/AnimationClip.js +20 -4
- package/src/animation/AnimationMixer.js +3 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/KeyframeTrack.js +7 -6
- package/src/animation/PropertyBinding.js +12 -11
- package/src/audio/Audio.js +10 -9
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +11 -3
- package/src/core/BufferGeometry.js +10 -10
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +3 -2
- package/src/core/Raycaster.js +2 -1
- package/src/core/RenderTarget.js +10 -1
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +268 -55
- package/src/extras/TextureUtils.js +2 -1
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/lib/earcut.js +8 -8
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +8 -6
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +1 -0
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +1 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +2 -1
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +2 -2
- package/src/loaders/DataTextureLoader.js +1 -1
- package/src/loaders/FileLoader.js +3 -2
- package/src/loaders/ImageBitmapLoader.js +5 -4
- package/src/loaders/ImageLoader.js +1 -1
- package/src/loaders/Loader.js +3 -3
- package/src/loaders/LoadingManager.js +25 -3
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +13 -13
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +3 -2
- package/src/materials/Material.js +16 -3
- package/src/materials/MeshBasicMaterial.js +1 -0
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +2 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +2 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +1 -0
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +2 -2
- package/src/materials/nodes/Line2NodeMaterial.js +2 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/NodeMaterial.js +62 -22
- package/src/materials/nodes/PointsNodeMaterial.js +81 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +9 -3
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/MathUtils.js +13 -11
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +2 -2
- package/src/math/Matrix4.js +7 -7
- package/src/math/Plane.js +1 -1
- package/src/math/Quaternion.js +68 -66
- package/src/math/Spherical.js +1 -1
- package/src/nodes/Nodes.js +4 -1
- package/src/nodes/TSL.js +4 -1
- package/src/nodes/accessors/BufferNode.js +1 -1
- package/src/nodes/accessors/Camera.js +133 -7
- package/src/nodes/accessors/ClippingNode.js +6 -5
- package/src/nodes/accessors/CubeTextureNode.js +5 -4
- package/src/nodes/accessors/InstanceNode.js +25 -5
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/Normal.js +5 -4
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +18 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +3 -2
- package/src/nodes/accessors/SceneNode.js +2 -1
- package/src/nodes/accessors/StorageBufferNode.js +2 -1
- package/src/nodes/accessors/StorageTextureNode.js +22 -0
- package/src/nodes/accessors/Texture3DNode.js +14 -1
- package/src/nodes/accessors/TextureNode.js +130 -44
- package/src/nodes/code/FunctionCallNode.js +24 -4
- package/src/nodes/code/FunctionNode.js +23 -0
- package/src/nodes/core/ArrayNode.js +1 -0
- package/src/nodes/core/AssignNode.js +4 -3
- package/src/nodes/core/AttributeNode.js +2 -1
- package/src/nodes/core/ContextNode.js +29 -10
- package/src/nodes/core/IndexNode.js +2 -2
- package/src/nodes/core/InputNode.js +2 -1
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
- package/src/nodes/core/Node.js +152 -31
- package/src/nodes/core/NodeBuilder.js +183 -35
- package/src/nodes/core/NodeFrame.js +21 -21
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +17 -91
- package/src/nodes/core/ParameterNode.js +31 -0
- package/src/nodes/core/PropertyNode.js +7 -0
- package/src/nodes/core/StackNode.js +43 -16
- package/src/nodes/core/StructNode.js +5 -5
- package/src/nodes/core/StructTypeNode.js +1 -0
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformNode.js +18 -10
- package/src/nodes/core/VarNode.js +70 -33
- package/src/nodes/core/VaryingNode.js +3 -2
- package/src/nodes/display/BlendModes.js +5 -4
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/NormalMapNode.js +2 -1
- package/src/nodes/display/PassNode.js +52 -11
- package/src/nodes/display/RenderOutputNode.js +28 -2
- package/src/nodes/display/ScreenNode.js +44 -14
- package/src/nodes/display/ToneMappingNode.js +31 -4
- package/src/nodes/display/ToonOutlinePassNode.js +8 -0
- package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +42 -12
- package/src/nodes/fog/Fog.js +3 -2
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhysicalLightingModel.js +3 -2
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/geometry/RangeNode.js +40 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
- package/src/nodes/gpgpu/ComputeNode.js +17 -5
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
- package/src/nodes/lighting/EnvironmentNode.js +6 -6
- package/src/nodes/lighting/LightsNode.js +3 -4
- package/src/nodes/lighting/PointShadowNode.js +6 -0
- package/src/nodes/lighting/ShadowFilterNode.js +2 -0
- package/src/nodes/lighting/ShadowNode.js +75 -8
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/ConditionalNode.js +24 -7
- package/src/nodes/math/MathNode.js +25 -19
- package/src/nodes/math/OperatorNode.js +7 -5
- package/src/nodes/pmrem/PMREMUtils.js +117 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +5 -2
- package/src/nodes/tsl/TSLCore.js +460 -159
- package/src/nodes/utils/DebugNode.js +2 -1
- package/src/nodes/utils/EventNode.js +36 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +6 -3
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +59 -7
- package/src/nodes/utils/PostProcessingUtils.js +28 -1
- package/src/nodes/utils/RTTNode.js +13 -3
- package/src/nodes/utils/ReflectorNode.js +58 -7
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SplitNode.js +11 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/objects/BatchedMesh.js +2 -2
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +2 -1
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Skeleton.js +3 -2
- package/src/objects/SkinnedMesh.js +3 -1
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +48 -41
- package/src/renderers/common/Animation.js +13 -1
- package/src/renderers/common/Attributes.js +1 -1
- package/src/renderers/common/Backend.js +108 -27
- package/src/renderers/common/Background.js +2 -1
- package/src/renderers/common/Bindings.js +58 -2
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +1 -1
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +26 -0
- package/src/renderers/common/Info.js +4 -2
- package/src/renderers/common/InspectorBase.js +146 -0
- package/src/renderers/common/Pipelines.js +1 -1
- package/src/renderers/common/PostProcessing.js +6 -25
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/RenderContext.js +2 -2
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderObject.js +16 -2
- package/src/renderers/common/RenderObjects.js +1 -1
- package/src/renderers/common/Renderer.js +473 -245
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +9 -1
- package/src/renderers/common/Sampler.js +50 -12
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +121 -45
- package/src/renderers/common/TimestampQueryPool.js +65 -3
- package/src/renderers/common/UniformsGroup.js +2 -1
- package/src/renderers/common/XRManager.js +42 -22
- package/src/renderers/common/extras/PMREMGenerator.js +160 -65
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/Nodes.js +38 -16
- package/src/renderers/shaders/DFGLUTData.js +64 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +25 -4
- package/src/renderers/webgl/WebGLCapabilities.js +2 -1
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLProgram.js +15 -14
- package/src/renderers/webgl/WebGLPrograms.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +3 -2
- package/src/renderers/webgl/WebGLState.js +15 -14
- package/src/renderers/webgl/WebGLTextures.js +19 -14
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl/WebGLUtils.js +3 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
- package/src/renderers/webgpu/WebGPUBackend.js +153 -123
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +3 -2
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
- package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
- package/src/renderers/webxr/WebXRManager.js +42 -26
- package/src/textures/ExternalTexture.js +15 -4
- package/src/textures/Source.js +3 -2
- package/src/textures/Texture.js +3 -2
- package/src/textures/VideoTexture.js +2 -3
- package/src/utils.js +67 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
package/src/nodes/tsl/TSLCore.js
CHANGED
|
@@ -8,16 +8,19 @@ 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 { getValueFromType, getValueType } from '../core/NodeUtils.js';
|
|
11
|
+
import { warn, error } from '../../utils.js';
|
|
11
12
|
|
|
12
13
|
let currentStack = null;
|
|
13
14
|
|
|
14
15
|
const NodeElements = new Map();
|
|
15
16
|
|
|
17
|
+
// Extend Node Class for TSL using prototype
|
|
18
|
+
|
|
16
19
|
export function addMethodChaining( name, nodeElement ) {
|
|
17
20
|
|
|
18
21
|
if ( NodeElements.has( name ) ) {
|
|
19
22
|
|
|
20
|
-
|
|
23
|
+
warn( `TSL: Redefinition of method chaining '${ name }'.` );
|
|
21
24
|
return;
|
|
22
25
|
|
|
23
26
|
}
|
|
@@ -26,152 +29,274 @@ export function addMethodChaining( name, nodeElement ) {
|
|
|
26
29
|
|
|
27
30
|
NodeElements.set( name, nodeElement );
|
|
28
31
|
|
|
32
|
+
if ( name !== 'assign' ) {
|
|
33
|
+
|
|
34
|
+
// Changing Node prototype to add method chaining
|
|
35
|
+
|
|
36
|
+
Node.prototype[ name ] = function ( ...params ) {
|
|
37
|
+
|
|
38
|
+
//if ( name === 'toVarIntent' ) return this;
|
|
39
|
+
|
|
40
|
+
return this.isStackNode ? this.addToStack( nodeElement( ...params ) ) : nodeElement( this, ...params );
|
|
41
|
+
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Adding assign method chaining
|
|
45
|
+
|
|
46
|
+
Node.prototype[ name + 'Assign' ] = function ( ...params ) {
|
|
47
|
+
|
|
48
|
+
return this.isStackNode ? this.assign( params[ 0 ], nodeElement( ...params ) ) : this.assign( nodeElement( this, ...params ) );
|
|
49
|
+
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
29
54
|
}
|
|
30
55
|
|
|
31
56
|
const parseSwizzle = ( props ) => props.replace( /r|s/g, 'x' ).replace( /g|t/g, 'y' ).replace( /b|p/g, 'z' ).replace( /a|q/g, 'w' );
|
|
32
57
|
const parseSwizzleAndSort = ( props ) => parseSwizzle( props ).split( '' ).sort().join( '' );
|
|
33
58
|
|
|
34
|
-
|
|
59
|
+
Node.prototype.assign = function ( ...params ) {
|
|
60
|
+
|
|
61
|
+
if ( this.isStackNode !== true ) {
|
|
62
|
+
|
|
63
|
+
if ( currentStack !== null ) {
|
|
35
64
|
|
|
36
|
-
|
|
65
|
+
currentStack.assign( this, ...params );
|
|
37
66
|
|
|
38
|
-
|
|
67
|
+
} else {
|
|
39
68
|
|
|
40
|
-
|
|
69
|
+
error( 'TSL: No stack defined for assign operation. Make sure the assign is inside a Fn().' );
|
|
41
70
|
|
|
42
|
-
|
|
71
|
+
}
|
|
43
72
|
|
|
44
|
-
|
|
73
|
+
return this;
|
|
45
74
|
|
|
46
|
-
|
|
75
|
+
} else {
|
|
47
76
|
|
|
48
|
-
|
|
77
|
+
const nodeElement = NodeElements.get( 'assign' );
|
|
49
78
|
|
|
50
|
-
|
|
79
|
+
return this.addToStack( nodeElement( ...params ) );
|
|
51
80
|
|
|
52
|
-
|
|
81
|
+
}
|
|
53
82
|
|
|
54
|
-
|
|
83
|
+
};
|
|
55
84
|
|
|
56
|
-
|
|
85
|
+
Node.prototype.toVarIntent = function () {
|
|
57
86
|
|
|
58
|
-
|
|
87
|
+
return this;
|
|
59
88
|
|
|
60
|
-
|
|
89
|
+
};
|
|
61
90
|
|
|
62
|
-
|
|
91
|
+
Node.prototype.get = function ( value ) {
|
|
63
92
|
|
|
64
|
-
|
|
93
|
+
return new MemberNode( this, value );
|
|
65
94
|
|
|
66
|
-
|
|
95
|
+
};
|
|
67
96
|
|
|
68
|
-
|
|
97
|
+
// Cache prototype for TSL
|
|
69
98
|
|
|
70
|
-
|
|
99
|
+
const proto = {};
|
|
71
100
|
|
|
72
|
-
|
|
101
|
+
// Set swizzle properties for xyzw, rgba, and stpq.
|
|
73
102
|
|
|
74
|
-
|
|
103
|
+
function setProtoSwizzle( property, altA, altB ) {
|
|
75
104
|
|
|
76
|
-
|
|
105
|
+
// swizzle properties
|
|
77
106
|
|
|
78
|
-
|
|
107
|
+
proto[ property ] = proto[ altA ] = proto[ altB ] = {
|
|
79
108
|
|
|
80
|
-
|
|
109
|
+
get() {
|
|
81
110
|
|
|
82
|
-
|
|
111
|
+
this._cache = this._cache || {};
|
|
83
112
|
|
|
84
|
-
|
|
113
|
+
//
|
|
85
114
|
|
|
86
|
-
|
|
115
|
+
let split = this._cache[ property ];
|
|
87
116
|
|
|
88
|
-
|
|
117
|
+
if ( split === undefined ) {
|
|
89
118
|
|
|
90
|
-
|
|
119
|
+
split = new SplitNode( this, property );
|
|
91
120
|
|
|
92
|
-
|
|
121
|
+
this._cache[ property ] = split;
|
|
93
122
|
|
|
94
|
-
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return split;
|
|
126
|
+
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
set( value ) {
|
|
95
130
|
|
|
96
|
-
|
|
131
|
+
this[ property ].assign( nodeObject( value ) );
|
|
97
132
|
|
|
98
|
-
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
};
|
|
99
136
|
|
|
100
|
-
|
|
137
|
+
// set properties ( swizzle ) and sort to xyzw sequence
|
|
101
138
|
|
|
102
|
-
|
|
139
|
+
const propUpper = property.toUpperCase();
|
|
140
|
+
const altAUpper = altA.toUpperCase();
|
|
141
|
+
const altBUpper = altB.toUpperCase();
|
|
103
142
|
|
|
104
|
-
|
|
143
|
+
// Set methods for swizzle properties
|
|
105
144
|
|
|
106
|
-
|
|
107
|
-
else if ( prop === 'height' ) prop = 'y';
|
|
108
|
-
else if ( prop === 'depth' ) prop = 'z';
|
|
145
|
+
Node.prototype[ 'set' + propUpper ] = Node.prototype[ 'set' + altAUpper ] = Node.prototype[ 'set' + altBUpper ] = function ( value ) {
|
|
109
146
|
|
|
110
|
-
|
|
147
|
+
const swizzle = parseSwizzleAndSort( property );
|
|
111
148
|
|
|
112
|
-
|
|
149
|
+
return new SetNode( this, swizzle, nodeObject( value ) );
|
|
113
150
|
|
|
114
|
-
|
|
151
|
+
};
|
|
115
152
|
|
|
116
|
-
|
|
153
|
+
// Set methods for flip properties
|
|
117
154
|
|
|
118
|
-
|
|
155
|
+
Node.prototype[ 'flip' + propUpper ] = Node.prototype[ 'flip' + altAUpper ] = Node.prototype[ 'flip' + altBUpper ] = function () {
|
|
119
156
|
|
|
120
|
-
|
|
157
|
+
const swizzle = parseSwizzleAndSort( property );
|
|
121
158
|
|
|
122
|
-
|
|
159
|
+
return new FlipNode( this, swizzle );
|
|
160
|
+
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const swizzleA = [ 'x', 'y', 'z', 'w' ];
|
|
166
|
+
const swizzleB = [ 'r', 'g', 'b', 'a' ];
|
|
167
|
+
const swizzleC = [ 's', 't', 'p', 'q' ];
|
|
168
|
+
|
|
169
|
+
for ( let a = 0; a < 4; a ++ ) {
|
|
170
|
+
|
|
171
|
+
let prop = swizzleA[ a ];
|
|
172
|
+
let altA = swizzleB[ a ];
|
|
173
|
+
let altB = swizzleC[ a ];
|
|
174
|
+
|
|
175
|
+
setProtoSwizzle( prop, altA, altB );
|
|
176
|
+
|
|
177
|
+
for ( let b = 0; b < 4; b ++ ) {
|
|
178
|
+
|
|
179
|
+
prop = swizzleA[ a ] + swizzleA[ b ];
|
|
180
|
+
altA = swizzleB[ a ] + swizzleB[ b ];
|
|
181
|
+
altB = swizzleC[ a ] + swizzleC[ b ];
|
|
182
|
+
|
|
183
|
+
setProtoSwizzle( prop, altA, altB );
|
|
184
|
+
|
|
185
|
+
for ( let c = 0; c < 4; c ++ ) {
|
|
186
|
+
|
|
187
|
+
prop = swizzleA[ a ] + swizzleA[ b ] + swizzleA[ c ];
|
|
188
|
+
altA = swizzleB[ a ] + swizzleB[ b ] + swizzleB[ c ];
|
|
189
|
+
altB = swizzleC[ a ] + swizzleC[ b ] + swizzleC[ c ];
|
|
190
|
+
|
|
191
|
+
setProtoSwizzle( prop, altA, altB );
|
|
192
|
+
|
|
193
|
+
for ( let d = 0; d < 4; d ++ ) {
|
|
194
|
+
|
|
195
|
+
prop = swizzleA[ a ] + swizzleA[ b ] + swizzleA[ c ] + swizzleA[ d ];
|
|
196
|
+
altA = swizzleB[ a ] + swizzleB[ b ] + swizzleB[ c ] + swizzleB[ d ];
|
|
197
|
+
altB = swizzleC[ a ] + swizzleC[ b ] + swizzleC[ c ] + swizzleC[ d ];
|
|
198
|
+
|
|
199
|
+
setProtoSwizzle( prop, altA, altB );
|
|
123
200
|
|
|
124
201
|
}
|
|
125
202
|
|
|
126
203
|
}
|
|
127
204
|
|
|
128
|
-
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Set/get static properties for array elements (0-31).
|
|
129
210
|
|
|
130
|
-
|
|
211
|
+
for ( let i = 0; i < 32; i ++ ) {
|
|
131
212
|
|
|
132
|
-
|
|
213
|
+
proto[ i ] = {
|
|
133
214
|
|
|
134
|
-
|
|
215
|
+
get() {
|
|
135
216
|
|
|
136
|
-
|
|
217
|
+
this._cache = this._cache || {};
|
|
137
218
|
|
|
138
|
-
|
|
219
|
+
//
|
|
139
220
|
|
|
140
|
-
|
|
221
|
+
let element = this._cache[ i ];
|
|
141
222
|
|
|
142
|
-
|
|
223
|
+
if ( element === undefined ) {
|
|
224
|
+
|
|
225
|
+
element = new ArrayElementNode( this, new ConstNode( i, 'uint' ) );
|
|
226
|
+
|
|
227
|
+
this._cache[ i ] = element;
|
|
143
228
|
|
|
144
229
|
}
|
|
145
230
|
|
|
231
|
+
return element;
|
|
232
|
+
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
set( value ) {
|
|
236
|
+
|
|
237
|
+
this[ i ].assign( nodeObject( value ) );
|
|
238
|
+
|
|
146
239
|
}
|
|
147
240
|
|
|
148
|
-
|
|
241
|
+
};
|
|
149
242
|
|
|
150
|
-
|
|
243
|
+
}
|
|
151
244
|
|
|
152
|
-
|
|
245
|
+
/*
|
|
246
|
+
// Set properties for width, height, and depth.
|
|
153
247
|
|
|
154
|
-
|
|
155
|
-
const nodeBuilderFunctionsCacheMap = new WeakMap();
|
|
248
|
+
function setProtoProperty( property, target ) {
|
|
156
249
|
|
|
157
|
-
|
|
250
|
+
proto[ property ] = {
|
|
158
251
|
|
|
159
|
-
|
|
252
|
+
get() {
|
|
160
253
|
|
|
161
|
-
|
|
254
|
+
this._cache = this._cache || {};
|
|
255
|
+
|
|
256
|
+
//
|
|
257
|
+
|
|
258
|
+
let split = this._cache[ target ];
|
|
259
|
+
|
|
260
|
+
if ( split === undefined ) {
|
|
261
|
+
|
|
262
|
+
split = new SplitNode( this, target );
|
|
263
|
+
|
|
264
|
+
this._cache[ target ] = split;
|
|
265
|
+
|
|
266
|
+
}
|
|
162
267
|
|
|
163
|
-
|
|
268
|
+
return split;
|
|
164
269
|
|
|
165
|
-
|
|
270
|
+
},
|
|
166
271
|
|
|
167
|
-
|
|
272
|
+
set( value ) {
|
|
168
273
|
|
|
169
|
-
|
|
170
|
-
nodeObjectsCacheMap.set( nodeObject, nodeObject );
|
|
274
|
+
this[ target ].assign( nodeObject( value ) );
|
|
171
275
|
|
|
172
276
|
}
|
|
173
277
|
|
|
174
|
-
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
setProtoProperty( 'width', 'x' );
|
|
283
|
+
setProtoProperty( 'height', 'y' );
|
|
284
|
+
setProtoProperty( 'depth', 'z' );
|
|
285
|
+
*/
|
|
286
|
+
|
|
287
|
+
Object.defineProperties( Node.prototype, proto );
|
|
288
|
+
|
|
289
|
+
// --- FINISH ---
|
|
290
|
+
|
|
291
|
+
const nodeBuilderFunctionsCacheMap = new WeakMap();
|
|
292
|
+
|
|
293
|
+
const ShaderNodeObject = function ( obj, altType = null ) {
|
|
294
|
+
|
|
295
|
+
const type = getValueType( obj );
|
|
296
|
+
|
|
297
|
+
if ( type === 'node' ) {
|
|
298
|
+
|
|
299
|
+
return obj;
|
|
175
300
|
|
|
176
301
|
} else if ( ( altType === null && ( type === 'float' || type === 'boolean' ) ) || ( type && type !== 'shader' && type !== 'string' ) ) {
|
|
177
302
|
|
|
@@ -249,13 +374,13 @@ const ShaderNodeProxy = function ( NodeClass, scope = null, factor = null, setti
|
|
|
249
374
|
|
|
250
375
|
if ( minParams !== undefined && params.length < minParams ) {
|
|
251
376
|
|
|
252
|
-
|
|
377
|
+
error( `TSL: "${ tslName }" parameter length is less than minimum required.` );
|
|
253
378
|
|
|
254
379
|
return params.concat( new Array( minParams - params.length ).fill( 0 ) );
|
|
255
380
|
|
|
256
381
|
} else if ( maxParams !== undefined && params.length > maxParams ) {
|
|
257
382
|
|
|
258
|
-
|
|
383
|
+
error( `TSL: "${ tslName }" parameter length exceeds limit.` );
|
|
259
384
|
|
|
260
385
|
return params.slice( 0, maxParams );
|
|
261
386
|
|
|
@@ -322,12 +447,12 @@ const ShaderNodeImmutable = function ( NodeClass, ...params ) {
|
|
|
322
447
|
|
|
323
448
|
class ShaderCallNodeInternal extends Node {
|
|
324
449
|
|
|
325
|
-
constructor( shaderNode,
|
|
450
|
+
constructor( shaderNode, rawInputs ) {
|
|
326
451
|
|
|
327
452
|
super();
|
|
328
453
|
|
|
329
454
|
this.shaderNode = shaderNode;
|
|
330
|
-
this.
|
|
455
|
+
this.rawInputs = rawInputs;
|
|
331
456
|
|
|
332
457
|
this.isShaderCallNodeInternal = true;
|
|
333
458
|
|
|
@@ -339,6 +464,12 @@ class ShaderCallNodeInternal extends Node {
|
|
|
339
464
|
|
|
340
465
|
}
|
|
341
466
|
|
|
467
|
+
getElementType( builder ) {
|
|
468
|
+
|
|
469
|
+
return this.getOutputNode( builder ).getElementType( builder );
|
|
470
|
+
|
|
471
|
+
}
|
|
472
|
+
|
|
342
473
|
getMemberType( builder, name ) {
|
|
343
474
|
|
|
344
475
|
return this.getOutputNode( builder ).getMemberType( builder, name );
|
|
@@ -347,7 +478,7 @@ class ShaderCallNodeInternal extends Node {
|
|
|
347
478
|
|
|
348
479
|
call( builder ) {
|
|
349
480
|
|
|
350
|
-
const { shaderNode,
|
|
481
|
+
const { shaderNode, rawInputs } = this;
|
|
351
482
|
|
|
352
483
|
const properties = builder.getNodeProperties( shaderNode );
|
|
353
484
|
|
|
@@ -363,8 +494,10 @@ class ShaderCallNodeInternal extends Node {
|
|
|
363
494
|
//
|
|
364
495
|
|
|
365
496
|
const previousSubBuildFn = builder.subBuildFn;
|
|
497
|
+
const previousFnCall = builder.fnCall;
|
|
366
498
|
|
|
367
499
|
builder.subBuildFn = subBuild;
|
|
500
|
+
builder.fnCall = this;
|
|
368
501
|
|
|
369
502
|
let result = null;
|
|
370
503
|
|
|
@@ -392,46 +525,55 @@ class ShaderCallNodeInternal extends Node {
|
|
|
392
525
|
|
|
393
526
|
builder.addInclude( functionNode );
|
|
394
527
|
|
|
395
|
-
|
|
528
|
+
//
|
|
396
529
|
|
|
397
|
-
|
|
530
|
+
const inputs = rawInputs ? getLayoutParameters( rawInputs ) : null;
|
|
398
531
|
|
|
399
|
-
|
|
532
|
+
result = nodeObject( functionNode.call( inputs ) );
|
|
400
533
|
|
|
401
|
-
|
|
534
|
+
} else {
|
|
402
535
|
|
|
403
|
-
|
|
404
|
-
// so we can call TSL functions using the syntax `Fn( ( { r, g, b } ) => { ... } )`
|
|
405
|
-
// and call through `fn( 0, 1, 0 )` or `fn( { r: 0, g: 1, b: 0 } )`
|
|
536
|
+
const secureNodeBuilder = new Proxy( builder, {
|
|
406
537
|
|
|
407
|
-
|
|
538
|
+
get: ( target, property, receiver ) => {
|
|
408
539
|
|
|
409
|
-
|
|
410
|
-
get: ( target, property, receiver ) => {
|
|
540
|
+
let value;
|
|
411
541
|
|
|
412
|
-
|
|
542
|
+
if ( Symbol.iterator === property ) {
|
|
413
543
|
|
|
414
|
-
|
|
544
|
+
value = function* () {
|
|
415
545
|
|
|
416
|
-
|
|
546
|
+
yield undefined;
|
|
417
547
|
|
|
418
|
-
|
|
548
|
+
};
|
|
419
549
|
|
|
420
|
-
|
|
550
|
+
} else {
|
|
551
|
+
|
|
552
|
+
value = Reflect.get( target, property, receiver );
|
|
421
553
|
|
|
422
554
|
}
|
|
423
|
-
} );
|
|
424
555
|
|
|
425
|
-
|
|
556
|
+
return value;
|
|
557
|
+
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
} );
|
|
561
|
+
|
|
562
|
+
//
|
|
563
|
+
|
|
564
|
+
const inputs = rawInputs ? getProxyParameters( rawInputs ) : null;
|
|
565
|
+
|
|
566
|
+
const hasParameters = Array.isArray( rawInputs ) ? rawInputs.length > 0 : rawInputs !== null;
|
|
426
567
|
|
|
427
568
|
const jsFunc = shaderNode.jsFunc;
|
|
428
|
-
const outputNode =
|
|
569
|
+
const outputNode = hasParameters || jsFunc.length > 1 ? jsFunc( inputs, secureNodeBuilder ) : jsFunc( secureNodeBuilder );
|
|
429
570
|
|
|
430
571
|
result = nodeObject( outputNode );
|
|
431
572
|
|
|
432
573
|
}
|
|
433
574
|
|
|
434
575
|
builder.subBuildFn = previousSubBuildFn;
|
|
576
|
+
builder.fnCall = previousFnCall;
|
|
435
577
|
|
|
436
578
|
if ( shaderNode.once ) {
|
|
437
579
|
|
|
@@ -475,6 +617,10 @@ class ShaderCallNodeInternal extends Node {
|
|
|
475
617
|
const subBuildOutput = builder.getSubBuildOutput( this );
|
|
476
618
|
const outputNode = this.getOutputNode( builder );
|
|
477
619
|
|
|
620
|
+
const previousFnCall = builder.fnCall;
|
|
621
|
+
|
|
622
|
+
builder.fnCall = this;
|
|
623
|
+
|
|
478
624
|
if ( buildStage === 'setup' ) {
|
|
479
625
|
|
|
480
626
|
const subBuildInitialized = builder.getSubBuildProperty( 'initialized', this );
|
|
@@ -522,12 +668,118 @@ class ShaderCallNodeInternal extends Node {
|
|
|
522
668
|
|
|
523
669
|
}
|
|
524
670
|
|
|
671
|
+
builder.fnCall = previousFnCall;
|
|
672
|
+
|
|
525
673
|
return result;
|
|
526
674
|
|
|
527
675
|
}
|
|
528
676
|
|
|
529
677
|
}
|
|
530
678
|
|
|
679
|
+
function getLayoutParameters( params ) {
|
|
680
|
+
|
|
681
|
+
let output;
|
|
682
|
+
|
|
683
|
+
nodeObjects( params );
|
|
684
|
+
|
|
685
|
+
const isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
|
|
686
|
+
|
|
687
|
+
if ( isArrayAsParameter ) {
|
|
688
|
+
|
|
689
|
+
output = [ ...params ];
|
|
690
|
+
|
|
691
|
+
} else {
|
|
692
|
+
|
|
693
|
+
output = params[ 0 ];
|
|
694
|
+
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
return output;
|
|
698
|
+
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
function getProxyParameters( params ) {
|
|
702
|
+
|
|
703
|
+
let index = 0;
|
|
704
|
+
|
|
705
|
+
nodeObjects( params );
|
|
706
|
+
|
|
707
|
+
return new Proxy( params, {
|
|
708
|
+
|
|
709
|
+
get: ( target, property, receiver ) => {
|
|
710
|
+
|
|
711
|
+
let value;
|
|
712
|
+
|
|
713
|
+
if ( property === 'length' ) {
|
|
714
|
+
|
|
715
|
+
value = params.length;
|
|
716
|
+
|
|
717
|
+
return value;
|
|
718
|
+
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
if ( Symbol.iterator === property ) {
|
|
722
|
+
|
|
723
|
+
value = function* () {
|
|
724
|
+
|
|
725
|
+
for ( const inputNode of params ) {
|
|
726
|
+
|
|
727
|
+
yield nodeObject( inputNode );
|
|
728
|
+
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
};
|
|
732
|
+
|
|
733
|
+
} else {
|
|
734
|
+
|
|
735
|
+
if ( params.length > 0 ) {
|
|
736
|
+
|
|
737
|
+
if ( Object.getPrototypeOf( params[ 0 ] ) === Object.prototype ) {
|
|
738
|
+
|
|
739
|
+
const objectTarget = params[ 0 ];
|
|
740
|
+
|
|
741
|
+
if ( objectTarget[ property ] === undefined ) {
|
|
742
|
+
|
|
743
|
+
value = objectTarget[ index ++ ];
|
|
744
|
+
|
|
745
|
+
} else {
|
|
746
|
+
|
|
747
|
+
value = Reflect.get( objectTarget, property, receiver );
|
|
748
|
+
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
} else if ( params[ 0 ] instanceof Node ) {
|
|
752
|
+
|
|
753
|
+
if ( params[ property ] === undefined ) {
|
|
754
|
+
|
|
755
|
+
value = params[ index ++ ];
|
|
756
|
+
|
|
757
|
+
} else {
|
|
758
|
+
|
|
759
|
+
value = Reflect.get( params, property, receiver );
|
|
760
|
+
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
} else {
|
|
766
|
+
|
|
767
|
+
value = Reflect.get( target, property, receiver );
|
|
768
|
+
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
value = nodeObject( value );
|
|
772
|
+
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
return value;
|
|
776
|
+
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
} );
|
|
780
|
+
|
|
781
|
+
}
|
|
782
|
+
|
|
531
783
|
class ShaderNodeInternal extends Node {
|
|
532
784
|
|
|
533
785
|
constructor( jsFunc, nodeType ) {
|
|
@@ -551,11 +803,15 @@ class ShaderNodeInternal extends Node {
|
|
|
551
803
|
|
|
552
804
|
}
|
|
553
805
|
|
|
554
|
-
|
|
806
|
+
getLayout() {
|
|
555
807
|
|
|
556
|
-
|
|
808
|
+
return this.layout;
|
|
557
809
|
|
|
558
|
-
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
call( rawInputs = null ) {
|
|
813
|
+
|
|
814
|
+
return new ShaderCallNodeInternal( this, rawInputs );
|
|
559
815
|
|
|
560
816
|
}
|
|
561
817
|
|
|
@@ -611,7 +867,25 @@ const ConvertType = function ( type, cacheMap = null ) {
|
|
|
611
867
|
|
|
612
868
|
return ( ...params ) => {
|
|
613
869
|
|
|
614
|
-
|
|
870
|
+
for ( const param of params ) {
|
|
871
|
+
|
|
872
|
+
if ( param === undefined ) {
|
|
873
|
+
|
|
874
|
+
error( `TSL: Invalid parameter for the type "${ type }".` );
|
|
875
|
+
|
|
876
|
+
return nodeObject( new ConstNode( 0, type ) );
|
|
877
|
+
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
if ( params.length === 0 || ( ! [ 'bool', 'float', 'int', 'uint' ].includes( type ) && params.every( param => {
|
|
883
|
+
|
|
884
|
+
const paramType = typeof param;
|
|
885
|
+
|
|
886
|
+
return paramType !== 'object' && paramType !== 'function';
|
|
887
|
+
|
|
888
|
+
} ) ) ) {
|
|
615
889
|
|
|
616
890
|
params = [ getValueFromType( type, ...params ) ];
|
|
617
891
|
|
|
@@ -650,7 +924,7 @@ export const getConstNodeType = ( value ) => ( value !== undefined && value !==
|
|
|
650
924
|
|
|
651
925
|
export function ShaderNode( jsFunc, nodeType ) {
|
|
652
926
|
|
|
653
|
-
return new
|
|
927
|
+
return new ShaderNodeInternal( jsFunc, nodeType );
|
|
654
928
|
|
|
655
929
|
}
|
|
656
930
|
|
|
@@ -660,123 +934,151 @@ export const nodeObjects = ( val, altType = null ) => new ShaderNodeObjects( val
|
|
|
660
934
|
export const nodeArray = ( val, altType = null ) => new ShaderNodeArray( val, altType );
|
|
661
935
|
export const nodeProxy = ( NodeClass, scope = null, factor = null, settings = null ) => new ShaderNodeProxy( NodeClass, scope, factor, settings );
|
|
662
936
|
export const nodeImmutable = ( NodeClass, ...params ) => new ShaderNodeImmutable( NodeClass, ...params );
|
|
663
|
-
export const nodeProxyIntent = ( NodeClass, scope = null, factor = null, settings = {} ) => new ShaderNodeProxy( NodeClass, scope, factor, { intent: true
|
|
937
|
+
export const nodeProxyIntent = ( NodeClass, scope = null, factor = null, settings = {} ) => new ShaderNodeProxy( NodeClass, scope, factor, { ...settings, intent: true } );
|
|
664
938
|
|
|
665
939
|
let fnId = 0;
|
|
666
940
|
|
|
667
|
-
|
|
941
|
+
class FnNode extends Node {
|
|
668
942
|
|
|
669
|
-
|
|
943
|
+
constructor( jsFunc, layout = null ) {
|
|
670
944
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
if ( typeof layout === 'object' ) {
|
|
945
|
+
super();
|
|
674
946
|
|
|
675
|
-
|
|
947
|
+
let nodeType = null;
|
|
676
948
|
|
|
677
|
-
|
|
949
|
+
if ( layout !== null ) {
|
|
678
950
|
|
|
679
|
-
if ( typeof layout === '
|
|
951
|
+
if ( typeof layout === 'object' ) {
|
|
680
952
|
|
|
681
|
-
nodeType = layout;
|
|
953
|
+
nodeType = layout.return;
|
|
682
954
|
|
|
683
955
|
} else {
|
|
684
956
|
|
|
685
|
-
|
|
957
|
+
if ( typeof layout === 'string' ) {
|
|
958
|
+
|
|
959
|
+
nodeType = layout;
|
|
960
|
+
|
|
961
|
+
} else {
|
|
962
|
+
|
|
963
|
+
error( 'TSL: Invalid layout type.' );
|
|
964
|
+
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
layout = null;
|
|
686
968
|
|
|
687
969
|
}
|
|
688
970
|
|
|
689
|
-
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
this.shaderNode = new ShaderNode( jsFunc, nodeType );
|
|
974
|
+
|
|
975
|
+
if ( layout !== null ) {
|
|
976
|
+
|
|
977
|
+
this.setLayout( layout );
|
|
690
978
|
|
|
691
979
|
}
|
|
692
980
|
|
|
981
|
+
this.isFn = true;
|
|
982
|
+
|
|
693
983
|
}
|
|
694
984
|
|
|
695
|
-
|
|
985
|
+
setLayout( layout ) {
|
|
696
986
|
|
|
697
|
-
|
|
987
|
+
const nodeType = this.shaderNode.nodeType;
|
|
698
988
|
|
|
699
|
-
|
|
989
|
+
if ( typeof layout.inputs !== 'object' ) {
|
|
700
990
|
|
|
701
|
-
|
|
991
|
+
const fullLayout = {
|
|
992
|
+
name: 'fn' + fnId ++,
|
|
993
|
+
type: nodeType,
|
|
994
|
+
inputs: []
|
|
995
|
+
};
|
|
702
996
|
|
|
703
|
-
|
|
997
|
+
for ( const name in layout ) {
|
|
704
998
|
|
|
705
|
-
|
|
999
|
+
if ( name === 'return' ) continue;
|
|
706
1000
|
|
|
707
|
-
|
|
1001
|
+
fullLayout.inputs.push( {
|
|
1002
|
+
name: name,
|
|
1003
|
+
type: layout[ name ]
|
|
1004
|
+
} );
|
|
708
1005
|
|
|
709
|
-
|
|
1006
|
+
}
|
|
710
1007
|
|
|
711
|
-
|
|
1008
|
+
layout = fullLayout;
|
|
712
1009
|
|
|
713
1010
|
}
|
|
714
1011
|
|
|
715
|
-
|
|
1012
|
+
this.shaderNode.setLayout( layout );
|
|
1013
|
+
|
|
1014
|
+
return this;
|
|
1015
|
+
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
getNodeType( builder ) {
|
|
1019
|
+
|
|
1020
|
+
return this.shaderNode.getNodeType( builder ) || 'float';
|
|
1021
|
+
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
call( ...params ) {
|
|
1025
|
+
|
|
1026
|
+
const fnCall = this.shaderNode.call( params );
|
|
716
1027
|
|
|
717
|
-
if ( nodeType === 'void' ) fnCall.toStack();
|
|
1028
|
+
if ( this.shaderNode.nodeType === 'void' ) fnCall.toStack();
|
|
718
1029
|
|
|
719
1030
|
return fnCall.toVarIntent();
|
|
720
1031
|
|
|
721
|
-
}
|
|
1032
|
+
}
|
|
722
1033
|
|
|
723
|
-
|
|
724
|
-
fn.id = shaderNode.id;
|
|
1034
|
+
once( subBuilds = null ) {
|
|
725
1035
|
|
|
726
|
-
|
|
1036
|
+
this.shaderNode.once = true;
|
|
1037
|
+
this.shaderNode.subBuilds = subBuilds;
|
|
727
1038
|
|
|
728
|
-
|
|
729
|
-
fn.getCacheKey = ( ...params ) => shaderNode.getCacheKey( ...params );
|
|
1039
|
+
return this;
|
|
730
1040
|
|
|
731
|
-
|
|
1041
|
+
}
|
|
732
1042
|
|
|
733
|
-
|
|
1043
|
+
generate( builder ) {
|
|
734
1044
|
|
|
735
|
-
|
|
1045
|
+
const type = this.getNodeType( builder );
|
|
736
1046
|
|
|
737
|
-
|
|
1047
|
+
error( 'TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".' );
|
|
738
1048
|
|
|
739
|
-
|
|
1049
|
+
return builder.generateConst( type );
|
|
740
1050
|
|
|
741
|
-
|
|
742
|
-
shaderNode.subBuilds = subBuilds;
|
|
1051
|
+
}
|
|
743
1052
|
|
|
744
|
-
|
|
1053
|
+
}
|
|
745
1054
|
|
|
746
|
-
|
|
1055
|
+
export function Fn( jsFunc, layout = null ) {
|
|
747
1056
|
|
|
748
|
-
|
|
1057
|
+
const instance = new FnNode( jsFunc, layout );
|
|
749
1058
|
|
|
750
|
-
|
|
1059
|
+
return new Proxy( () => {}, {
|
|
751
1060
|
|
|
752
|
-
|
|
753
|
-
name: 'fn' + fnId ++,
|
|
754
|
-
type: nodeType,
|
|
755
|
-
inputs: []
|
|
756
|
-
};
|
|
1061
|
+
apply( target, thisArg, params ) {
|
|
757
1062
|
|
|
758
|
-
|
|
1063
|
+
return instance.call( ...params );
|
|
759
1064
|
|
|
760
|
-
|
|
1065
|
+
},
|
|
761
1066
|
|
|
762
|
-
|
|
763
|
-
name: name,
|
|
764
|
-
type: layout[ name ]
|
|
765
|
-
} );
|
|
1067
|
+
get( target, prop, receiver ) {
|
|
766
1068
|
|
|
767
|
-
|
|
1069
|
+
return Reflect.get( instance, prop, receiver );
|
|
768
1070
|
|
|
769
|
-
|
|
1071
|
+
},
|
|
770
1072
|
|
|
771
|
-
|
|
1073
|
+
set( target, prop, value, receiver ) {
|
|
772
1074
|
|
|
773
|
-
|
|
1075
|
+
return Reflect.set( instance, prop, value, receiver );
|
|
774
1076
|
|
|
775
|
-
|
|
1077
|
+
}
|
|
776
1078
|
|
|
777
|
-
|
|
1079
|
+
} );
|
|
778
1080
|
|
|
779
|
-
}
|
|
1081
|
+
}
|
|
780
1082
|
|
|
781
1083
|
//
|
|
782
1084
|
|
|
@@ -833,7 +1135,7 @@ export const Switch = ( ...params ) => currentStack.Switch( ...params );
|
|
|
833
1135
|
*/
|
|
834
1136
|
export function Stack( node ) {
|
|
835
1137
|
|
|
836
|
-
if ( currentStack ) currentStack.
|
|
1138
|
+
if ( currentStack ) currentStack.addToStack( node );
|
|
837
1139
|
|
|
838
1140
|
return node;
|
|
839
1141
|
|
|
@@ -914,15 +1216,14 @@ addMethodChaining( 'convert', convert );
|
|
|
914
1216
|
*/
|
|
915
1217
|
export const append = ( node ) => { // @deprecated, r176
|
|
916
1218
|
|
|
917
|
-
|
|
1219
|
+
warn( 'TSL: append() has been renamed to Stack().' );
|
|
918
1220
|
return Stack( node );
|
|
919
1221
|
|
|
920
1222
|
};
|
|
921
1223
|
|
|
922
1224
|
addMethodChaining( 'append', ( node ) => { // @deprecated, r176
|
|
923
1225
|
|
|
924
|
-
|
|
1226
|
+
warn( 'TSL: .append() has been renamed to .toStack().' );
|
|
925
1227
|
return Stack( node );
|
|
926
1228
|
|
|
927
1229
|
} );
|
|
928
|
-
|