super-three 0.177.0 → 0.181.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/README.md +1 -1
- package/build/three.cjs +1994 -749
- package/build/three.core.js +1358 -506
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +631 -247
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +113 -33
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +9571 -3424
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +9397 -3426
- 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 +2 -3
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/capabilities/WebGL.js +0 -27
- package/examples/jsm/capabilities/WebGPU.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +9 -9
- 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 +62 -15
- package/examples/jsm/csm/CSMShadowNode.js +4 -4
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/environments/RoomEnvironment.js +8 -3
- 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 +683 -299
- package/examples/jsm/geometries/DecalGeometry.js +2 -2
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
- 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 +11 -13
- 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/libs/meshopt_decoder.module.js +75 -58
- package/examples/jsm/lights/LightProbeGenerator.js +14 -3
- 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 +4 -4
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +210 -22
- package/examples/jsm/loaders/FBXLoader.js +4 -4
- 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 +233 -34
- 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 +13 -1
- package/examples/jsm/loaders/USDLoader.js +219 -0
- package/examples/jsm/loaders/USDZLoader.js +4 -892
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/loaders/usd/USDAParser.js +741 -0
- package/examples/jsm/loaders/usd/USDCParser.js +17 -0
- 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/LensflareMesh.js +3 -3
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/SkyMesh.js +3 -3
- package/examples/jsm/objects/Water.js +3 -3
- package/examples/jsm/objects/WaterMesh.js +6 -6
- package/examples/jsm/physics/RapierPhysics.js +95 -16
- package/examples/jsm/postprocessing/GTAOPass.js +10 -9
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +17 -17
- package/examples/jsm/postprocessing/SSAOPass.js +10 -9
- 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 +11 -2
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +381 -30
- package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
- package/examples/jsm/transpiler/Linker.js +327 -0
- package/examples/jsm/transpiler/TSLEncoder.js +196 -92
- package/examples/jsm/transpiler/Transpiler.js +17 -1
- package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
- package/examples/jsm/transpiler/WGSLEncoder.js +812 -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 +11 -6
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
- 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 +55 -43
- package/examples/jsm/tsl/display/OutlineNode.js +13 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -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 +578 -0
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/hashBlur.js +18 -20
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
- 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 +5 -2
- package/src/Three.TSL.js +112 -32
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +4 -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 +8 -7
- package/src/animation/PropertyBinding.js +12 -11
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +10 -9
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/Camera.js +14 -0
- package/src/cameras/OrthographicCamera.js +2 -2
- package/src/cameras/PerspectiveCamera.js +2 -2
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +13 -5
- package/src/core/BufferAttribute.js +3 -3
- package/src/core/BufferGeometry.js +10 -10
- package/src/core/Clock.js +2 -8
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/GLBufferAttribute.js +13 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +4 -3
- package/src/core/Raycaster.js +2 -1
- package/src/core/RenderTarget.js +10 -1
- package/{examples/jsm/misc → src/core}/Timer.js +4 -42
- 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 +279 -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/Path.js +22 -22
- 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 +42 -12
- package/src/helpers/SkeletonHelper.js +35 -6
- package/src/lights/LightShadow.js +21 -8
- package/src/lights/PointLightShadow.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 +29 -5
- package/src/loaders/ImageBitmapLoader.js +32 -8
- package/src/loaders/ImageLoader.js +56 -9
- package/src/loaders/Loader.js +17 -3
- package/src/loaders/LoadingManager.js +45 -0
- 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 +2 -1
- 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 -10
- package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
- package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
- package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
- package/src/materials/nodes/NodeMaterial.js +90 -27
- package/src/materials/nodes/PointsNodeMaterial.js +86 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
- 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/Frustum.js +25 -9
- package/src/math/FrustumArray.js +10 -5
- package/src/math/Line3.js +129 -2
- 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 +55 -34
- package/src/math/Plane.js +1 -1
- package/src/math/Quaternion.js +69 -67
- package/src/math/Spherical.js +3 -3
- package/src/nodes/Nodes.js +6 -4
- package/src/nodes/TSL.js +9 -4
- package/src/nodes/accessors/AccessorsUtils.js +7 -8
- package/src/nodes/accessors/Bitangent.js +31 -25
- package/src/nodes/accessors/BufferNode.js +1 -1
- package/src/nodes/accessors/Camera.js +142 -16
- 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 +97 -30
- package/src/nodes/accessors/Object3DNode.js +2 -2
- package/src/nodes/accessors/Position.js +25 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +20 -4
- package/src/nodes/accessors/ReflectVector.js +3 -3
- package/src/nodes/accessors/SceneNode.js +3 -2
- package/src/nodes/accessors/StorageBufferNode.js +2 -1
- package/src/nodes/accessors/StorageTextureNode.js +23 -1
- package/src/nodes/accessors/Tangent.js +25 -17
- package/src/nodes/accessors/TangentUtils.js +46 -0
- package/src/nodes/accessors/Texture3DNode.js +14 -1
- package/src/nodes/accessors/TextureBicubic.js +21 -3
- package/src/nodes/accessors/TextureNode.js +142 -44
- package/src/nodes/accessors/UniformArrayNode.js +0 -16
- package/src/nodes/code/FunctionCallNode.js +24 -4
- package/src/nodes/code/FunctionNode.js +23 -0
- package/src/nodes/core/ArrayNode.js +13 -0
- package/src/nodes/core/AssignNode.js +6 -2
- package/src/nodes/core/AttributeNode.js +2 -1
- package/src/nodes/core/ContextNode.js +48 -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} +36 -17
- package/src/nodes/core/Node.js +167 -34
- package/src/nodes/core/NodeBuilder.js +404 -120
- 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 -88
- package/src/nodes/core/ParameterNode.js +31 -0
- package/src/nodes/core/PropertyNode.js +7 -0
- package/src/nodes/core/StackNode.js +77 -30
- package/src/nodes/core/StructNode.js +5 -5
- package/src/nodes/core/StructTypeNode.js +1 -0
- package/src/nodes/core/SubBuildNode.js +89 -0
- package/src/nodes/core/UniformNode.js +80 -14
- package/src/nodes/core/VarNode.js +142 -16
- package/src/nodes/core/VaryingNode.js +9 -6
- package/src/nodes/display/BlendModes.js +7 -6
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/FrontFacingNode.js +35 -7
- package/src/nodes/display/NormalMapNode.js +20 -50
- package/src/nodes/display/PassNode.js +206 -17
- package/src/nodes/display/RenderOutputNode.js +28 -2
- package/src/nodes/display/ScreenNode.js +44 -40
- 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 +94 -4
- package/src/nodes/fog/Fog.js +3 -2
- package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
- package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhongLightingModel.js +3 -3
- package/src/nodes/functions/PhysicalLightingModel.js +19 -18
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/src/nodes/geometry/RangeNode.js +40 -4
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
- package/src/nodes/gpgpu/ComputeNode.js +81 -25
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
- package/src/nodes/lighting/EnvironmentNode.js +11 -11
- package/src/nodes/lighting/LightsNode.js +7 -8
- package/src/nodes/lighting/PointShadowNode.js +6 -0
- package/src/nodes/lighting/ProjectorLightNode.js +19 -6
- package/src/nodes/lighting/ShadowFilterNode.js +3 -1
- package/src/nodes/lighting/ShadowNode.js +77 -10
- package/src/nodes/materialx/MaterialXNodes.js +131 -2
- package/src/nodes/materialx/lib/mx_noise.js +165 -1
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/ConditionalNode.js +25 -27
- package/src/nodes/math/MathNode.js +106 -65
- package/src/nodes/math/OperatorNode.js +28 -43
- package/src/nodes/pmrem/PMREMUtils.js +117 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +6 -2
- package/src/nodes/tsl/TSLCore.js +546 -186
- package/src/nodes/utils/DebugNode.js +3 -2
- package/src/nodes/utils/EquirectUV.js +27 -0
- package/src/nodes/utils/EventNode.js +119 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +6 -3
- package/src/nodes/utils/LoopNode.js +20 -41
- package/src/nodes/utils/MatcapUV.js +22 -0
- package/src/nodes/utils/MemberNode.js +59 -7
- package/src/nodes/utils/PostProcessingUtils.js +28 -1
- package/src/nodes/utils/RTTNode.js +33 -6
- package/src/nodes/utils/ReflectorNode.js +68 -10
- package/src/nodes/utils/SampleNode.js +91 -0
- package/src/nodes/utils/SplitNode.js +11 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/nodes/utils/TriplanarTextures.js +65 -0
- package/src/objects/BatchedMesh.js +6 -4
- 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 +77 -66
- 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 +4 -3
- package/src/renderers/common/Bindings.js +76 -19
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +1 -1
- package/src/renderers/common/Color4.js +2 -2
- package/src/renderers/common/CubeRenderTarget.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 +61 -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 +84 -5
- package/src/renderers/common/RenderObjects.js +1 -1
- package/src/renderers/common/Renderer.js +486 -255
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +8 -68
- package/src/renderers/common/Sampler.js +117 -0
- package/src/renderers/common/Storage3DTexture.js +100 -0
- package/src/renderers/common/StorageArrayTexture.js +84 -0
- package/src/renderers/common/StorageTexture.js +27 -0
- package/src/renderers/common/Textures.js +138 -46
- package/src/renderers/common/TimestampQueryPool.js +65 -3
- package/src/renderers/common/UniformsGroup.js +2 -1
- package/src/renderers/common/XRManager.js +63 -24
- package/src/renderers/common/XRRenderTarget.js +21 -4
- package/src/renderers/common/extras/PMREMGenerator.js +161 -66
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
- 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 +21 -11
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +25 -4
- package/src/renderers/webgl/WebGLAttributes.js +4 -0
- package/src/renderers/webgl/WebGLCapabilities.js +4 -3
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLProgram.js +25 -18
- package/src/renderers/webgl/WebGLPrograms.js +9 -6
- package/src/renderers/webgl/WebGLShadowMap.js +13 -2
- package/src/renderers/webgl/WebGLState.js +17 -16
- package/src/renderers/webgl/WebGLTextures.js +38 -21
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl/WebGLUtils.js +3 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -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 +205 -128
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +3 -2
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
- package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
- package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
- package/src/renderers/webxr/WebXRManager.js +89 -13
- package/src/textures/ExternalTexture.js +56 -0
- package/src/textures/FramebufferTexture.js +2 -2
- package/src/textures/Source.js +14 -3
- package/src/textures/Texture.js +3 -2
- package/src/textures/VideoTexture.js +29 -2
- package/src/utils.js +67 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
- package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
- package/src/nodes/utils/EquirectUVNode.js +0 -65
- package/src/nodes/utils/MatcapUVNode.js +0 -49
- package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
|
@@ -22,7 +22,7 @@ const shadowMaterialLib = /*@__PURE__*/ new WeakMap();
|
|
|
22
22
|
*/
|
|
23
23
|
export const BasicShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer } ) => {
|
|
24
24
|
|
|
25
|
-
let basic = texture( depthTexture, shadowCoord.xy ).
|
|
25
|
+
let basic = texture( depthTexture, shadowCoord.xy ).setName( 't_basic' );
|
|
26
26
|
|
|
27
27
|
if ( depthTexture.isArrayTexture ) {
|
|
28
28
|
|
|
@@ -245,6 +245,8 @@ const linearShadowDistance = ( light ) => {
|
|
|
245
245
|
* If not, it creates a new `NodeMaterial` configured for shadow rendering and stores it
|
|
246
246
|
* in the `shadowMaterialLib` for future use.
|
|
247
247
|
*
|
|
248
|
+
* @tsl
|
|
249
|
+
* @function
|
|
248
250
|
* @param {Light} light - The light source for which the shadow material is needed.
|
|
249
251
|
* If the light is a point light, a depth node is calculated
|
|
250
252
|
* using the linear shadow distance.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import ShadowBaseNode, { shadowPositionWorld } from './ShadowBaseNode.js';
|
|
2
2
|
import { float, vec2, vec3, int, Fn, nodeObject } from '../tsl/TSLBase.js';
|
|
3
3
|
import { reference } from '../accessors/ReferenceNode.js';
|
|
4
|
-
import { texture } from '../accessors/TextureNode.js';
|
|
5
|
-
import {
|
|
4
|
+
import { texture, textureLoad } from '../accessors/TextureNode.js';
|
|
5
|
+
import { normalWorld } from '../accessors/Normal.js';
|
|
6
6
|
import { mix, sqrt } from '../math/MathNode.js';
|
|
7
7
|
import { add } from '../math/OperatorNode.js';
|
|
8
8
|
import { DepthTexture } from '../../textures/DepthTexture.js';
|
|
@@ -18,6 +18,9 @@ import { resetRendererAndSceneState, restoreRendererAndSceneState } from '../../
|
|
|
18
18
|
import { getDataFromObject } from '../core/NodeUtils.js';
|
|
19
19
|
import { getShadowMaterial, BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter } from './ShadowFilterNode.js';
|
|
20
20
|
import ChainMap from '../../renderers/common/ChainMap.js';
|
|
21
|
+
import { warn } from '../../utils.js';
|
|
22
|
+
import { textureSize } from '../accessors/TextureSizeNode.js';
|
|
23
|
+
import { uv } from '../accessors/UV.js';
|
|
21
24
|
|
|
22
25
|
//
|
|
23
26
|
|
|
@@ -27,6 +30,8 @@ const _shadowRenderObjectKeys = [];
|
|
|
27
30
|
/**
|
|
28
31
|
* Creates a function to render shadow objects in a scene.
|
|
29
32
|
*
|
|
33
|
+
* @tsl
|
|
34
|
+
* @function
|
|
30
35
|
* @param {Renderer} renderer - The renderer.
|
|
31
36
|
* @param {LightShadow} shadow - The light shadow object containing shadow properties.
|
|
32
37
|
* @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).
|
|
@@ -268,6 +273,22 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
268
273
|
*/
|
|
269
274
|
this._node = null;
|
|
270
275
|
|
|
276
|
+
/**
|
|
277
|
+
* The current shadow map type of this shadow node.
|
|
278
|
+
*
|
|
279
|
+
* @type {?number}
|
|
280
|
+
* @private
|
|
281
|
+
* @default null
|
|
282
|
+
*/
|
|
283
|
+
this._currentShadowType = null;
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* A Weak Map holding the current frame ID per camera. Used
|
|
287
|
+
* to control the update of shadow maps.
|
|
288
|
+
*
|
|
289
|
+
* @type {WeakMap<Camera,number>}
|
|
290
|
+
* @private
|
|
291
|
+
*/
|
|
271
292
|
this._cameraFrameId = new WeakMap();
|
|
272
293
|
|
|
273
294
|
/**
|
|
@@ -405,7 +426,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
405
426
|
*/
|
|
406
427
|
setupShadow( builder ) {
|
|
407
428
|
|
|
408
|
-
const { renderer } = builder;
|
|
429
|
+
const { renderer, camera } = builder;
|
|
409
430
|
|
|
410
431
|
const { light, shadow } = this;
|
|
411
432
|
|
|
@@ -413,6 +434,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
413
434
|
|
|
414
435
|
const { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder );
|
|
415
436
|
|
|
437
|
+
shadow.camera.coordinateSystem = camera.coordinateSystem;
|
|
416
438
|
shadow.camera.updateProjectionMatrix();
|
|
417
439
|
|
|
418
440
|
// VSM
|
|
@@ -484,7 +506,7 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
484
506
|
const shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup );
|
|
485
507
|
const normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup );
|
|
486
508
|
|
|
487
|
-
const shadowPosition = lightShadowMatrix( light ).mul( shadowPositionWorld.add(
|
|
509
|
+
const shadowPosition = lightShadowMatrix( light ).mul( shadowPositionWorld.add( normalWorld.mul( normalBias ) ) );
|
|
488
510
|
const shadowCoord = this.setupShadowCoord( builder, shadowPosition );
|
|
489
511
|
|
|
490
512
|
//
|
|
@@ -514,7 +536,19 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
514
536
|
this.shadowMap = shadowMap;
|
|
515
537
|
this.shadow.map = shadowMap;
|
|
516
538
|
|
|
517
|
-
|
|
539
|
+
// Shadow Output + Inspector
|
|
540
|
+
|
|
541
|
+
const inspectName = `${ this.light.type } Shadow [ ${ this.light.name || 'ID: ' + this.light.id } ]`;
|
|
542
|
+
|
|
543
|
+
return shadowOutput.toInspector( `${ inspectName } / Color`, () => {
|
|
544
|
+
|
|
545
|
+
return texture( this.shadowMap.texture );
|
|
546
|
+
|
|
547
|
+
} ).toInspector( `${ inspectName } / Depth`, () => {
|
|
548
|
+
|
|
549
|
+
return textureLoad( this.shadowMap.depthTexture, uv().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).x.oneMinus();
|
|
550
|
+
|
|
551
|
+
} );
|
|
518
552
|
|
|
519
553
|
}
|
|
520
554
|
|
|
@@ -531,6 +565,15 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
531
565
|
|
|
532
566
|
return Fn( () => {
|
|
533
567
|
|
|
568
|
+
const currentShadowType = builder.renderer.shadowMap.type;
|
|
569
|
+
|
|
570
|
+
if ( this._currentShadowType !== currentShadowType ) {
|
|
571
|
+
|
|
572
|
+
this._reset();
|
|
573
|
+
this._node = null;
|
|
574
|
+
|
|
575
|
+
}
|
|
576
|
+
|
|
534
577
|
let node = this._node;
|
|
535
578
|
|
|
536
579
|
this.setupShadowPosition( builder );
|
|
@@ -538,12 +581,13 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
538
581
|
if ( node === null ) {
|
|
539
582
|
|
|
540
583
|
this._node = node = this.setupShadow( builder );
|
|
584
|
+
this._currentShadowType = currentShadowType;
|
|
541
585
|
|
|
542
586
|
}
|
|
543
587
|
|
|
544
588
|
if ( builder.material.shadowNode ) { // @deprecated, r171
|
|
545
589
|
|
|
546
|
-
|
|
590
|
+
warn( 'NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.' );
|
|
547
591
|
|
|
548
592
|
}
|
|
549
593
|
|
|
@@ -576,8 +620,14 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
576
620
|
|
|
577
621
|
shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height, shadowMap.depth );
|
|
578
622
|
|
|
623
|
+
const currentSceneName = scene.name;
|
|
624
|
+
|
|
625
|
+
scene.name = `Shadow Map [ ${ light.name || 'ID: ' + light.id } ]`;
|
|
626
|
+
|
|
579
627
|
renderer.render( scene, shadow.camera );
|
|
580
628
|
|
|
629
|
+
scene.name = currentSceneName;
|
|
630
|
+
|
|
581
631
|
}
|
|
582
632
|
|
|
583
633
|
/**
|
|
@@ -664,8 +714,27 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
664
714
|
*/
|
|
665
715
|
dispose() {
|
|
666
716
|
|
|
667
|
-
this.
|
|
668
|
-
|
|
717
|
+
this._reset();
|
|
718
|
+
|
|
719
|
+
super.dispose();
|
|
720
|
+
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/**
|
|
724
|
+
* Resets the resouce state of this shadow node.
|
|
725
|
+
*
|
|
726
|
+
* @private
|
|
727
|
+
*/
|
|
728
|
+
_reset() {
|
|
729
|
+
|
|
730
|
+
this._currentShadowType = null;
|
|
731
|
+
|
|
732
|
+
if ( this.shadowMap ) {
|
|
733
|
+
|
|
734
|
+
this.shadowMap.dispose();
|
|
735
|
+
this.shadowMap = null;
|
|
736
|
+
|
|
737
|
+
}
|
|
669
738
|
|
|
670
739
|
if ( this.vsmShadowMapVertical !== null ) {
|
|
671
740
|
|
|
@@ -687,8 +756,6 @@ class ShadowNode extends ShadowBaseNode {
|
|
|
687
756
|
|
|
688
757
|
}
|
|
689
758
|
|
|
690
|
-
super.dispose();
|
|
691
|
-
|
|
692
759
|
}
|
|
693
760
|
|
|
694
761
|
/**
|
|
@@ -2,13 +2,17 @@ import {
|
|
|
2
2
|
mx_perlin_noise_float, mx_perlin_noise_vec3,
|
|
3
3
|
mx_worley_noise_float as worley_noise_float, mx_worley_noise_vec2 as worley_noise_vec2, mx_worley_noise_vec3 as worley_noise_vec3,
|
|
4
4
|
mx_cell_noise_float as cell_noise_float,
|
|
5
|
+
mx_unifiednoise2d as unifiednoise2d, mx_unifiednoise3d as unifiednoise3d,
|
|
5
6
|
mx_fractal_noise_float as fractal_noise_float, mx_fractal_noise_vec2 as fractal_noise_vec2, mx_fractal_noise_vec3 as fractal_noise_vec3, mx_fractal_noise_vec4 as fractal_noise_vec4
|
|
6
7
|
} from './lib/mx_noise.js';
|
|
7
8
|
import { mx_hsvtorgb, mx_rgbtohsv } from './lib/mx_hsv.js';
|
|
8
9
|
import { mx_srgb_texture_to_lin_rec709 } from './lib/mx_transform_color.js';
|
|
9
|
-
|
|
10
|
+
|
|
11
|
+
import { float, vec2, vec3, vec4, int, add, sub, mul, div, mod, atan, mix, pow, smoothstep } from '../tsl/TSLBase.js';
|
|
10
12
|
import { uv } from '../accessors/UV.js';
|
|
11
|
-
import {
|
|
13
|
+
import { bumpMap } from '../display/BumpMapNode.js';
|
|
14
|
+
import { rotate } from '../utils/RotateNode.js';
|
|
15
|
+
import { frameId, time } from '../utils/Timer.js';
|
|
12
16
|
|
|
13
17
|
export const mx_aastep = ( threshold, value ) => {
|
|
14
18
|
|
|
@@ -25,6 +29,19 @@ const _ramp = ( a, b, uv, p ) => mix( a, b, uv[ p ].clamp() );
|
|
|
25
29
|
export const mx_ramplr = ( valuel, valuer, texcoord = uv() ) => _ramp( valuel, valuer, texcoord, 'x' );
|
|
26
30
|
export const mx_ramptb = ( valuet, valueb, texcoord = uv() ) => _ramp( valuet, valueb, texcoord, 'y' );
|
|
27
31
|
|
|
32
|
+
// Bilinear ramp: interpolate between four corners (tl, tr, bl, br) using texcoord.x and texcoord.y
|
|
33
|
+
export const mx_ramp4 = (
|
|
34
|
+
valuetl, valuetr, valuebl, valuebr, texcoord = uv()
|
|
35
|
+
) => {
|
|
36
|
+
|
|
37
|
+
const u = texcoord.x.clamp();
|
|
38
|
+
const v = texcoord.y.clamp();
|
|
39
|
+
const top = mix( valuetl, valuetr, u );
|
|
40
|
+
const bottom = mix( valuebl, valuebr, u );
|
|
41
|
+
return mix( top, bottom, v );
|
|
42
|
+
|
|
43
|
+
};
|
|
44
|
+
|
|
28
45
|
const _split = ( a, b, center, uv, p ) => mix( a, b, mx_aastep( center, uv[ p ] ) );
|
|
29
46
|
export const mx_splitlr = ( valuel, valuer, center, texcoord = uv() ) => _split( valuel, valuer, center, texcoord, 'x' );
|
|
30
47
|
export const mx_splittb = ( valuet, valueb, center, texcoord = uv() ) => _split( valuet, valueb, center, texcoord, 'y' );
|
|
@@ -54,6 +71,9 @@ export const mx_noise_vec4 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => {
|
|
|
54
71
|
|
|
55
72
|
};
|
|
56
73
|
|
|
74
|
+
export const mx_unifiednoise2d = ( noiseType, texcoord = uv(), freq = vec2( 1, 1 ), offset = vec2( 0, 0 ), jitter = 1, outmin = 0, outmax = 1, clampoutput = false, octaves = 1, lacunarity = 2, diminish = .5 ) => unifiednoise2d( noiseType, texcoord.convert( 'vec2|vec3' ), freq, offset, jitter, outmin, outmax, clampoutput, octaves, lacunarity, diminish );
|
|
75
|
+
export const mx_unifiednoise3d = ( noiseType, texcoord = uv(), freq = vec2( 1, 1 ), offset = vec2( 0, 0 ), jitter = 1, outmin = 0, outmax = 1, clampoutput = false, octaves = 1, lacunarity = 2, diminish = .5 ) => unifiednoise3d( noiseType, texcoord.convert( 'vec2|vec3' ), freq, offset, jitter, outmin, outmax, clampoutput, octaves, lacunarity, diminish );
|
|
76
|
+
|
|
57
77
|
export const mx_worley_noise_float = ( texcoord = uv(), jitter = 1 ) => worley_noise_float( texcoord.convert( 'vec2|vec3' ), jitter, int( 1 ) );
|
|
58
78
|
export const mx_worley_noise_vec2 = ( texcoord = uv(), jitter = 1 ) => worley_noise_vec2( texcoord.convert( 'vec2|vec3' ), jitter, int( 1 ) );
|
|
59
79
|
export const mx_worley_noise_vec3 = ( texcoord = uv(), jitter = 1 ) => worley_noise_vec3( texcoord.convert( 'vec2|vec3' ), jitter, int( 1 ) );
|
|
@@ -66,3 +86,112 @@ export const mx_fractal_noise_vec3 = ( position = uv(), octaves = 3, lacunarity
|
|
|
66
86
|
export const mx_fractal_noise_vec4 = ( position = uv(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => fractal_noise_vec4( position, int( octaves ), lacunarity, diminish ).mul( amplitude );
|
|
67
87
|
|
|
68
88
|
export { mx_hsvtorgb, mx_rgbtohsv, mx_srgb_texture_to_lin_rec709 };
|
|
89
|
+
|
|
90
|
+
// === Moved from MaterialXLoader.js ===
|
|
91
|
+
|
|
92
|
+
// Math ops
|
|
93
|
+
export const mx_add = ( in1, in2 = float( 0 ) ) => add( in1, in2 );
|
|
94
|
+
export const mx_subtract = ( in1, in2 = float( 0 ) ) => sub( in1, in2 );
|
|
95
|
+
export const mx_multiply = ( in1, in2 = float( 1 ) ) => mul( in1, in2 );
|
|
96
|
+
export const mx_divide = ( in1, in2 = float( 1 ) ) => div( in1, in2 );
|
|
97
|
+
export const mx_modulo = ( in1, in2 = float( 1 ) ) => mod( in1, in2 );
|
|
98
|
+
export const mx_power = ( in1, in2 = float( 1 ) ) => pow( in1, in2 );
|
|
99
|
+
export const mx_atan2 = ( in1 = float( 0 ), in2 = float( 1 ) ) => atan( in1, in2 );
|
|
100
|
+
export const mx_timer = () => time;
|
|
101
|
+
export const mx_frame = () => frameId;
|
|
102
|
+
export const mx_invert = ( in1, amount = float( 1 ) ) => sub( amount, in1 );
|
|
103
|
+
export const mx_ifgreater = ( value1, value2, in1, in2 ) => value1.greaterThan( value2 ).mix( in1, in2 );
|
|
104
|
+
export const mx_ifgreatereq = ( value1, value2, in1, in2 ) => value1.greaterThanEqual( value2 ).mix( in1, in2 );
|
|
105
|
+
export const mx_ifequal = ( value1, value2, in1, in2 ) => value1.equal( value2 ).mix( in1, in2 );
|
|
106
|
+
|
|
107
|
+
// Enhanced separate node to support multi-output referencing (outx, outy, outz, outw)
|
|
108
|
+
export const mx_separate = ( in1, channelOrOut = null ) => {
|
|
109
|
+
|
|
110
|
+
if ( typeof channelOrOut === 'string' ) {
|
|
111
|
+
|
|
112
|
+
const map = { x: 0, r: 0, y: 1, g: 1, z: 2, b: 2, w: 3, a: 3 };
|
|
113
|
+
const c = channelOrOut.replace( /^out/, '' ).toLowerCase();
|
|
114
|
+
if ( map[ c ] !== undefined ) return in1.element( map[ c ] );
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if ( typeof channelOrOut === 'number' ) {
|
|
119
|
+
|
|
120
|
+
return in1.element( channelOrOut );
|
|
121
|
+
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if ( typeof channelOrOut === 'string' && channelOrOut.length === 1 ) {
|
|
125
|
+
|
|
126
|
+
const map = { x: 0, r: 0, y: 1, g: 1, z: 2, b: 2, w: 3, a: 3 };
|
|
127
|
+
if ( map[ channelOrOut ] !== undefined ) return in1.element( map[ channelOrOut ] );
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return in1;
|
|
132
|
+
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export const mx_place2d = (
|
|
136
|
+
texcoord, pivot = vec2( 0.5, 0.5 ), scale = vec2( 1, 1 ), rotate = float( 0 ), offset = vec2( 0, 0 )/*, operationorder = int( 0 )*/
|
|
137
|
+
) => {
|
|
138
|
+
|
|
139
|
+
let uv = texcoord;
|
|
140
|
+
if ( pivot ) uv = uv.sub( pivot );
|
|
141
|
+
if ( scale ) uv = uv.mul( scale );
|
|
142
|
+
if ( rotate ) {
|
|
143
|
+
|
|
144
|
+
const rad = rotate.mul( Math.PI / 180.0 );
|
|
145
|
+
const cosR = rad.cos();
|
|
146
|
+
const sinR = rad.sin();
|
|
147
|
+
uv = vec2(
|
|
148
|
+
uv.x.mul( cosR ).sub( uv.y.mul( sinR ) ),
|
|
149
|
+
uv.x.mul( sinR ).add( uv.y.mul( cosR ) )
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if ( pivot ) uv = uv.add( pivot );
|
|
155
|
+
if ( offset ) uv = uv.add( offset );
|
|
156
|
+
return uv;
|
|
157
|
+
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export const mx_rotate2d = ( input, amount ) => {
|
|
161
|
+
|
|
162
|
+
input = vec2( input );
|
|
163
|
+
amount = float( amount );
|
|
164
|
+
|
|
165
|
+
const radians = amount.mul( Math.PI / 180.0 );
|
|
166
|
+
return rotate( input, radians );
|
|
167
|
+
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
export const mx_rotate3d = ( input, amount, axis ) => {
|
|
171
|
+
|
|
172
|
+
input = vec3( input );
|
|
173
|
+
amount = float( amount );
|
|
174
|
+
axis = vec3( axis );
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
const radians = amount.mul( Math.PI / 180.0 );
|
|
178
|
+
const nAxis = axis.normalize();
|
|
179
|
+
const cosA = radians.cos();
|
|
180
|
+
const sinA = radians.sin();
|
|
181
|
+
const oneMinusCosA = float( 1 ).sub( cosA );
|
|
182
|
+
const rot =
|
|
183
|
+
input.mul( cosA )
|
|
184
|
+
.add( nAxis.cross( input ).mul( sinA ) )
|
|
185
|
+
.add( nAxis.mul( nAxis.dot( input ) ).mul( oneMinusCosA ) );
|
|
186
|
+
return rot;
|
|
187
|
+
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
export const mx_heighttonormal = ( input, scale/*, texcoord*/ ) => {
|
|
191
|
+
|
|
192
|
+
input = vec3( input );
|
|
193
|
+
scale = float( scale );
|
|
194
|
+
|
|
195
|
+
return bumpMap( input, scale );
|
|
196
|
+
|
|
197
|
+
};
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { int, uint, float, vec3, bool, uvec3, vec2, vec4, If, Fn } from '../../tsl/TSLBase.js';
|
|
5
5
|
import { select } from '../../math/ConditionalNode.js';
|
|
6
6
|
import { sub, mul } from '../../math/OperatorNode.js';
|
|
7
|
-
import { floor, abs, max, dot, min, sqrt } from '../../math/MathNode.js';
|
|
7
|
+
import { floor, abs, max, dot, min, sqrt, clamp } from '../../math/MathNode.js';
|
|
8
8
|
import { overloadingFn } from '../../utils/FunctionOverloadingNode.js';
|
|
9
9
|
import { Loop } from '../../utils/LoopNode.js';
|
|
10
10
|
|
|
@@ -1325,3 +1325,167 @@ export const mx_worley_noise_vec3_1 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_
|
|
|
1325
1325
|
} );
|
|
1326
1326
|
|
|
1327
1327
|
export const mx_worley_noise_vec3 = /*@__PURE__*/ overloadingFn( [ mx_worley_noise_vec3_0, mx_worley_noise_vec3_1 ] );
|
|
1328
|
+
|
|
1329
|
+
// Unified Noise 2D
|
|
1330
|
+
export const mx_unifiednoise2d = /*@__PURE__*/ Fn( ( [
|
|
1331
|
+
noiseType_immutable, texcoord_immutable, freq_immutable, offset_immutable,
|
|
1332
|
+
jitter_immutable, outmin_immutable, outmax_immutable, clampoutput_immutable,
|
|
1333
|
+
octaves_immutable, lacunarity_immutable, diminish_immutable
|
|
1334
|
+
] ) => {
|
|
1335
|
+
|
|
1336
|
+
const noiseType = int( noiseType_immutable ).toVar();
|
|
1337
|
+
const texcoord = vec2( texcoord_immutable ).toVar();
|
|
1338
|
+
const freq = vec2( freq_immutable ).toVar();
|
|
1339
|
+
const offset = vec2( offset_immutable ).toVar();
|
|
1340
|
+
const jitter = float( jitter_immutable ).toVar();
|
|
1341
|
+
const outmin = float( outmin_immutable ).toVar();
|
|
1342
|
+
const outmax = float( outmax_immutable ).toVar();
|
|
1343
|
+
const clampoutput = bool( clampoutput_immutable ).toVar();
|
|
1344
|
+
const octaves = int( octaves_immutable ).toVar();
|
|
1345
|
+
const lacunarity = float( lacunarity_immutable ).toVar();
|
|
1346
|
+
const diminish = float( diminish_immutable ).toVar();
|
|
1347
|
+
|
|
1348
|
+
// Compute input position
|
|
1349
|
+
const p = texcoord.mul( freq ).add( offset );
|
|
1350
|
+
|
|
1351
|
+
const result = float( 0.0 ).toVar();
|
|
1352
|
+
|
|
1353
|
+
// Perlin
|
|
1354
|
+
If( noiseType.equal( int( 0 ) ), () => {
|
|
1355
|
+
|
|
1356
|
+
result.assign( mx_perlin_noise_vec3( p ) );
|
|
1357
|
+
|
|
1358
|
+
} );
|
|
1359
|
+
|
|
1360
|
+
// Cell
|
|
1361
|
+
If( noiseType.equal( int( 1 ) ), () => {
|
|
1362
|
+
|
|
1363
|
+
result.assign( mx_cell_noise_vec3( p ) );
|
|
1364
|
+
|
|
1365
|
+
} );
|
|
1366
|
+
|
|
1367
|
+
// Worley (metric=0 = euclidean)
|
|
1368
|
+
If( noiseType.equal( int( 2 ) ), () => {
|
|
1369
|
+
|
|
1370
|
+
result.assign( mx_worley_noise_vec3( p, jitter, int( 0 ) ) );
|
|
1371
|
+
|
|
1372
|
+
} );
|
|
1373
|
+
|
|
1374
|
+
// Fractal (use vec3(p, 0.0) for 2D input)
|
|
1375
|
+
If( noiseType.equal( int( 3 ) ), () => {
|
|
1376
|
+
|
|
1377
|
+
result.assign( mx_fractal_noise_vec3( vec3( p, 0.0 ), octaves, lacunarity, diminish ) );
|
|
1378
|
+
|
|
1379
|
+
} );
|
|
1380
|
+
|
|
1381
|
+
// Remap output to [outmin, outmax]
|
|
1382
|
+
result.assign( result.mul( outmax.sub( outmin ) ).add( outmin ) );
|
|
1383
|
+
|
|
1384
|
+
// Clamp if requested
|
|
1385
|
+
If( clampoutput, () => {
|
|
1386
|
+
|
|
1387
|
+
result.assign( clamp( result, outmin, outmax ) );
|
|
1388
|
+
|
|
1389
|
+
} );
|
|
1390
|
+
|
|
1391
|
+
return result;
|
|
1392
|
+
|
|
1393
|
+
} ).setLayout( {
|
|
1394
|
+
name: 'mx_unifiednoise2d',
|
|
1395
|
+
type: 'float',
|
|
1396
|
+
inputs: [
|
|
1397
|
+
{ name: 'noiseType', type: 'int' },
|
|
1398
|
+
{ name: 'texcoord', type: 'vec2' },
|
|
1399
|
+
{ name: 'freq', type: 'vec2' },
|
|
1400
|
+
{ name: 'offset', type: 'vec2' },
|
|
1401
|
+
{ name: 'jitter', type: 'float' },
|
|
1402
|
+
{ name: 'outmin', type: 'float' },
|
|
1403
|
+
{ name: 'outmax', type: 'float' },
|
|
1404
|
+
{ name: 'clampoutput', type: 'bool' },
|
|
1405
|
+
{ name: 'octaves', type: 'int' },
|
|
1406
|
+
{ name: 'lacunarity', type: 'float' },
|
|
1407
|
+
{ name: 'diminish', type: 'float' }
|
|
1408
|
+
]
|
|
1409
|
+
} );
|
|
1410
|
+
|
|
1411
|
+
// Unified Noise 3D
|
|
1412
|
+
export const mx_unifiednoise3d = /*@__PURE__*/ Fn( ( [
|
|
1413
|
+
noiseType_immutable, position_immutable, freq_immutable, offset_immutable,
|
|
1414
|
+
jitter_immutable, outmin_immutable, outmax_immutable, clampoutput_immutable,
|
|
1415
|
+
octaves_immutable, lacunarity_immutable, diminish_immutable
|
|
1416
|
+
] ) => {
|
|
1417
|
+
|
|
1418
|
+
const noiseType = int( noiseType_immutable ).toVar();
|
|
1419
|
+
const position = vec3( position_immutable ).toVar();
|
|
1420
|
+
const freq = vec3( freq_immutable ).toVar();
|
|
1421
|
+
const offset = vec3( offset_immutable ).toVar();
|
|
1422
|
+
const jitter = float( jitter_immutable ).toVar();
|
|
1423
|
+
const outmin = float( outmin_immutable ).toVar();
|
|
1424
|
+
const outmax = float( outmax_immutable ).toVar();
|
|
1425
|
+
const clampoutput = bool( clampoutput_immutable ).toVar();
|
|
1426
|
+
const octaves = int( octaves_immutable ).toVar();
|
|
1427
|
+
const lacunarity = float( lacunarity_immutable ).toVar();
|
|
1428
|
+
const diminish = float( diminish_immutable ).toVar();
|
|
1429
|
+
|
|
1430
|
+
// Compute input position
|
|
1431
|
+
const p = position.mul( freq ).add( offset );
|
|
1432
|
+
|
|
1433
|
+
const result = float( 0.0 ).toVar();
|
|
1434
|
+
|
|
1435
|
+
// Perlin
|
|
1436
|
+
If( noiseType.equal( int( 0 ) ), () => {
|
|
1437
|
+
|
|
1438
|
+
result.assign( mx_perlin_noise_vec3( p ) );
|
|
1439
|
+
|
|
1440
|
+
} );
|
|
1441
|
+
|
|
1442
|
+
// Cell
|
|
1443
|
+
If( noiseType.equal( int( 1 ) ), () => {
|
|
1444
|
+
|
|
1445
|
+
result.assign( mx_cell_noise_vec3( p ) );
|
|
1446
|
+
|
|
1447
|
+
} );
|
|
1448
|
+
|
|
1449
|
+
// Worley (metric=0 = euclidean)
|
|
1450
|
+
If( noiseType.equal( int( 2 ) ), () => {
|
|
1451
|
+
|
|
1452
|
+
result.assign( mx_worley_noise_vec3( p, jitter, int( 0 ) ) );
|
|
1453
|
+
|
|
1454
|
+
} );
|
|
1455
|
+
|
|
1456
|
+
// Fractal
|
|
1457
|
+
If( noiseType.equal( int( 3 ) ), () => {
|
|
1458
|
+
|
|
1459
|
+
result.assign( mx_fractal_noise_vec3( p, octaves, lacunarity, diminish ) );
|
|
1460
|
+
|
|
1461
|
+
} );
|
|
1462
|
+
|
|
1463
|
+
// Remap output to [outmin, outmax]
|
|
1464
|
+
result.assign( result.mul( outmax.sub( outmin ) ).add( outmin ) );
|
|
1465
|
+
|
|
1466
|
+
// Clamp if requested
|
|
1467
|
+
If( clampoutput, () => {
|
|
1468
|
+
|
|
1469
|
+
result.assign( clamp( result, outmin, outmax ) );
|
|
1470
|
+
|
|
1471
|
+
} );
|
|
1472
|
+
|
|
1473
|
+
return result;
|
|
1474
|
+
|
|
1475
|
+
} ).setLayout( {
|
|
1476
|
+
name: 'mx_unifiednoise3d',
|
|
1477
|
+
type: 'float',
|
|
1478
|
+
inputs: [
|
|
1479
|
+
{ name: 'noiseType', type: 'int' },
|
|
1480
|
+
{ name: 'position', type: 'vec3' },
|
|
1481
|
+
{ name: 'freq', type: 'vec3' },
|
|
1482
|
+
{ name: 'offset', type: 'vec3' },
|
|
1483
|
+
{ name: 'jitter', type: 'float' },
|
|
1484
|
+
{ name: 'outmin', type: 'float' },
|
|
1485
|
+
{ name: 'outmax', type: 'float' },
|
|
1486
|
+
{ name: 'clampoutput', type: 'bool' },
|
|
1487
|
+
{ name: 'octaves', type: 'int' },
|
|
1488
|
+
{ name: 'lacunarity', type: 'float' },
|
|
1489
|
+
{ name: 'diminish', type: 'float' }
|
|
1490
|
+
]
|
|
1491
|
+
} );
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import TempNode from '../core/TempNode.js';
|
|
2
|
+
import { nodeProxyIntent } from '../tsl/TSLCore.js';
|
|
3
|
+
/**
|
|
4
|
+
* This node represents an operation that reinterprets the bit representation of a value
|
|
5
|
+
* in one type as a value in another type.
|
|
6
|
+
*
|
|
7
|
+
* @augments TempNode
|
|
8
|
+
*/
|
|
9
|
+
class BitcastNode extends TempNode {
|
|
10
|
+
|
|
11
|
+
static get type() {
|
|
12
|
+
|
|
13
|
+
return 'BitcastNode';
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Constructs a new bitcast node.
|
|
19
|
+
*
|
|
20
|
+
* @param {Node} valueNode - The value to convert.
|
|
21
|
+
* @param {string} conversionType - The type to convert to.
|
|
22
|
+
* @param {?string} [inputType = null] - The expected input data type of the bitcast operation.
|
|
23
|
+
*/
|
|
24
|
+
constructor( valueNode, conversionType, inputType = null ) {
|
|
25
|
+
|
|
26
|
+
super();
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The data to bitcast to a new type.
|
|
30
|
+
*
|
|
31
|
+
* @type {Node}
|
|
32
|
+
*/
|
|
33
|
+
this.valueNode = valueNode;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The type the value will be converted to.
|
|
37
|
+
*
|
|
38
|
+
* @type {string}
|
|
39
|
+
*/
|
|
40
|
+
this.conversionType = conversionType;
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The expected input data type of the bitcast operation.
|
|
45
|
+
*
|
|
46
|
+
*
|
|
47
|
+
* @type {string}
|
|
48
|
+
* @default null
|
|
49
|
+
*/
|
|
50
|
+
this.inputType = inputType;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* This flag can be used for type testing.
|
|
54
|
+
*
|
|
55
|
+
* @type {boolean}
|
|
56
|
+
* @readonly
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
this.isBitcastNode = true;
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getNodeType( builder ) {
|
|
64
|
+
|
|
65
|
+
// GLSL aliasing
|
|
66
|
+
if ( this.inputType !== null ) {
|
|
67
|
+
|
|
68
|
+
const valueType = this.valueNode.getNodeType( builder );
|
|
69
|
+
const valueLength = builder.getTypeLength( valueType );
|
|
70
|
+
|
|
71
|
+
return builder.getTypeFromLength( valueLength, this.conversionType );
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return this.conversionType;
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
generate( builder ) {
|
|
81
|
+
|
|
82
|
+
const type = this.getNodeType( builder );
|
|
83
|
+
let inputType = '';
|
|
84
|
+
|
|
85
|
+
if ( this.inputType !== null ) {
|
|
86
|
+
|
|
87
|
+
const valueType = this.valueNode.getNodeType( builder );
|
|
88
|
+
const valueTypeLength = builder.getTypeLength( valueType );
|
|
89
|
+
|
|
90
|
+
inputType = valueTypeLength === 1 ? this.inputType : builder.changeComponentType( valueType, this.inputType );
|
|
91
|
+
|
|
92
|
+
} else {
|
|
93
|
+
|
|
94
|
+
inputType = this.valueNode.getNodeType( builder );
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return `${ builder.getBitcastMethod( type, inputType ) }( ${ this.valueNode.build( builder, inputType ) } )`;
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export default BitcastNode;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Reinterpret the bit representation of a value in one type as a value in another type.
|
|
109
|
+
*
|
|
110
|
+
* @tsl
|
|
111
|
+
* @function
|
|
112
|
+
* @param {Node | number} x - The parameter.
|
|
113
|
+
* @param {string} y - The new type.
|
|
114
|
+
* @returns {Node}
|
|
115
|
+
*/
|
|
116
|
+
export const bitcast = /*@__PURE__*/ nodeProxyIntent( BitcastNode ).setParameterLength( 2 );
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Bitcasts a float or a vector of floats to a corresponding integer type with the same element size.
|
|
120
|
+
*
|
|
121
|
+
* @tsl
|
|
122
|
+
* @function
|
|
123
|
+
* @param {Node<float>} value - The float or vector of floats to bitcast.
|
|
124
|
+
* @returns {BitcastNode}
|
|
125
|
+
*/
|
|
126
|
+
export const floatBitsToInt = ( value ) => new BitcastNode( value, 'int', 'float' );
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Bitcasts a float or a vector of floats to a corresponding unsigned integer type with the same element size.
|
|
130
|
+
*
|
|
131
|
+
* @tsl
|
|
132
|
+
* @function
|
|
133
|
+
* @param {Node<float>} value - The float or vector of floats to bitcast.
|
|
134
|
+
* @returns {BitcastNode}
|
|
135
|
+
*/
|
|
136
|
+
export const floatBitsToUint = ( value ) => new BitcastNode( value, 'uint', 'float' );
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Bitcasts an integer or a vector of integers to a corresponding float type with the same element size.
|
|
140
|
+
*
|
|
141
|
+
* @tsl
|
|
142
|
+
* @function
|
|
143
|
+
* @param {Node<int>} value - The integer or vector of integers to bitcast.
|
|
144
|
+
* @returns {BitcastNode}
|
|
145
|
+
*/
|
|
146
|
+
export const intBitsToFloat = ( value ) => new BitcastNode( value, 'float', 'int' );
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Bitcast an unsigned integer or a vector of unsigned integers to a corresponding float type with the same element size.
|
|
150
|
+
*
|
|
151
|
+
* @tsl
|
|
152
|
+
* @function
|
|
153
|
+
* @param {Node<uint>} value - The unsigned integer or vector of unsigned integers to bitcast.
|
|
154
|
+
* @returns {BitcastNode}
|
|
155
|
+
*/
|
|
156
|
+
export const uintBitsToFloat = ( value ) => new BitcastNode( value, 'float', 'uint' );
|