super-three 0.181.0 → 0.184.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/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +13152 -11354
- package/build/three.core.js +12319 -11539
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1808 -781
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +27 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +10523 -6263
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +10484 -6262
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +11 -3
- package/examples/jsm/animation/CCDIKSolver.js +7 -3
- package/examples/jsm/controls/ArcballControls.js +7 -4
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +58 -54
- package/examples/jsm/controls/FlyControls.js +4 -0
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +111 -8
- package/examples/jsm/controls/TrackballControls.js +8 -8
- package/examples/jsm/controls/TransformControls.js +34 -2
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +152 -9
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/geometries/TextGeometry.js +18 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +67 -8
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +203 -88
- package/examples/jsm/inspector/RendererInspector.js +14 -4
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +41 -7
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +51 -3
- package/examples/jsm/inspector/tabs/Performance.js +4 -4
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +107 -5
- package/examples/jsm/inspector/ui/Graph.js +2 -2
- package/examples/jsm/inspector/ui/List.js +1 -1
- package/examples/jsm/inspector/ui/Profiler.js +1936 -34
- package/examples/jsm/inspector/ui/Style.js +1044 -31
- package/examples/jsm/inspector/ui/Tab.js +222 -3
- package/examples/jsm/inspector/ui/Values.js +55 -2
- package/examples/jsm/inspector/ui/utils.js +13 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- package/examples/jsm/lines/LineMaterial.js +7 -1
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +5 -5
- package/examples/jsm/loaders/EXRLoader.js +687 -48
- package/examples/jsm/loaders/FBXLoader.js +235 -37
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +146 -178
- package/examples/jsm/loaders/HDRLoader.js +1 -2
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +27 -5
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- package/examples/jsm/loaders/LWOLoader.js +7 -39
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/usd/USDAParser.js +450 -363
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -25
- package/examples/jsm/objects/Sky.js +90 -6
- package/examples/jsm/objects/SkyMesh.js +150 -16
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +174 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +6 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
- package/examples/jsm/tsl/display/GodraysNode.js +615 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +69 -19
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +8 -24
- package/examples/jsm/tsl/display/SSRNode.js +8 -8
- package/examples/jsm/tsl/display/SSSNode.js +6 -4
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +315 -126
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +24 -30
- package/src/Three.Core.js +3 -1
- package/src/Three.TSL.js +25 -11
- package/src/Three.WebGPU.Nodes.js +5 -0
- package/src/Three.WebGPU.js +9 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/constants.js +90 -5
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +52 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +4 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/AudioLoader.js +11 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +2 -3
- package/src/loaders/ImageBitmapLoader.js +12 -9
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +46 -6
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +34 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +45 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +13 -9
- package/src/math/Matrix4.js +87 -74
- package/src/math/Plane.js +4 -3
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +11 -7
- package/src/math/Vector3.js +15 -13
- package/src/math/Vector4.js +13 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +86 -68
- package/src/nodes/TSL.js +7 -7
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +107 -15
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +4 -4
- package/src/nodes/accessors/CubeTextureNode.js +27 -2
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +11 -11
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
- package/src/nodes/accessors/ReferenceNode.js +8 -8
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +14 -25
- package/src/nodes/accessors/StorageTextureNode.js +40 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +67 -23
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +2 -3
- package/src/nodes/core/ArrayNode.js +21 -2
- package/src/nodes/core/AssignNode.js +3 -3
- package/src/nodes/core/AttributeNode.js +3 -3
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +104 -5
- package/src/nodes/core/IndexNode.js +2 -1
- package/src/nodes/core/InputNode.js +1 -1
- package/src/nodes/core/InspectorNode.js +1 -1
- package/src/nodes/core/IsolateNode.js +1 -1
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +112 -15
- package/src/nodes/core/NodeBuilder.js +284 -66
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +11 -9
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +66 -17
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +17 -3
- package/src/nodes/core/StructTypeNode.js +12 -18
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +48 -23
- package/src/nodes/core/VaryingNode.js +2 -19
- package/src/nodes/display/BlendModes.js +0 -64
- package/src/nodes/display/ColorAdjustment.js +17 -0
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/NormalMapNode.js +39 -4
- package/src/nodes/display/PassNode.js +125 -16
- package/src/nodes/display/RenderOutputNode.js +7 -7
- package/src/nodes/display/ScreenNode.js +4 -2
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
- package/src/nodes/display/ViewportTextureNode.js +39 -11
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +5 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
- package/src/nodes/gpgpu/ComputeNode.js +74 -48
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +7 -28
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +120 -42
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +3 -3
- package/src/nodes/math/MathNode.js +76 -41
- package/src/nodes/math/OperatorNode.js +3 -2
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +38 -17
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +12 -12
- package/src/nodes/utils/EventNode.js +31 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +2 -2
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +3 -4
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +44 -16
- package/src/objects/InstancedMesh.js +30 -3
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +9 -0
- package/src/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +329 -145
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +29 -8
- package/src/renderers/common/Background.js +26 -13
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +29 -14
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Info.js +333 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +40 -7
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +17 -5
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +21 -5
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +481 -117
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +89 -4
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +62 -1
- package/src/renderers/common/XRManager.js +37 -29
- package/src/renderers/common/extras/PMREMGenerator.js +25 -23
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -6
- package/src/renderers/shaders/UniformsLib.js +7 -5
- package/src/renderers/shaders/UniformsUtils.js +27 -5
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +9 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +270 -0
- package/src/renderers/webgl/WebGLProgram.js +49 -109
- package/src/renderers/webgl/WebGLPrograms.js +63 -51
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +75 -37
- package/src/renderers/webgl/WebGLTextures.js +215 -54
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +260 -140
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +4 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +16 -5
- package/src/utils.js +280 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { float, Fn, If, nodeProxyIntent, uint, int, uvec2, uvec3, uvec4, ivec2, ivec3, ivec4 } from '../tsl/TSLCore.js';
|
|
2
|
+
import { bitcast, floatBitsToUint } from './BitcastNode.js';
|
|
3
|
+
import MathNode, { negate } from './MathNode.js';
|
|
4
|
+
|
|
5
|
+
const registeredBitcountFunctions = {};
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* This node represents an operation that counts the bits of a piece of shader data.
|
|
9
|
+
*
|
|
10
|
+
* @augments MathNode
|
|
11
|
+
*/
|
|
12
|
+
class BitcountNode extends MathNode {
|
|
13
|
+
|
|
14
|
+
static get type() {
|
|
15
|
+
|
|
16
|
+
return 'BitcountNode';
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Constructs a new math node.
|
|
22
|
+
*
|
|
23
|
+
* @param {'countTrailingZeros'|'countLeadingZeros'|'countOneBits'} method - The method name.
|
|
24
|
+
* @param {Node} aNode - The first input.
|
|
25
|
+
*/
|
|
26
|
+
constructor( method, aNode ) {
|
|
27
|
+
|
|
28
|
+
super( method, aNode );
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* This flag can be used for type testing.
|
|
32
|
+
*
|
|
33
|
+
* @type {boolean}
|
|
34
|
+
* @readonly
|
|
35
|
+
* @default true
|
|
36
|
+
*/
|
|
37
|
+
this.isBitcountNode = true;
|
|
38
|
+
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Casts the input value of the function to an integer if necessary.
|
|
43
|
+
*
|
|
44
|
+
* @private
|
|
45
|
+
* @param {Node<uint>|Node<int>} inputNode - The input value.
|
|
46
|
+
* @param {Node<uint>} outputNode - The output value.
|
|
47
|
+
* @param {string} elementType - The type of the input value.
|
|
48
|
+
*/
|
|
49
|
+
_resolveElementType( inputNode, outputNode, elementType ) {
|
|
50
|
+
|
|
51
|
+
if ( elementType === 'int' ) {
|
|
52
|
+
|
|
53
|
+
outputNode.assign( bitcast( inputNode, 'uint' ) );
|
|
54
|
+
|
|
55
|
+
} else {
|
|
56
|
+
|
|
57
|
+
outputNode.assign( inputNode );
|
|
58
|
+
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
_returnDataNode( inputType ) {
|
|
64
|
+
|
|
65
|
+
switch ( inputType ) {
|
|
66
|
+
|
|
67
|
+
case 'uint': {
|
|
68
|
+
|
|
69
|
+
return uint;
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
case 'int': {
|
|
74
|
+
|
|
75
|
+
return int;
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
case 'uvec2': {
|
|
80
|
+
|
|
81
|
+
return uvec2;
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
case 'uvec3': {
|
|
86
|
+
|
|
87
|
+
return uvec3;
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
case 'uvec4': {
|
|
92
|
+
|
|
93
|
+
return uvec4;
|
|
94
|
+
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
case 'ivec2': {
|
|
98
|
+
|
|
99
|
+
return ivec2;
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
case 'ivec3': {
|
|
104
|
+
|
|
105
|
+
return ivec3;
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
case 'ivec4': {
|
|
110
|
+
|
|
111
|
+
return ivec4;
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Creates and registers a reusable GLSL function that emulates the behavior of countTrailingZeros.
|
|
121
|
+
*
|
|
122
|
+
* @private
|
|
123
|
+
* @param {string} method - The name of the function to create.
|
|
124
|
+
* @param {string} elementType - The type of the input value.
|
|
125
|
+
* @returns {Function} - The generated function
|
|
126
|
+
*/
|
|
127
|
+
_createTrailingZerosBaseLayout( method, elementType ) {
|
|
128
|
+
|
|
129
|
+
const outputConvertNode = this._returnDataNode( elementType );
|
|
130
|
+
|
|
131
|
+
const fnDef = Fn( ( [ value ] ) => {
|
|
132
|
+
|
|
133
|
+
const v = uint( 0.0 );
|
|
134
|
+
|
|
135
|
+
this._resolveElementType( value, v, elementType );
|
|
136
|
+
|
|
137
|
+
const f = float( v.bitAnd( negate( v ) ) );
|
|
138
|
+
const uintBits = floatBitsToUint( f );
|
|
139
|
+
|
|
140
|
+
const numTrailingZeros = ( uintBits.shiftRight( 23 ) ).sub( 127 );
|
|
141
|
+
|
|
142
|
+
return outputConvertNode( numTrailingZeros );
|
|
143
|
+
|
|
144
|
+
} ).setLayout( {
|
|
145
|
+
name: method,
|
|
146
|
+
type: elementType,
|
|
147
|
+
inputs: [
|
|
148
|
+
{ name: 'value', type: elementType }
|
|
149
|
+
]
|
|
150
|
+
} );
|
|
151
|
+
|
|
152
|
+
return fnDef;
|
|
153
|
+
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Creates and registers a reusable GLSL function that emulates the behavior of countLeadingZeros.
|
|
158
|
+
*
|
|
159
|
+
* @private
|
|
160
|
+
* @param {string} method - The name of the function to create.
|
|
161
|
+
* @param {string} elementType - The type of the input value.
|
|
162
|
+
* @returns {Function} - The generated function
|
|
163
|
+
*/
|
|
164
|
+
_createLeadingZerosBaseLayout( method, elementType ) {
|
|
165
|
+
|
|
166
|
+
const outputConvertNode = this._returnDataNode( elementType );
|
|
167
|
+
|
|
168
|
+
const fnDef = Fn( ( [ value ] ) => {
|
|
169
|
+
|
|
170
|
+
If( value.equal( uint( 0 ) ), () => {
|
|
171
|
+
|
|
172
|
+
return uint( 32 );
|
|
173
|
+
|
|
174
|
+
} );
|
|
175
|
+
|
|
176
|
+
const v = uint( 0 );
|
|
177
|
+
const n = uint( 0 );
|
|
178
|
+
this._resolveElementType( value, v, elementType );
|
|
179
|
+
|
|
180
|
+
If( v.shiftRight( 16 ).equal( 0 ), () => {
|
|
181
|
+
|
|
182
|
+
n.addAssign( 16 );
|
|
183
|
+
v.shiftLeftAssign( 16 );
|
|
184
|
+
|
|
185
|
+
} );
|
|
186
|
+
|
|
187
|
+
If( v.shiftRight( 24 ).equal( 0 ), () => {
|
|
188
|
+
|
|
189
|
+
n.addAssign( 8 );
|
|
190
|
+
v.shiftLeftAssign( 8 );
|
|
191
|
+
|
|
192
|
+
} );
|
|
193
|
+
|
|
194
|
+
If( v.shiftRight( 28 ).equal( 0 ), () => {
|
|
195
|
+
|
|
196
|
+
n.addAssign( 4 );
|
|
197
|
+
v.shiftLeftAssign( 4 );
|
|
198
|
+
|
|
199
|
+
} );
|
|
200
|
+
|
|
201
|
+
If( v.shiftRight( 30 ).equal( 0 ), () => {
|
|
202
|
+
|
|
203
|
+
n.addAssign( 2 );
|
|
204
|
+
v.shiftLeftAssign( 2 );
|
|
205
|
+
|
|
206
|
+
} );
|
|
207
|
+
|
|
208
|
+
If( v.shiftRight( 31 ).equal( 0 ), () => {
|
|
209
|
+
|
|
210
|
+
n.addAssign( 1 );
|
|
211
|
+
|
|
212
|
+
} );
|
|
213
|
+
|
|
214
|
+
return outputConvertNode( n );
|
|
215
|
+
|
|
216
|
+
} ).setLayout( {
|
|
217
|
+
name: method,
|
|
218
|
+
type: elementType,
|
|
219
|
+
inputs: [
|
|
220
|
+
{ name: 'value', type: elementType }
|
|
221
|
+
]
|
|
222
|
+
} );
|
|
223
|
+
|
|
224
|
+
return fnDef;
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Creates and registers a reusable GLSL function that emulates the behavior of countOneBits.
|
|
230
|
+
*
|
|
231
|
+
* @private
|
|
232
|
+
* @param {string} method - The name of the function to create.
|
|
233
|
+
* @param {string} elementType - The type of the input value.
|
|
234
|
+
* @returns {Function} - The generated function
|
|
235
|
+
*/
|
|
236
|
+
_createOneBitsBaseLayout( method, elementType ) {
|
|
237
|
+
|
|
238
|
+
const outputConvertNode = this._returnDataNode( elementType );
|
|
239
|
+
|
|
240
|
+
const fnDef = Fn( ( [ value ] ) => {
|
|
241
|
+
|
|
242
|
+
const v = uint( 0.0 );
|
|
243
|
+
|
|
244
|
+
this._resolveElementType( value, v, elementType );
|
|
245
|
+
|
|
246
|
+
v.assign( v.sub( v.shiftRight( uint( 1 ) ).bitAnd( uint( 0x55555555 ) ) ) );
|
|
247
|
+
v.assign( v.bitAnd( uint( 0x33333333 ) ).add( v.shiftRight( uint( 2 ) ).bitAnd( uint( 0x33333333 ) ) ) );
|
|
248
|
+
|
|
249
|
+
const numBits = v.add( v.shiftRight( uint( 4 ) ) ).bitAnd( uint( 0xF0F0F0F ) ).mul( uint( 0x1010101 ) ).shiftRight( uint( 24 ) );
|
|
250
|
+
|
|
251
|
+
return outputConvertNode( numBits );
|
|
252
|
+
|
|
253
|
+
} ).setLayout( {
|
|
254
|
+
name: method,
|
|
255
|
+
type: elementType,
|
|
256
|
+
inputs: [
|
|
257
|
+
{ name: 'value', type: elementType }
|
|
258
|
+
]
|
|
259
|
+
} );
|
|
260
|
+
|
|
261
|
+
return fnDef;
|
|
262
|
+
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Creates and registers a reusable GLSL function that emulates the behavior of the specified bitcount function.
|
|
267
|
+
* including considerations for component-wise bitcounts on vector type inputs.
|
|
268
|
+
*
|
|
269
|
+
* @private
|
|
270
|
+
* @param {string} method - The name of the function to create.
|
|
271
|
+
* @param {string} inputType - The type of the input value.
|
|
272
|
+
* @param {number} typeLength - The vec length of the input value.
|
|
273
|
+
* @param {Function} baseFn - The base function that operates on an individual component of the vector.
|
|
274
|
+
* @returns {Function} - The alias function for the specified bitcount method.
|
|
275
|
+
*/
|
|
276
|
+
_createMainLayout( method, inputType, typeLength, baseFn ) {
|
|
277
|
+
|
|
278
|
+
const outputConvertNode = this._returnDataNode( inputType );
|
|
279
|
+
|
|
280
|
+
const fnDef = Fn( ( [ value ] ) => {
|
|
281
|
+
|
|
282
|
+
if ( typeLength === 1 ) {
|
|
283
|
+
|
|
284
|
+
return outputConvertNode( baseFn( value ) );
|
|
285
|
+
|
|
286
|
+
} else {
|
|
287
|
+
|
|
288
|
+
const vec = outputConvertNode( 0 );
|
|
289
|
+
|
|
290
|
+
const components = [ 'x', 'y', 'z', 'w' ];
|
|
291
|
+
for ( let i = 0; i < typeLength; i ++ ) {
|
|
292
|
+
|
|
293
|
+
const component = components[ i ];
|
|
294
|
+
|
|
295
|
+
vec[ component ].assign( baseFn( value[ component ] ) );
|
|
296
|
+
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return vec;
|
|
300
|
+
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
} ).setLayout( {
|
|
304
|
+
name: method,
|
|
305
|
+
type: inputType,
|
|
306
|
+
inputs: [
|
|
307
|
+
{ name: 'value', type: inputType }
|
|
308
|
+
]
|
|
309
|
+
} );
|
|
310
|
+
|
|
311
|
+
return fnDef;
|
|
312
|
+
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
setup( builder ) {
|
|
316
|
+
|
|
317
|
+
const { method, aNode } = this;
|
|
318
|
+
|
|
319
|
+
const { renderer } = builder;
|
|
320
|
+
|
|
321
|
+
if ( renderer.backend.isWebGPUBackend ) {
|
|
322
|
+
|
|
323
|
+
// use built-in WGSL functions for WebGPU
|
|
324
|
+
|
|
325
|
+
return super.setup( builder );
|
|
326
|
+
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const inputType = this.getInputType( builder );
|
|
330
|
+
const elementType = builder.getElementType( inputType );
|
|
331
|
+
|
|
332
|
+
const typeLength = builder.getTypeLength( inputType );
|
|
333
|
+
|
|
334
|
+
const baseMethod = `${method}_base_${elementType}`;
|
|
335
|
+
const newMethod = `${method}_${inputType}`;
|
|
336
|
+
|
|
337
|
+
let baseFn = registeredBitcountFunctions[ baseMethod ];
|
|
338
|
+
|
|
339
|
+
if ( baseFn === undefined ) {
|
|
340
|
+
|
|
341
|
+
switch ( method ) {
|
|
342
|
+
|
|
343
|
+
case BitcountNode.COUNT_LEADING_ZEROS: {
|
|
344
|
+
|
|
345
|
+
baseFn = this._createLeadingZerosBaseLayout( baseMethod, elementType );
|
|
346
|
+
break;
|
|
347
|
+
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
case BitcountNode.COUNT_TRAILING_ZEROS: {
|
|
351
|
+
|
|
352
|
+
baseFn = this._createTrailingZerosBaseLayout( baseMethod, elementType );
|
|
353
|
+
break;
|
|
354
|
+
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
case BitcountNode.COUNT_ONE_BITS: {
|
|
358
|
+
|
|
359
|
+
baseFn = this._createOneBitsBaseLayout( baseMethod, elementType );
|
|
360
|
+
break;
|
|
361
|
+
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
registeredBitcountFunctions[ baseMethod ] = baseFn;
|
|
367
|
+
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
let fn = registeredBitcountFunctions[ newMethod ];
|
|
371
|
+
|
|
372
|
+
if ( fn === undefined ) {
|
|
373
|
+
|
|
374
|
+
fn = this._createMainLayout( newMethod, inputType, typeLength, baseFn );
|
|
375
|
+
registeredBitcountFunctions[ newMethod ] = fn;
|
|
376
|
+
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const output = Fn( () => {
|
|
380
|
+
|
|
381
|
+
return fn(
|
|
382
|
+
aNode,
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
} );
|
|
386
|
+
|
|
387
|
+
return output();
|
|
388
|
+
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
export default BitcountNode;
|
|
394
|
+
|
|
395
|
+
BitcountNode.COUNT_TRAILING_ZEROS = 'countTrailingZeros';
|
|
396
|
+
BitcountNode.COUNT_LEADING_ZEROS = 'countLeadingZeros';
|
|
397
|
+
BitcountNode.COUNT_ONE_BITS = 'countOneBits';
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Finds the number of consecutive 0 bits from the least significant bit of the input value,
|
|
401
|
+
* which is also the index of the least significant bit of the input value.
|
|
402
|
+
*
|
|
403
|
+
* Can only be used with {@link WebGPURenderer} and a WebGPU backend.
|
|
404
|
+
*
|
|
405
|
+
* @tsl
|
|
406
|
+
* @function
|
|
407
|
+
* @param {Node | number} x - The input value.
|
|
408
|
+
* @returns {Node}
|
|
409
|
+
*/
|
|
410
|
+
export const countTrailingZeros = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_TRAILING_ZEROS ).setParameterLength( 1 );
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Finds the number of consecutive 0 bits starting from the most significant bit of the input value.
|
|
414
|
+
*
|
|
415
|
+
* Can only be used with {@link WebGPURenderer} and a WebGPU backend.
|
|
416
|
+
*
|
|
417
|
+
* @tsl
|
|
418
|
+
* @function
|
|
419
|
+
* @param {Node | number} x - The input value.
|
|
420
|
+
* @returns {Node}
|
|
421
|
+
*/
|
|
422
|
+
export const countLeadingZeros = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_LEADING_ZEROS ).setParameterLength( 1 );
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Finds the number of '1' bits set in the input value
|
|
426
|
+
*
|
|
427
|
+
* Can only be used with {@link WebGPURenderer} and a WebGPU backend.
|
|
428
|
+
*
|
|
429
|
+
* @tsl
|
|
430
|
+
* @function
|
|
431
|
+
* @returns {Node}
|
|
432
|
+
*/
|
|
433
|
+
export const countOneBits = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_ONE_BITS ).setParameterLength( 1 );
|
|
@@ -66,7 +66,7 @@ class ConditionalNode extends Node {
|
|
|
66
66
|
* @param {NodeBuilder} builder - The current node builder.
|
|
67
67
|
* @return {string} The node type.
|
|
68
68
|
*/
|
|
69
|
-
|
|
69
|
+
generateNodeType( builder ) {
|
|
70
70
|
|
|
71
71
|
const { ifNode, elseNode } = builder.getNodeProperties( this );
|
|
72
72
|
|
|
@@ -174,7 +174,7 @@ class ConditionalNode extends Node {
|
|
|
174
174
|
|
|
175
175
|
if ( functionNode === null ) {
|
|
176
176
|
|
|
177
|
-
warn( 'TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.' );
|
|
177
|
+
warn( 'TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.', this.stackTrace );
|
|
178
178
|
|
|
179
179
|
ifSnippet = '// ' + ifSnippet;
|
|
180
180
|
|
|
@@ -204,7 +204,7 @@ class ConditionalNode extends Node {
|
|
|
204
204
|
|
|
205
205
|
if ( functionNode === null ) {
|
|
206
206
|
|
|
207
|
-
warn( 'TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.' );
|
|
207
|
+
warn( 'TSL: Return statement used in an inline \'Fn()\'. Define a layout struct to allow return values.', this.stackTrace );
|
|
208
208
|
|
|
209
209
|
elseSnippet = '// ' + elseSnippet;
|
|
210
210
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import TempNode from '../core/TempNode.js';
|
|
2
|
-
import { sub, mul, div, mod
|
|
2
|
+
import { sub, mul, div, mod } from './OperatorNode.js';
|
|
3
3
|
import { addMethodChaining, nodeObject, nodeProxyIntent, float, vec2, vec3, vec4, Fn } from '../tsl/TSLCore.js';
|
|
4
4
|
import { WebGLCoordinateSystem, WebGPUCoordinateSystem } from '../../constants.js';
|
|
5
5
|
import { warn } from '../../utils.js';
|
|
@@ -133,7 +133,7 @@ class MathNode extends TempNode {
|
|
|
133
133
|
* @param {NodeBuilder} builder - The current node builder.
|
|
134
134
|
* @return {string} The node type.
|
|
135
135
|
*/
|
|
136
|
-
|
|
136
|
+
generateNodeType( builder ) {
|
|
137
137
|
|
|
138
138
|
const method = this.method;
|
|
139
139
|
|
|
@@ -291,7 +291,7 @@ class MathNode extends TempNode {
|
|
|
291
291
|
|
|
292
292
|
if ( builder.shaderStage !== 'fragment' && ( method === MathNode.DFDX || method === MathNode.DFDY ) ) {
|
|
293
293
|
|
|
294
|
-
warn( `TSL: '${ method }' is not supported in the ${ builder.shaderStage } stage
|
|
294
|
+
warn( `TSL: '${ method }' is not supported in the ${ builder.shaderStage } stage.`, this.stackTrace );
|
|
295
295
|
|
|
296
296
|
method = '/*' + method + '*/';
|
|
297
297
|
|
|
@@ -345,11 +345,17 @@ MathNode.CEIL = 'ceil';
|
|
|
345
345
|
MathNode.NORMALIZE = 'normalize';
|
|
346
346
|
MathNode.FRACT = 'fract';
|
|
347
347
|
MathNode.SIN = 'sin';
|
|
348
|
+
MathNode.SINH = 'sinh';
|
|
348
349
|
MathNode.COS = 'cos';
|
|
350
|
+
MathNode.COSH = 'cosh';
|
|
349
351
|
MathNode.TAN = 'tan';
|
|
352
|
+
MathNode.TANH = 'tanh';
|
|
350
353
|
MathNode.ASIN = 'asin';
|
|
354
|
+
MathNode.ASINH = 'asinh';
|
|
351
355
|
MathNode.ACOS = 'acos';
|
|
356
|
+
MathNode.ACOSH = 'acosh';
|
|
352
357
|
MathNode.ATAN = 'atan';
|
|
358
|
+
MathNode.ATANH = 'atanh';
|
|
353
359
|
MathNode.ABS = 'abs';
|
|
354
360
|
MathNode.SIGN = 'sign';
|
|
355
361
|
MathNode.LENGTH = 'length';
|
|
@@ -590,6 +596,16 @@ export const fract = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.FRACT ).s
|
|
|
590
596
|
*/
|
|
591
597
|
export const sin = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.SIN ).setParameterLength( 1 );
|
|
592
598
|
|
|
599
|
+
/**
|
|
600
|
+
* Returns the hyperbolic sine of the parameter.
|
|
601
|
+
*
|
|
602
|
+
* @tsl
|
|
603
|
+
* @function
|
|
604
|
+
* @param {Node | number} x - The parameter.
|
|
605
|
+
* @returns {Node}
|
|
606
|
+
*/
|
|
607
|
+
export const sinh = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.SINH ).setParameterLength( 1 );
|
|
608
|
+
|
|
593
609
|
/**
|
|
594
610
|
* Returns the cosine of the parameter.
|
|
595
611
|
*
|
|
@@ -600,6 +616,16 @@ export const sin = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.SIN ).setPa
|
|
|
600
616
|
*/
|
|
601
617
|
export const cos = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.COS ).setParameterLength( 1 );
|
|
602
618
|
|
|
619
|
+
/**
|
|
620
|
+
* Returns the hyperbolic cosine of the parameter.
|
|
621
|
+
*
|
|
622
|
+
* @tsl
|
|
623
|
+
* @function
|
|
624
|
+
* @param {Node | number} x - The parameter.
|
|
625
|
+
* @returns {Node}
|
|
626
|
+
*/
|
|
627
|
+
export const cosh = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.COSH ).setParameterLength( 1 );
|
|
628
|
+
|
|
603
629
|
/**
|
|
604
630
|
* Returns the tangent of the parameter.
|
|
605
631
|
*
|
|
@@ -610,6 +636,16 @@ export const cos = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.COS ).setPa
|
|
|
610
636
|
*/
|
|
611
637
|
export const tan = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.TAN ).setParameterLength( 1 );
|
|
612
638
|
|
|
639
|
+
/**
|
|
640
|
+
* Returns the hyperbolic tangent of the parameter.
|
|
641
|
+
*
|
|
642
|
+
* @tsl
|
|
643
|
+
* @function
|
|
644
|
+
* @param {Node | number} x - The parameter.
|
|
645
|
+
* @returns {Node}
|
|
646
|
+
*/
|
|
647
|
+
export const tanh = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.TANH ).setParameterLength( 1 );
|
|
648
|
+
|
|
613
649
|
/**
|
|
614
650
|
* Returns the arcsine of the parameter.
|
|
615
651
|
*
|
|
@@ -620,6 +656,16 @@ export const tan = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.TAN ).setPa
|
|
|
620
656
|
*/
|
|
621
657
|
export const asin = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ASIN ).setParameterLength( 1 );
|
|
622
658
|
|
|
659
|
+
/**
|
|
660
|
+
* Returns the inverse hyperbolic sine of the parameter.
|
|
661
|
+
*
|
|
662
|
+
* @tsl
|
|
663
|
+
* @function
|
|
664
|
+
* @param {Node | number} x - The parameter.
|
|
665
|
+
* @returns {Node}
|
|
666
|
+
*/
|
|
667
|
+
export const asinh = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ASINH ).setParameterLength( 1 );
|
|
668
|
+
|
|
623
669
|
/**
|
|
624
670
|
* Returns the arccosine of the parameter.
|
|
625
671
|
*
|
|
@@ -630,6 +676,16 @@ export const asin = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ASIN ).set
|
|
|
630
676
|
*/
|
|
631
677
|
export const acos = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ACOS ).setParameterLength( 1 );
|
|
632
678
|
|
|
679
|
+
/**
|
|
680
|
+
* Returns the inverse hyperbolic cosine of the parameter.
|
|
681
|
+
*
|
|
682
|
+
* @tsl
|
|
683
|
+
* @function
|
|
684
|
+
* @param {Node | number} x - The parameter.
|
|
685
|
+
* @returns {Node}
|
|
686
|
+
*/
|
|
687
|
+
export const acosh = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ACOSH ).setParameterLength( 1 );
|
|
688
|
+
|
|
633
689
|
/**
|
|
634
690
|
* Returns the arc-tangent of the parameter.
|
|
635
691
|
* If two parameters are provided, the result is `atan2(y/x)`.
|
|
@@ -642,6 +698,16 @@ export const acos = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ACOS ).set
|
|
|
642
698
|
*/
|
|
643
699
|
export const atan = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ATAN ).setParameterLength( 1, 2 );
|
|
644
700
|
|
|
701
|
+
/**
|
|
702
|
+
* Returns the inverse hyperbolic tangent of the parameter.
|
|
703
|
+
*
|
|
704
|
+
* @tsl
|
|
705
|
+
* @function
|
|
706
|
+
* @param {Node | number} x - The parameter.
|
|
707
|
+
* @returns {Node}
|
|
708
|
+
*/
|
|
709
|
+
export const atanh = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ATANH ).setParameterLength( 1 );
|
|
710
|
+
|
|
645
711
|
/**
|
|
646
712
|
* Returns the absolute value of the parameter.
|
|
647
713
|
*
|
|
@@ -784,23 +850,6 @@ export const inverse = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.INVERSE
|
|
|
784
850
|
|
|
785
851
|
// 2 inputs
|
|
786
852
|
|
|
787
|
-
/**
|
|
788
|
-
* Returns `true` if `x` equals `y`.
|
|
789
|
-
*
|
|
790
|
-
* @tsl
|
|
791
|
-
* @function
|
|
792
|
-
* @param {Node | number} x - The first parameter.
|
|
793
|
-
* @param {Node | number} y - The second parameter.
|
|
794
|
-
* @deprecated since r175. Use {@link equal} instead.
|
|
795
|
-
* @returns {Node<bool>}
|
|
796
|
-
*/
|
|
797
|
-
export const equals = ( x, y ) => { // @deprecated, r172
|
|
798
|
-
|
|
799
|
-
warn( 'TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"' );
|
|
800
|
-
return equal( x, y );
|
|
801
|
-
|
|
802
|
-
};
|
|
803
|
-
|
|
804
853
|
/**
|
|
805
854
|
* Returns the least of the given values.
|
|
806
855
|
*
|
|
@@ -981,7 +1030,7 @@ export const mix = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.MIX ).setPa
|
|
|
981
1030
|
* @param {Node | number} [high=1] - The upper bound.
|
|
982
1031
|
* @returns {Node}
|
|
983
1032
|
*/
|
|
984
|
-
export const clamp = ( value, low = 0, high = 1 ) =>
|
|
1033
|
+
export const clamp = ( value, low = 0, high = 1 ) => new MathNode( MathNode.CLAMP, nodeObject( value ), nodeObject( low ), nodeObject( high ) );
|
|
985
1034
|
|
|
986
1035
|
/**
|
|
987
1036
|
* Constrains a value between `0` and `1`.
|
|
@@ -1081,24 +1130,6 @@ export const smoothstepElement = ( x, low, high ) => smoothstep( low, high, x );
|
|
|
1081
1130
|
*/
|
|
1082
1131
|
export const stepElement = ( x, edge ) => step( edge, x );
|
|
1083
1132
|
|
|
1084
|
-
/**
|
|
1085
|
-
* Returns the arc-tangent of the quotient of its parameters.
|
|
1086
|
-
*
|
|
1087
|
-
* @tsl
|
|
1088
|
-
* @function
|
|
1089
|
-
* @deprecated since r172. Use {@link atan} instead.
|
|
1090
|
-
*
|
|
1091
|
-
* @param {Node | number} y - The y parameter.
|
|
1092
|
-
* @param {Node | number} x - The x parameter.
|
|
1093
|
-
* @returns {Node}
|
|
1094
|
-
*/
|
|
1095
|
-
export const atan2 = ( y, x ) => { // @deprecated, r172
|
|
1096
|
-
|
|
1097
|
-
warn( 'TSL: "atan2" is overloaded. Use "atan" instead.' );
|
|
1098
|
-
return atan( y, x );
|
|
1099
|
-
|
|
1100
|
-
};
|
|
1101
|
-
|
|
1102
1133
|
// GLSL alias function
|
|
1103
1134
|
|
|
1104
1135
|
export const faceforward = faceForward;
|
|
@@ -1108,7 +1139,6 @@ export const inversesqrt = inverseSqrt;
|
|
|
1108
1139
|
|
|
1109
1140
|
addMethodChaining( 'all', all );
|
|
1110
1141
|
addMethodChaining( 'any', any );
|
|
1111
|
-
addMethodChaining( 'equals', equals );
|
|
1112
1142
|
|
|
1113
1143
|
addMethodChaining( 'radians', radians );
|
|
1114
1144
|
addMethodChaining( 'degrees', degrees );
|
|
@@ -1123,11 +1153,17 @@ addMethodChaining( 'ceil', ceil );
|
|
|
1123
1153
|
addMethodChaining( 'normalize', normalize );
|
|
1124
1154
|
addMethodChaining( 'fract', fract );
|
|
1125
1155
|
addMethodChaining( 'sin', sin );
|
|
1156
|
+
addMethodChaining( 'sinh', sinh );
|
|
1126
1157
|
addMethodChaining( 'cos', cos );
|
|
1158
|
+
addMethodChaining( 'cosh', cosh );
|
|
1127
1159
|
addMethodChaining( 'tan', tan );
|
|
1160
|
+
addMethodChaining( 'tanh', tanh );
|
|
1128
1161
|
addMethodChaining( 'asin', asin );
|
|
1162
|
+
addMethodChaining( 'asinh', asinh );
|
|
1129
1163
|
addMethodChaining( 'acos', acos );
|
|
1164
|
+
addMethodChaining( 'acosh', acosh );
|
|
1130
1165
|
addMethodChaining( 'atan', atan );
|
|
1166
|
+
addMethodChaining( 'atanh', atanh );
|
|
1131
1167
|
addMethodChaining( 'abs', abs );
|
|
1132
1168
|
addMethodChaining( 'sign', sign );
|
|
1133
1169
|
addMethodChaining( 'length', length );
|
|
@@ -1140,7 +1176,6 @@ addMethodChaining( 'round', round );
|
|
|
1140
1176
|
addMethodChaining( 'reciprocal', reciprocal );
|
|
1141
1177
|
addMethodChaining( 'trunc', trunc );
|
|
1142
1178
|
addMethodChaining( 'fwidth', fwidth );
|
|
1143
|
-
addMethodChaining( 'atan2', atan2 );
|
|
1144
1179
|
addMethodChaining( 'min', min );
|
|
1145
1180
|
addMethodChaining( 'max', max );
|
|
1146
1181
|
addMethodChaining( 'step', stepElement );
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { WebGLCoordinateSystem } from '../../constants.js';
|
|
2
2
|
import TempNode from '../core/TempNode.js';
|
|
3
|
+
import StackTrace from '../core/StackTrace.js';
|
|
3
4
|
import { addMethodChaining, Fn, int, nodeProxyIntent } from '../tsl/TSLCore.js';
|
|
4
5
|
import { warn } from '../../utils.js';
|
|
5
6
|
|
|
@@ -107,7 +108,7 @@ class OperatorNode extends TempNode {
|
|
|
107
108
|
* @param {?string} [output=null] - The output type.
|
|
108
109
|
* @return {string} The node type.
|
|
109
110
|
*/
|
|
110
|
-
|
|
111
|
+
generateNodeType( builder, output = null ) {
|
|
111
112
|
|
|
112
113
|
const op = this.op;
|
|
113
114
|
|
|
@@ -743,7 +744,7 @@ addMethodChaining( 'decrement', decrement );
|
|
|
743
744
|
*/
|
|
744
745
|
export const modInt = ( a, b ) => { // @deprecated, r175
|
|
745
746
|
|
|
746
|
-
warn( 'TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.' );
|
|
747
|
+
warn( 'TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.', new StackTrace() );
|
|
747
748
|
return mod( int( a ), int( b ) );
|
|
748
749
|
|
|
749
750
|
};
|