@unikia/upe-renderer 0.186.110 → 0.187.11
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 +5 -7
- package/UPSTREAM.md +4 -4
- package/build/three.core.js +853 -277
- package/build/three.module.js +1098 -1280
- package/build/three.tsl.js +41938 -686
- package/build/three.webgpu.js +10604 -49055
- package/build/three.webgpu.nodes.js +9249 -5788
- package/examples/jsm/Addons.js +2 -0
- package/examples/jsm/animation/CCDIKSolver.js +17 -5
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +27 -14
- package/examples/jsm/csm/CSMShader.js +74 -3
- package/examples/jsm/curves/CurveExtras.js +4 -4
- package/examples/jsm/curves/NURBSCurve.js +14 -0
- package/examples/jsm/exporters/EXRExporter.js +673 -16
- package/examples/jsm/exporters/GLTFExporter.js +4 -4
- package/examples/jsm/exporters/KTX2Exporter.js +1 -1
- package/examples/jsm/exporters/OBJExporter.js +48 -5
- package/examples/jsm/exporters/PLYExporter.js +22 -11
- package/examples/jsm/generators/CityGenerator.js +3 -2
- package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
- package/examples/jsm/gpgpu/BitonicSort.js +30 -23
- package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
- package/examples/jsm/inspector/Extension.js +1 -1
- package/examples/jsm/inspector/Inspector.js +6 -46
- package/examples/jsm/inspector/RendererInspector.js +43 -8
- package/examples/jsm/inspector/Storage.js +49 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
- package/examples/jsm/inspector/tabs/Parameters.js +5 -1
- package/examples/jsm/inspector/tabs/Performance.js +22 -7
- package/examples/jsm/inspector/tabs/Settings.js +1 -1
- package/examples/jsm/inspector/tabs/Timeline.js +83 -7
- package/examples/jsm/inspector/tabs/Viewer.js +25 -10
- package/examples/jsm/inspector/ui/Profiler.js +1 -1
- package/examples/jsm/inspector/ui/Style.js +21 -53
- package/examples/jsm/inspector/ui/Values.js +28 -3
- package/examples/jsm/libs/fflate.module.js +83 -56
- package/examples/jsm/libs/mikktspace.README.md +27 -0
- package/examples/jsm/libs/mikktspace.module.js +721 -109
- package/examples/jsm/lighting/ClusteredLighting.js +100 -2
- package/examples/jsm/lighting/LightMapper.js +295 -0
- package/examples/jsm/lighting/LightProbeGrid.js +242 -139
- package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
- package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
- package/examples/jsm/lights/SunLight.js +9 -4
- package/examples/jsm/lights/SunLightNode.js +3 -3
- package/examples/jsm/lines/LineMaterial.js +26 -10
- package/examples/jsm/loaders/3DMLoader.js +10 -1
- package/examples/jsm/loaders/3MFLoader.js +5 -1
- package/examples/jsm/loaders/AMFLoader.js +2 -0
- package/examples/jsm/loaders/BVHLoader.js +2 -0
- package/examples/jsm/loaders/ColladaLoader.js +8 -0
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +5 -1
- package/examples/jsm/loaders/EXRLoader.js +120 -104
- package/examples/jsm/loaders/FBXLoader.js +4 -0
- package/examples/jsm/loaders/FontLoader.js +2 -0
- package/examples/jsm/loaders/GCodeLoader.js +5 -9
- package/examples/jsm/loaders/GLTFLoader.js +112 -31
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
- package/examples/jsm/loaders/IESLoader.js +46 -12
- package/examples/jsm/loaders/JXLLoader.js +159 -0
- package/examples/jsm/loaders/KMZLoader.js +6 -0
- package/examples/jsm/loaders/KSPLATLoader.js +2 -0
- package/examples/jsm/loaders/KTX2Loader.js +49 -4
- package/examples/jsm/loaders/KTXLoader.js +5 -3
- package/examples/jsm/loaders/LDrawLoader.js +15 -22
- package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
- package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
- package/examples/jsm/loaders/LUTImageLoader.js +2 -0
- package/examples/jsm/loaders/LWOLoader.js +6 -0
- package/examples/jsm/loaders/MD2Loader.js +2 -0
- package/examples/jsm/loaders/MDDLoader.js +4 -0
- package/examples/jsm/loaders/MTLLoader.js +8 -0
- package/examples/jsm/loaders/MaterialXLoader.js +57 -5
- package/examples/jsm/loaders/NRRDLoader.js +4 -2
- package/examples/jsm/loaders/OBJLoader.js +10 -4
- package/examples/jsm/loaders/PCDLoader.js +6 -2
- package/examples/jsm/loaders/PDBLoader.js +5 -3
- package/examples/jsm/loaders/PLYLoader.js +39 -15
- package/examples/jsm/loaders/PVRLoader.js +2 -2
- package/examples/jsm/loaders/SPLATLoader.js +2 -0
- package/examples/jsm/loaders/SPZLoader.js +2 -0
- package/examples/jsm/loaders/STLLoader.js +3 -1
- package/examples/jsm/loaders/SVGLoader.js +27 -49
- package/examples/jsm/loaders/TDSLoader.js +4 -0
- package/examples/jsm/loaders/TGALoader.js +6 -5
- package/examples/jsm/loaders/TTFLoader.js +2 -0
- package/examples/jsm/loaders/USDLoader.js +14 -0
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
- package/examples/jsm/loaders/VOXLoader.js +3 -0
- package/examples/jsm/loaders/VRMLLoader.js +4 -0
- package/examples/jsm/loaders/VTKLoader.js +2 -0
- package/examples/jsm/loaders/XYZLoader.js +2 -0
- package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
- package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
- package/examples/jsm/loaders/usd/USDAParser.js +56 -47
- package/examples/jsm/loaders/usd/USDComposer.js +25 -30
- package/examples/jsm/math/ColorConverter.js +7 -3
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/OBB.js +3 -3
- package/examples/jsm/math/Octree.js +20 -17
- package/examples/jsm/objects/GaussianSplat.js +5 -4
- package/examples/jsm/objects/Reflector.js +5 -0
- package/examples/jsm/objects/SkyMesh.js +14 -7
- package/examples/jsm/objects/Water2Mesh.js +2 -2
- package/examples/jsm/physics/RapierPhysics.js +2 -2
- package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
- package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
- package/examples/jsm/postprocessing/BokehPass.js +1 -1
- package/examples/jsm/postprocessing/GTAOPass.js +26 -18
- package/examples/jsm/renderers/SVGRenderer.js +3 -2
- package/examples/jsm/shaders/GTAOShader.js +7 -4
- package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
- package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
- package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
- package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
- package/examples/jsm/tsl/display/BloomNode.js +3 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
- package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
- package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
- package/examples/jsm/tsl/display/FSR1Node.js +3 -3
- package/examples/jsm/tsl/display/FXAANode.js +3 -10
- package/examples/jsm/tsl/display/FilmNode.js +3 -3
- package/examples/jsm/tsl/display/GTAONode.js +33 -25
- package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
- package/examples/jsm/tsl/display/GodraysNode.js +5 -19
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
- package/examples/jsm/tsl/display/LensflareNode.js +3 -3
- package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
- package/examples/jsm/tsl/display/OITPassNode.js +0 -11
- package/examples/jsm/tsl/display/OutlineNode.js +107 -5
- package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
- package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
- package/examples/jsm/tsl/display/SMAANode.js +3 -3
- package/examples/jsm/tsl/display/SSAONode.js +6 -20
- package/examples/jsm/tsl/display/SSGINode.js +36 -29
- package/examples/jsm/tsl/display/SSRNode.js +135 -63
- package/examples/jsm/tsl/display/SSSNode.js +6 -20
- package/examples/jsm/tsl/display/SharpenNode.js +3 -3
- package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
- package/examples/jsm/tsl/display/TAAUNode.js +10 -42
- package/examples/jsm/tsl/display/TRAANode.js +11 -43
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
- package/examples/jsm/tsl/display/TransitionNode.js +3 -3
- package/examples/jsm/tsl/display/lensDirt.js +30 -0
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
- package/examples/jsm/tsl/utils/Raymarching.js +1 -1
- package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
- package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
- package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
- package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
- package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
- package/examples/jsm/utils/SceneOptimizer.js +2 -1
- package/examples/jsm/utils/SceneUtils.js +1 -1
- package/examples/jsm/utils/unwrapUVs.js +865 -0
- package/examples/jsm/webxr/XREstimatedLight.js +11 -4
- package/package.json +3 -3
- package/src/Three.TSL.js +2 -683
- package/src/Three.WebGPU.Nodes.js +2 -1
- package/src/Three.WebGPU.js +2 -1
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationUtils.js +1 -3
- package/src/animation/KeyframeTrack.js +19 -0
- package/src/cameras/ArrayCamera.js +12 -0
- package/src/cameras/CubeCamera.js +3 -3
- package/src/constants.js +1 -9
- package/src/core/BufferAttribute.js +57 -21
- package/src/core/BufferGeometry.js +5 -13
- package/src/core/Clock.js +1 -1
- package/src/core/InterleavedBuffer.js +28 -18
- package/src/core/InterleavedBufferAttribute.js +54 -20
- package/src/core/Object3D.js +19 -9
- package/src/core/Raycaster.js +2 -0
- package/src/core/RenderTarget.js +11 -5
- package/src/core/UniformsGroup.js +7 -3
- package/src/extras/PMREMGenerator.js +392 -685
- package/src/extras/core/Curve.js +4 -0
- package/src/extras/core/CurvePath.js +13 -0
- package/src/extras/core/ShapePath.js +1 -1
- package/src/geometries/EdgesGeometry.js +12 -10
- package/src/geometries/LatheGeometry.js +2 -0
- package/src/helpers/PolarGridHelper.js +1 -1
- package/src/lights/Light.js +11 -0
- package/src/lights/LightProbe.js +2 -0
- package/src/lights/LightShadow.js +2 -0
- package/src/loaders/AnimationLoader.js +2 -0
- package/src/loaders/AudioLoader.js +2 -0
- package/src/loaders/BufferGeometryLoader.js +2 -0
- package/src/loaders/CompressedTextureLoader.js +2 -0
- package/src/loaders/CubeTextureLoader.js +2 -0
- package/src/loaders/DataTextureLoader.js +2 -0
- package/src/loaders/FileLoader.js +2 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ImageLoader.js +1 -0
- package/src/loaders/Loader.js +47 -0
- package/src/loaders/MaterialLoader.js +2 -0
- package/src/loaders/ObjectLoader.js +27 -8
- package/src/loaders/TextureLoader.js +5 -3
- package/src/loaders/nodes/NodeLoader.js +2 -0
- package/src/materials/Material.js +21 -2
- package/src/materials/MeshDepthMaterial.js +1 -1
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +1 -1
- package/src/materials/MeshMatcapMaterial.js +1 -1
- package/src/materials/MeshNormalMaterial.js +1 -1
- package/src/materials/MeshPhongMaterial.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +90 -11
- package/src/materials/MeshStandardMaterial.js +1 -1
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/nodes/Line2NodeMaterial.js +32 -10
- package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
- package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
- package/src/materials/nodes/NodeMaterial.js +36 -16
- package/src/materials/nodes/NodeMaterialInstance.js +193 -0
- package/src/materials/nodes/NodeMaterials.js +1 -0
- package/src/materials/nodes/PointsNodeMaterial.js +1 -1
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
- package/src/math/Box3.js +2 -2
- package/src/math/Color.js +8 -8
- package/src/math/ColorManagement.js +2 -21
- package/src/math/FrustumArray.js +12 -0
- package/src/math/Interpolant.js +1 -1
- package/src/math/Line3.js +2 -4
- package/src/math/MathUtils.js +33 -46
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +1 -1
- package/src/math/Matrix4.js +1 -1
- package/src/math/Triangle.js +2 -1
- package/src/math/Vector2.js +1 -1
- package/src/math/Vector3.js +1 -1
- package/src/math/Vector4.js +1 -1
- package/src/nodes/Nodes.js +1 -0
- package/src/nodes/TSL.js +2 -0
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/Batch.js +29 -23
- package/src/nodes/accessors/BufferAttributeNode.js +21 -1
- package/src/nodes/accessors/BuiltinNode.js +6 -0
- package/src/nodes/accessors/Camera.js +100 -93
- package/src/nodes/accessors/ClippingNode.js +17 -6
- package/src/nodes/accessors/CubeTextureNode.js +12 -24
- package/src/nodes/accessors/Instance.js +198 -160
- package/src/nodes/accessors/Lights.js +19 -6
- package/src/nodes/accessors/MaterialNode.js +33 -4
- package/src/nodes/accessors/Morph.js +81 -22
- package/src/nodes/accessors/Normal.js +0 -42
- package/src/nodes/accessors/Object3DNode.js +6 -0
- package/src/nodes/accessors/PointUVNode.js +6 -0
- package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
- package/src/nodes/accessors/ReferenceNode.js +6 -0
- package/src/nodes/accessors/Skinning.js +57 -52
- package/src/nodes/accessors/StorageBufferNode.js +3 -12
- package/src/nodes/accessors/TextureBicubic.js +30 -27
- package/src/nodes/accessors/TextureNode.js +164 -78
- package/src/nodes/accessors/TextureSizeNode.js +6 -0
- package/src/nodes/accessors/UniformArrayNode.js +8 -15
- package/src/nodes/accessors/VelocityNode.js +13 -8
- package/src/nodes/code/CodeNode.js +6 -0
- package/src/nodes/code/ExpressionNode.js +6 -0
- package/src/nodes/code/FunctionCallNode.js +3 -3
- package/src/nodes/code/FunctionNode.js +15 -13
- package/src/nodes/core/ArrayNode.js +3 -3
- package/src/nodes/core/AssignNode.js +10 -9
- package/src/nodes/core/AttributeNode.js +39 -0
- package/src/nodes/core/BypassNode.js +6 -0
- package/src/nodes/core/ConstNode.js +31 -1
- package/src/nodes/core/ContextNode.js +11 -6
- package/src/nodes/core/IndexNode.js +6 -0
- package/src/nodes/core/InputNode.js +6 -0
- package/src/nodes/core/InspectorNode.js +17 -31
- package/src/nodes/core/IsolateNode.js +8 -0
- package/src/nodes/core/Node.js +367 -67
- package/src/nodes/core/NodeBuilder.js +664 -222
- package/src/nodes/core/NodeUtils.js +25 -0
- package/src/nodes/core/NodeVar.js +10 -1
- package/src/nodes/core/OutputStructNode.js +6 -0
- package/src/nodes/core/OverrideContextNode.js +38 -37
- package/src/nodes/core/PropertyNode.js +14 -0
- package/src/nodes/core/StackNode.js +33 -21
- package/src/nodes/core/StructNode.js +6 -0
- package/src/nodes/core/StructTypeNode.js +6 -0
- package/src/nodes/core/SubBuildNode.js +8 -0
- package/src/nodes/core/TempNode.js +10 -35
- package/src/nodes/core/UniformGroupNode.js +6 -0
- package/src/nodes/core/VarNode.js +43 -135
- package/src/nodes/core/VaryingNode.js +33 -2
- package/src/nodes/display/BlendModes.js +5 -40
- package/src/nodes/display/BumpMapNode.js +17 -7
- package/src/nodes/display/ColorAdjustment.js +22 -10
- package/src/nodes/display/ColorSpaceFunctions.js +2 -14
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +6 -0
- package/src/nodes/display/NormalMapNode.js +3 -3
- package/src/nodes/display/PassNode.js +75 -16
- package/src/nodes/display/RenderOutputNode.js +22 -5
- package/src/nodes/display/ScreenNode.js +6 -0
- package/src/nodes/display/ToneMappingFunctions.js +9 -51
- package/src/nodes/display/ToneMappingNode.js +3 -3
- package/src/nodes/display/ToonOutlinePassNode.js +66 -2
- package/src/nodes/display/ViewportDepthNode.js +34 -4
- package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
- package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
- package/src/nodes/functions/BSDF/D_GGX.js +1 -8
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
- package/src/nodes/functions/BSDF/LTC.js +20 -47
- package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
- package/src/nodes/functions/PhysicalLightingModel.js +84 -51
- package/src/nodes/functions/VolumetricLightingModel.js +1 -1
- package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
- package/src/nodes/functions/material/getRoughness.js +3 -1
- package/src/nodes/geometry/RangeNode.js +52 -69
- package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
- package/src/nodes/gpgpu/BarrierNode.js +6 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
- package/src/nodes/gpgpu/ComputeNode.js +6 -0
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
- package/src/nodes/lighting/AnalyticLightNode.js +7 -14
- package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
- package/src/nodes/lighting/EnvironmentNode.js +58 -8
- package/src/nodes/lighting/IESSpotLightNode.js +19 -4
- package/src/nodes/lighting/LightProbeNode.js +2 -1
- package/src/nodes/lighting/LightUtils.js +2 -2
- package/src/nodes/lighting/LightingNode.js +6 -0
- package/src/nodes/lighting/LightsNode.js +26 -32
- package/src/nodes/lighting/PointShadowNode.js +92 -48
- package/src/nodes/lighting/ProjectorLightNode.js +1 -1
- package/src/nodes/lighting/RectAreaLightNode.js +13 -14
- package/src/nodes/lighting/ShadowBaseNode.js +9 -17
- package/src/nodes/lighting/ShadowFilterNode.js +26 -3
- package/src/nodes/lighting/ShadowNode.js +13 -11
- package/src/nodes/materialx/MaterialXColor.js +2 -14
- package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
- package/src/nodes/materialx/MaterialXNodes.js +8 -11
- package/src/nodes/materialx/MaterialXNoise.js +195 -454
- package/src/nodes/math/BitcastNode.js +5 -5
- package/src/nodes/math/BitcountNode.js +18 -46
- package/src/nodes/math/ConditionalNode.js +92 -22
- package/src/nodes/math/Hash.js +1 -1
- package/src/nodes/math/MathNode.js +86 -64
- package/src/nodes/math/MathUtils.js +2 -2
- package/src/nodes/math/OperatorNode.js +42 -59
- package/src/nodes/math/PackFloatNode.js +9 -9
- package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
- package/src/nodes/math/TriNoise3D.js +3 -23
- package/src/nodes/math/UnpackFloatNode.js +9 -9
- package/src/nodes/pmrem/PMREMNode.js +38 -75
- package/src/nodes/pmrem/PMREMUtils.js +108 -272
- package/src/nodes/procedural/Checker.js +1 -1
- package/src/nodes/tsl/TSLCore.js +199 -74
- package/src/nodes/utils/ArrayElementNode.js +19 -1
- package/src/nodes/utils/CubeMapNode.js +3 -3
- package/src/nodes/utils/DebugNode.js +2 -2
- package/src/nodes/utils/EventNode.js +6 -0
- package/src/nodes/utils/FlipNode.js +3 -3
- package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +14 -9
- package/src/nodes/utils/MemberNode.js +18 -0
- package/src/nodes/utils/PostProcessingUtils.js +20 -25
- package/src/nodes/utils/RTTNode.js +2 -0
- package/src/nodes/utils/ReflectorNode.js +24 -0
- package/src/nodes/utils/RotateNode.js +3 -3
- package/src/nodes/utils/SampleNode.js +6 -0
- package/src/nodes/utils/SetNode.js +3 -3
- package/src/nodes/utils/SplitNode.js +6 -0
- package/src/nodes/utils/UVUtils.js +2 -2
- package/src/objects/BatchedMesh.js +146 -15
- package/src/objects/InstancedMesh.js +12 -4
- package/src/objects/Line.js +20 -0
- package/src/objects/Mesh.js +8 -0
- package/src/objects/Points.js +20 -0
- package/src/objects/Skeleton.js +26 -0
- package/src/objects/SkinnedMesh.js +3 -3
- package/src/objects/Sprite.js +10 -0
- package/src/renderers/WebGLRenderer.js +104 -70
- package/src/renderers/common/Animation.js +5 -1
- package/src/renderers/common/Attributes.js +67 -57
- package/src/renderers/common/Backend.js +78 -3
- package/src/renderers/common/BindGroup.js +11 -0
- package/src/renderers/common/Binding.js +0 -11
- package/src/renderers/common/Bindings.js +116 -10
- package/src/renderers/common/Buffer.js +1 -1
- package/src/renderers/common/ClippingContext.js +12 -1
- package/src/renderers/common/ComputePipeline.js +17 -1
- package/src/renderers/common/DirectRenderPipeline.js +7 -3
- package/src/renderers/common/Geometries.js +170 -132
- package/src/renderers/common/Info.js +1 -1
- package/src/renderers/common/InspectorBase.js +5 -5
- package/src/renderers/common/Lighting.js +59 -0
- package/src/renderers/common/Pipelines.js +26 -12
- package/src/renderers/common/ProgrammableStage.js +1 -17
- package/src/renderers/common/RenderContext.js +21 -0
- package/src/renderers/common/RenderContexts.js +13 -4
- package/src/renderers/common/RenderObject.js +111 -35
- package/src/renderers/common/RenderObjects.js +37 -19
- package/src/renderers/common/Renderer.js +537 -295
- package/src/renderers/common/RendererUtils.js +15 -0
- package/src/renderers/common/StandardDrawingPipeline.js +343 -0
- package/src/renderers/common/Storage3DTexture.js +11 -0
- package/src/renderers/common/StorageArrayTexture.js +10 -0
- package/src/renderers/common/StorageTexture.js +0 -9
- package/src/renderers/common/Textures.js +144 -37
- package/src/renderers/common/UniformsGroup.js +19 -0
- package/src/renderers/common/XRManager.js +10 -91
- package/src/renderers/common/extras/PMREMGenerator.js +298 -576
- package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
- package/src/renderers/common/nodes/NodeLibrary.js +11 -35
- package/src/renderers/common/nodes/NodeManager.js +80 -31
- package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
- package/src/renderers/common/nodes/NodeSampler.js +14 -0
- package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
- package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
- package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
- package/src/renderers/shaders/ShaderChunk.js +0 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
- package/src/renderers/shaders/ShaderLib.js +3 -0
- package/src/renderers/shaders/UniformsLib.js +4 -5
- package/src/renderers/webgl/WebGLBackground.js +3 -3
- package/src/renderers/webgl/WebGLBindingStates.js +4 -2
- package/src/renderers/webgl/WebGLCapabilities.js +7 -1
- package/src/renderers/webgl/WebGLEnvironments.js +2 -2
- package/src/renderers/webgl/WebGLGeometries.js +42 -14
- package/src/renderers/webgl/WebGLMaterials.js +15 -2
- package/src/renderers/webgl/WebGLOutput.js +37 -1
- package/src/renderers/webgl/WebGLProgram.js +13 -54
- package/src/renderers/webgl/WebGLPrograms.js +22 -8
- package/src/renderers/webgl/WebGLRenderStates.js +11 -8
- package/src/renderers/webgl/WebGLShadowMap.js +6 -4
- package/src/renderers/webgl/WebGLState.js +10 -6
- package/src/renderers/webgl/WebGLTextures.js +129 -77
- package/src/renderers/webgl/WebGLUniforms.js +44 -6
- package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
- package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
- package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
- package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
- package/src/renderers/webgpu/WebGPUBackend.js +140 -82
- package/src/renderers/webgpu/WebGPURenderer.js +1 -1
- package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
- package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
- package/src/renderers/webxr/WebXRController.js +3 -3
- package/src/renderers/webxr/WebXRManager.js +5 -90
- package/src/scenes/Scene.js +4 -4
- package/src/textures/CompressedTexture.js +2 -2
- package/src/textures/DepthTexture.js +2 -2
- package/src/textures/FramebufferTexture.js +11 -0
- package/src/textures/Texture.js +29 -1
- package/src/textures/TextureSource.js +1 -1
- package/src/upe.js +1 -1
- package/src/utils.js +4 -4
- package/examples/jsm/libs/surfaceNet.js +0 -201
- package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
|
|
2
2
|
import { vec3, mat4, Fn } from '../tsl/TSLBase.js';
|
|
3
|
-
import { OnAfterObjectUpdate
|
|
3
|
+
import { OnAfterObjectUpdate } from '../utils/EventNode.js';
|
|
4
4
|
import { normalLocal, transformNormal } from './Normal.js';
|
|
5
5
|
import { positionLocal, positionPrevious } from './Position.js';
|
|
6
6
|
import { varyingProperty } from '../core/PropertyNode.js';
|
|
7
7
|
import { instancedBufferAttribute, instancedDynamicBufferAttribute } from './BufferAttributeNode.js';
|
|
8
|
+
import ReferenceAttributeNode, { referenceAttribute } from './ReferenceAttributeNode.js';
|
|
8
9
|
import { buffer } from './BufferNode.js';
|
|
9
10
|
import { storage } from './StorageBufferNode.js';
|
|
10
11
|
import { instanceIndex } from '../core/IndexNode.js';
|
|
11
12
|
|
|
12
|
-
import {
|
|
13
|
-
import { InstancedBufferAttribute } from '../../core/InstancedBufferAttribute.js';
|
|
13
|
+
import { InterleavedBufferAttribute } from '../../core/InterleavedBufferAttribute.js';
|
|
14
14
|
import { DynamicDrawUsage } from '../../constants.js';
|
|
15
15
|
|
|
16
|
-
const _matrixBuffers = /*@__PURE__*/ new WeakMap();
|
|
17
|
-
const _colorBuffers = /*@__PURE__*/ new WeakMap();
|
|
18
16
|
const _previousInstanceMatrices = /*@__PURE__*/ new WeakMap();
|
|
17
|
+
const _previousMatrices = /*@__PURE__*/ new WeakMap();
|
|
18
|
+
|
|
19
|
+
// The default limit of vertex buffers in WebGPU.
|
|
20
|
+
const MAX_VERTEX_BUFFERS = 8;
|
|
19
21
|
|
|
20
22
|
/**
|
|
21
23
|
* The most instance matrices may take in a uniform buffer, in bytes: WebGPU's default limit (64 KB,
|
|
@@ -31,84 +33,6 @@ function instanceUniformLimit( builder ) {
|
|
|
31
33
|
|
|
32
34
|
}
|
|
33
35
|
|
|
34
|
-
/**
|
|
35
|
-
* What of each instance buffer's source is on the GPU: the source version it was last synced from,
|
|
36
|
-
* and how many of its values are current there.
|
|
37
|
-
*
|
|
38
|
-
* @type {WeakMap<Object, {version: number, end: number}>}
|
|
39
|
-
*/
|
|
40
|
-
const _uploaded = /*@__PURE__*/ new WeakMap();
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Brings the GPU copy of an instance attribute (`target`) up to date with `source`, the instanced
|
|
44
|
-
* mesh's own attribute. A change with no update ranges sends only the instances the mesh draws
|
|
45
|
-
* (`count`), not the whole capacity: a culler that refills a prefix every frame sends that prefix.
|
|
46
|
-
* The rest follows when the mesh comes to draw more of them.
|
|
47
|
-
*
|
|
48
|
-
* @param {BufferAttribute|InterleavedBuffer} target - What the GPU reads.
|
|
49
|
-
* @param {BufferAttribute} source - The mesh's attribute.
|
|
50
|
-
* @param {?Object3D} mesh - The instanced mesh, if it is one.
|
|
51
|
-
*/
|
|
52
|
-
function syncInstances( target, source, mesh ) {
|
|
53
|
-
|
|
54
|
-
const length = source.array.length;
|
|
55
|
-
const drawn = mesh !== null && mesh.isInstancedMesh === true ? Math.min( mesh.count, source.count ) * source.itemSize : length;
|
|
56
|
-
|
|
57
|
-
let uploaded = _uploaded.get( target );
|
|
58
|
-
|
|
59
|
-
if ( uploaded === undefined ) {
|
|
60
|
-
|
|
61
|
-
// The first upload of a buffer sends all of it.
|
|
62
|
-
uploaded = { version: target.version, end: length };
|
|
63
|
-
_uploaded.set( target, uploaded );
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if ( uploaded.version !== source.version ) {
|
|
68
|
-
|
|
69
|
-
target.clearUpdateRanges();
|
|
70
|
-
|
|
71
|
-
if ( drawn === 0 && source.updateRanges.length === 0 ) {
|
|
72
|
-
|
|
73
|
-
// Nothing drawn: nothing to send until there is (no update ranges would mean all of it).
|
|
74
|
-
uploaded.version = source.version;
|
|
75
|
-
uploaded.end = 0;
|
|
76
|
-
return;
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if ( source.updateRanges.length > 0 ) {
|
|
81
|
-
|
|
82
|
-
target.updateRanges.push( ...source.updateRanges );
|
|
83
|
-
|
|
84
|
-
} else if ( drawn < length ) {
|
|
85
|
-
|
|
86
|
-
target.addUpdateRange( 0, drawn );
|
|
87
|
-
uploaded.end = drawn;
|
|
88
|
-
|
|
89
|
-
} else {
|
|
90
|
-
|
|
91
|
-
uploaded.end = length;
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
source.clearUpdateRanges(); // the source is never uploaded directly: clear to avoid update range accumulation
|
|
96
|
-
|
|
97
|
-
uploaded.version = source.version;
|
|
98
|
-
target.version ++; // only ever up, so the upload can't be skipped by a version that matches by chance
|
|
99
|
-
|
|
100
|
-
} else if ( uploaded.end < drawn ) {
|
|
101
|
-
|
|
102
|
-
// Drawing more than was sent: send the rest, as it stands now.
|
|
103
|
-
target.clearUpdateRanges();
|
|
104
|
-
target.addUpdateRange( uploaded.end, drawn - uploaded.end );
|
|
105
|
-
uploaded.end = drawn;
|
|
106
|
-
target.version ++;
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
|
|
112
36
|
/**
|
|
113
37
|
* Creates the appropriate node for instanced matrix transformations.
|
|
114
38
|
* Depending on buffer limits and storage capability, returns either a storage, buffer, or instanced interleaved attribute node.
|
|
@@ -142,23 +66,11 @@ function createInstanceMatrixNode( builder, instanceMatrix ) {
|
|
|
142
66
|
|
|
143
67
|
} else {
|
|
144
68
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if ( ! interleaved ) {
|
|
148
|
-
|
|
149
|
-
interleaved = new InstancedInterleavedBuffer( instanceMatrix.array, 16, 1 );
|
|
150
|
-
_matrixBuffers.set( instanceMatrix, interleaved );
|
|
151
|
-
|
|
152
|
-
}
|
|
69
|
+
// the columns view the matrices, so both share the same GPU buffer which is freed via instanceMatrix.dispose()
|
|
153
70
|
|
|
154
71
|
const bufferFn = instanceMatrix.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
|
|
155
72
|
|
|
156
|
-
const instanceBuffers = [
|
|
157
|
-
bufferFn( interleaved, 'vec4', 16, 0 ),
|
|
158
|
-
bufferFn( interleaved, 'vec4', 16, 4 ),
|
|
159
|
-
bufferFn( interleaved, 'vec4', 16, 8 ),
|
|
160
|
-
bufferFn( interleaved, 'vec4', 16, 12 )
|
|
161
|
-
];
|
|
73
|
+
const instanceBuffers = [ 0, 4, 8, 12 ].map( ( offset ) => bufferFn( new InterleavedBufferAttribute( instanceMatrix, 4, offset ) ) );
|
|
162
74
|
|
|
163
75
|
instanceMatrixNode = mat4( ...instanceBuffers );
|
|
164
76
|
|
|
@@ -194,6 +106,8 @@ function getPreviousInstance( instancedMesh, instanceMatrix, builder ) {
|
|
|
194
106
|
|
|
195
107
|
_previousInstanceMatrices.set( instancedMesh, data );
|
|
196
108
|
|
|
109
|
+
instancedMesh.addEventListener( 'dispose', onPreviousInstanceDispose );
|
|
110
|
+
|
|
197
111
|
}
|
|
198
112
|
|
|
199
113
|
return data.node;
|
|
@@ -201,128 +115,218 @@ function getPreviousInstance( instancedMesh, instanceMatrix, builder ) {
|
|
|
201
115
|
}
|
|
202
116
|
|
|
203
117
|
/**
|
|
204
|
-
*
|
|
118
|
+
* Frees the GPU buffer of the previous frame instance matrices when the mesh is disposed.
|
|
119
|
+
* The matrices are kept since the node refers to them, rendering the mesh again re-creates the buffer.
|
|
205
120
|
*
|
|
206
|
-
* @
|
|
121
|
+
* @param {Object} event - The dispose event.
|
|
207
122
|
*/
|
|
208
|
-
|
|
123
|
+
function onPreviousInstanceDispose( { target: object } ) {
|
|
124
|
+
|
|
125
|
+
_previousInstanceMatrices.get( object ).previousInstanceMatrix.dispose();
|
|
126
|
+
|
|
127
|
+
}
|
|
209
128
|
|
|
210
129
|
/**
|
|
211
|
-
*
|
|
212
|
-
* Transforms positionLocal and normalLocal, and assigns varying color in-place.
|
|
130
|
+
* Returns the instance matrices of the previous frame of the given mesh, for motion vectors.
|
|
213
131
|
*
|
|
214
|
-
* @
|
|
215
|
-
* @
|
|
216
|
-
* @param {InstancedBufferAttribute|StorageInstancedBufferAttribute} matrices - The instanced transformation matrices.
|
|
217
|
-
* @param {?InstancedBufferAttribute|StorageInstancedBufferAttribute} [colors=null] - The optional instanced colors.
|
|
132
|
+
* @param {InstancedMesh} object - The instanced mesh.
|
|
133
|
+
* @returns {InstancedBufferAttribute} The matrices of the previous frame.
|
|
218
134
|
*/
|
|
219
|
-
|
|
135
|
+
function getPreviousMatrix( object ) {
|
|
220
136
|
|
|
221
|
-
const
|
|
222
|
-
const isStorageColor = colors && colors.isStorageInstancedBufferAttribute === true;
|
|
137
|
+
const matrices = object.instanceMatrix;
|
|
223
138
|
|
|
224
|
-
|
|
139
|
+
let previous = _previousMatrices.get( object );
|
|
225
140
|
|
|
226
|
-
|
|
227
|
-
let interleavedMatrix = null;
|
|
141
|
+
if ( previous === undefined || previous.count !== matrices.count ) {
|
|
228
142
|
|
|
229
|
-
|
|
143
|
+
if ( previous === undefined ) {
|
|
230
144
|
|
|
231
|
-
|
|
145
|
+
object.addEventListener( 'dispose', onPreviousMatrixDispose );
|
|
232
146
|
|
|
233
|
-
|
|
147
|
+
} else {
|
|
234
148
|
|
|
235
|
-
|
|
149
|
+
previous.dispose();
|
|
236
150
|
|
|
237
151
|
}
|
|
238
152
|
|
|
153
|
+
previous = matrices.clone();
|
|
154
|
+
|
|
155
|
+
_previousMatrices.set( object, previous );
|
|
156
|
+
|
|
239
157
|
}
|
|
240
158
|
|
|
241
|
-
|
|
242
|
-
let interleavedColor = null;
|
|
159
|
+
return previous;
|
|
243
160
|
|
|
244
|
-
|
|
161
|
+
}
|
|
245
162
|
|
|
246
|
-
|
|
163
|
+
/**
|
|
164
|
+
* Disposes the instance matrices of the previous frame when the mesh is disposed.
|
|
165
|
+
*
|
|
166
|
+
* @param {Object} event - The dispose event.
|
|
167
|
+
*/
|
|
168
|
+
function onPreviousMatrixDispose( { target: object } ) {
|
|
247
169
|
|
|
248
|
-
|
|
170
|
+
object.removeEventListener( 'dispose', onPreviousMatrixDispose );
|
|
249
171
|
|
|
250
|
-
|
|
172
|
+
_previousMatrices.get( object ).dispose();
|
|
173
|
+
_previousMatrices.delete( object );
|
|
251
174
|
|
|
252
|
-
|
|
175
|
+
}
|
|
253
176
|
|
|
254
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Binds the instance matrices of the previous frame of the rendered mesh.
|
|
179
|
+
*
|
|
180
|
+
* @private
|
|
181
|
+
* @augments ReferenceAttributeNode
|
|
182
|
+
*/
|
|
183
|
+
class PreviousInstanceMatrixNode extends ReferenceAttributeNode {
|
|
255
184
|
|
|
256
|
-
|
|
257
|
-
_colorBuffers.set( colors, bufferAttribute );
|
|
185
|
+
static get type() {
|
|
258
186
|
|
|
259
|
-
|
|
187
|
+
return 'PreviousInstanceMatrixNode';
|
|
260
188
|
|
|
261
|
-
|
|
189
|
+
}
|
|
262
190
|
|
|
263
|
-
|
|
191
|
+
/**
|
|
192
|
+
* Constructs a new previous instance matrix node.
|
|
193
|
+
*/
|
|
194
|
+
constructor() {
|
|
264
195
|
|
|
265
|
-
|
|
196
|
+
super( 'previousInstanceMatrix', 'mat4' );
|
|
266
197
|
|
|
267
|
-
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Returns the instance matrices of the previous frame of the given mesh.
|
|
202
|
+
*
|
|
203
|
+
* @param {InstancedMesh} object - The instanced mesh.
|
|
204
|
+
* @return {InstancedBufferAttribute} The matrices of the previous frame.
|
|
205
|
+
*/
|
|
206
|
+
getValueFromReference( object ) {
|
|
207
|
+
|
|
208
|
+
return getPreviousMatrix( object );
|
|
268
209
|
|
|
269
210
|
}
|
|
270
211
|
|
|
271
|
-
|
|
272
|
-
if ( interleavedMatrix !== null || interleavedColor !== null ) {
|
|
212
|
+
}
|
|
273
213
|
|
|
274
|
-
|
|
214
|
+
/**
|
|
215
|
+
* Returns `true` if the build can bind the instance data of the rendered mesh, so it can
|
|
216
|
+
* be shared between instanced meshes.
|
|
217
|
+
*
|
|
218
|
+
* @param {InstancedMesh} object - The instanced mesh.
|
|
219
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
220
|
+
* @returns {boolean} Whether the build can bind the instance data of the rendered mesh.
|
|
221
|
+
*/
|
|
222
|
+
function canReferenceInstanceData( object, builder ) {
|
|
275
223
|
|
|
276
|
-
|
|
277
|
-
// same frame, and those have to be sent first.
|
|
278
|
-
OnBeforeObjectUpdate( () => {
|
|
224
|
+
// only render objects bind attributes per object
|
|
279
225
|
|
|
280
|
-
|
|
226
|
+
if ( builder.renderer.isRenderer !== true ) return false;
|
|
281
227
|
|
|
282
|
-
|
|
228
|
+
// the instance data take up to three vertex buffers next to the ones of the geometry
|
|
283
229
|
|
|
284
|
-
|
|
230
|
+
const instanceBuffers = 1 + ( object.instanceColor !== null ? 1 : 0 ) + ( builder.needsPreviousData() ? 1 : 0 );
|
|
285
231
|
|
|
286
|
-
|
|
232
|
+
return Object.keys( object.geometry.attributes ).length + instanceBuffers <= MAX_VERTEX_BUFFERS;
|
|
233
|
+
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Transforms the position, the previous position and the normal with the given instance matrices.
|
|
238
|
+
*
|
|
239
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
240
|
+
* @param {Node<mat4>} instanceMatrixNode - The instance matrix.
|
|
241
|
+
* @param {?Node<mat4>} previousMatrixNode - The instance matrix of the previous frame, if motion vectors are needed.
|
|
242
|
+
*/
|
|
243
|
+
function transformInstance( builder, instanceMatrixNode, previousMatrixNode ) {
|
|
287
244
|
|
|
288
245
|
// POSITION
|
|
289
246
|
|
|
290
247
|
const instancePosition = instanceMatrixNode.mul( positionLocal ).xyz;
|
|
291
248
|
positionLocal.assign( instancePosition );
|
|
292
249
|
|
|
293
|
-
if (
|
|
250
|
+
if ( previousMatrixNode !== null ) {
|
|
294
251
|
|
|
295
|
-
|
|
252
|
+
positionPrevious.assign( previousMatrixNode.mul( positionPrevious ).xyz );
|
|
296
253
|
|
|
297
|
-
|
|
254
|
+
}
|
|
298
255
|
|
|
299
|
-
|
|
256
|
+
// NORMAL
|
|
300
257
|
|
|
301
|
-
|
|
302
|
-
previousInstanceMatrix.version = matrices.version;
|
|
258
|
+
if ( builder.hasGeometryAttribute( 'normal' ) ) {
|
|
303
259
|
|
|
304
|
-
|
|
260
|
+
const instanceNormal = transformNormal( normalLocal, instanceMatrixNode );
|
|
261
|
+
normalLocal.assign( instanceNormal );
|
|
305
262
|
|
|
306
|
-
|
|
263
|
+
}
|
|
307
264
|
|
|
308
|
-
|
|
265
|
+
}
|
|
309
266
|
|
|
310
|
-
|
|
267
|
+
/**
|
|
268
|
+
* TSL object representing a varying property for the instanced color vector.
|
|
269
|
+
*
|
|
270
|
+
* @type {VaryingNode<vec3>}
|
|
271
|
+
*/
|
|
272
|
+
export const instanceColor = /*@__PURE__*/ varyingProperty( 'vec3', 'vInstanceColor' );
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* TSL function representing the standard instancing vertex shader setup.
|
|
276
|
+
* Transforms positionLocal and normalLocal, and assigns varying color in-place.
|
|
277
|
+
*
|
|
278
|
+
* @tsl
|
|
279
|
+
* @function
|
|
280
|
+
* @param {InstancedBufferAttribute|StorageInstancedBufferAttribute} matrices - The instanced transformation matrices.
|
|
281
|
+
* @param {?InstancedBufferAttribute|StorageInstancedBufferAttribute} [colors=null] - The optional instanced colors.
|
|
282
|
+
*/
|
|
283
|
+
export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder ) => {
|
|
284
|
+
|
|
285
|
+
const isStorageColor = colors && colors.isStorageInstancedBufferAttribute === true;
|
|
286
|
+
|
|
287
|
+
const instanceMatrixNode = createInstanceMatrixNode( builder, matrices );
|
|
288
|
+
|
|
289
|
+
let instanceColorNode = null;
|
|
290
|
+
|
|
291
|
+
if ( colors ) {
|
|
292
|
+
|
|
293
|
+
if ( isStorageColor ) {
|
|
294
|
+
|
|
295
|
+
instanceColorNode = storage( colors, 'vec3', Math.max( colors.count, 1 ) ).element( instanceIndex );
|
|
296
|
+
|
|
297
|
+
} else {
|
|
298
|
+
|
|
299
|
+
// bound directly, so the GPU buffer is freed via instanceColor.dispose()
|
|
300
|
+
|
|
301
|
+
const bufferFn = colors.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;
|
|
311
302
|
|
|
312
|
-
|
|
313
|
-
|
|
303
|
+
instanceColorNode = vec3( bufferFn( colors ) );
|
|
304
|
+
|
|
305
|
+
}
|
|
314
306
|
|
|
315
307
|
}
|
|
316
308
|
|
|
317
|
-
|
|
309
|
+
let previousInstanceMatrixNode = null;
|
|
318
310
|
|
|
319
|
-
if ( builder.
|
|
311
|
+
if ( builder.needsPreviousData() ) {
|
|
320
312
|
|
|
321
|
-
const
|
|
322
|
-
|
|
313
|
+
const instancedMesh = builder.object;
|
|
314
|
+
|
|
315
|
+
OnAfterObjectUpdate( ( { object } ) => {
|
|
316
|
+
|
|
317
|
+
const { previousInstanceMatrix } = _previousInstanceMatrices.get( object );
|
|
318
|
+
|
|
319
|
+
previousInstanceMatrix.array.set( matrices.array );
|
|
320
|
+
previousInstanceMatrix.version = matrices.version;
|
|
321
|
+
|
|
322
|
+
} );
|
|
323
|
+
|
|
324
|
+
previousInstanceMatrixNode = getPreviousInstance( instancedMesh, matrices, builder );
|
|
323
325
|
|
|
324
326
|
}
|
|
325
327
|
|
|
328
|
+
transformInstance( builder, instanceMatrixNode, previousInstanceMatrixNode );
|
|
329
|
+
|
|
326
330
|
// COLOR
|
|
327
331
|
|
|
328
332
|
if ( instanceColorNode !== null ) {
|
|
@@ -336,14 +340,48 @@ export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder
|
|
|
336
340
|
/**
|
|
337
341
|
* TSL wrapper for applying instanced mesh rendering setup.
|
|
338
342
|
*
|
|
343
|
+
* The instance data of the rendered mesh are bound per object via {@link ReferenceAttributeNode},
|
|
344
|
+
* so instanced meshes share builds.
|
|
345
|
+
*
|
|
339
346
|
* @tsl
|
|
340
347
|
* @function
|
|
341
348
|
* @param {InstancedMesh} instancedMesh - The instanced mesh.
|
|
342
349
|
*/
|
|
343
|
-
export const instancedMesh = /*@__PURE__*/ Fn( ( [ instancedMesh ] ) => {
|
|
350
|
+
export const instancedMesh = /*@__PURE__*/ Fn( ( [ instancedMesh ], builder ) => {
|
|
351
|
+
|
|
352
|
+
if ( canReferenceInstanceData( instancedMesh, builder ) ) {
|
|
353
|
+
|
|
354
|
+
let previousInstanceMatrixNode = null;
|
|
355
|
+
|
|
356
|
+
if ( builder.needsPreviousData() ) {
|
|
357
|
+
|
|
358
|
+
OnAfterObjectUpdate( ( { object } ) => {
|
|
359
|
+
|
|
360
|
+
const previous = getPreviousMatrix( object );
|
|
361
|
+
|
|
362
|
+
previous.array.set( object.instanceMatrix.array );
|
|
363
|
+
previous.version = object.instanceMatrix.version;
|
|
364
|
+
|
|
365
|
+
} );
|
|
366
|
+
|
|
367
|
+
previousInstanceMatrixNode = new PreviousInstanceMatrixNode();
|
|
344
368
|
|
|
345
|
-
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
transformInstance( builder, referenceAttribute( 'instanceMatrix', 'mat4' ), previousInstanceMatrixNode );
|
|
372
|
+
|
|
373
|
+
if ( instancedMesh.instanceColor !== null ) {
|
|
374
|
+
|
|
375
|
+
instanceColor.assign( referenceAttribute( 'instanceColor', 'vec3' ) );
|
|
376
|
+
|
|
377
|
+
}
|
|
346
378
|
|
|
347
|
-
|
|
379
|
+
} else {
|
|
380
|
+
|
|
381
|
+
builder.objectSpecific = true;
|
|
382
|
+
|
|
383
|
+
instance( instancedMesh.instanceMatrix, instancedMesh.instanceColor );
|
|
384
|
+
|
|
385
|
+
}
|
|
348
386
|
|
|
349
387
|
}, 'void' );
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { uniform } from '../core/UniformNode.js';
|
|
2
2
|
import { renderGroup } from '../core/UniformGroupNode.js';
|
|
3
3
|
import { Vector3 } from '../../math/Vector3.js';
|
|
4
|
+
import { Fn, vec4 } from '../tsl/TSLBase.js';
|
|
4
5
|
import { cameraViewMatrix } from './Camera.js';
|
|
5
6
|
import { positionWorld } from './Position.js';
|
|
6
7
|
|
|
@@ -111,20 +112,32 @@ export function lightTargetPosition( light ) {
|
|
|
111
112
|
* @tsl
|
|
112
113
|
* @function
|
|
113
114
|
* @param {Light} light - The light source.
|
|
114
|
-
* @returns {
|
|
115
|
+
* @returns {Node<vec3>} The light's position in view space.
|
|
115
116
|
*/
|
|
116
117
|
export function lightViewPosition( light ) {
|
|
117
118
|
|
|
118
119
|
const data = getLightData( light );
|
|
119
120
|
|
|
120
|
-
return data.viewPosition || ( data.viewPosition =
|
|
121
|
+
return data.viewPosition || ( data.viewPosition = ( Fn( ( { camera } ) => {
|
|
121
122
|
|
|
122
|
-
|
|
123
|
-
self.value.setFromMatrixPosition( light.matrixWorld );
|
|
123
|
+
// Each sub-camera of an array camera has its own view space.
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
if ( camera.isArrayCamera && camera.cameras.length > 0 ) {
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
return cameraViewMatrix.mul( vec4( lightPosition( light ), 1 ) ).xyz;
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return data.viewPositionUniform || ( data.viewPositionUniform = uniform( new Vector3() ).setGroup( renderGroup ).onRenderUpdate( ( { camera }, self ) => {
|
|
132
|
+
|
|
133
|
+
self.value = self.value || new Vector3();
|
|
134
|
+
self.value.setFromMatrixPosition( light.matrixWorld );
|
|
135
|
+
|
|
136
|
+
self.value.applyMatrix4( camera.matrixWorldInverse );
|
|
137
|
+
|
|
138
|
+
} ) );
|
|
139
|
+
|
|
140
|
+
} ).once() )() );
|
|
128
141
|
|
|
129
142
|
}
|
|
130
143
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import Node from '../core/Node.js';
|
|
2
|
-
import { reference } from './ReferenceNode.js';
|
|
3
2
|
import { materialReference } from './MaterialReferenceNode.js';
|
|
4
3
|
import { normalView } from './Normal.js';
|
|
5
4
|
import { nodeImmutable, float, vec2, vec3, mat2 } from '../tsl/TSLBase.js';
|
|
@@ -46,6 +45,12 @@ class MaterialNode extends Node {
|
|
|
46
45
|
|
|
47
46
|
}
|
|
48
47
|
|
|
48
|
+
isCacheable( /*builder*/ ) {
|
|
49
|
+
|
|
50
|
+
return false;
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
49
54
|
/**
|
|
50
55
|
* Returns a cached reference node for the given property and type.
|
|
51
56
|
*
|
|
@@ -201,6 +206,20 @@ class MaterialNode extends Node {
|
|
|
201
206
|
|
|
202
207
|
}
|
|
203
208
|
|
|
209
|
+
} else if ( scope === MaterialNode.DIFFUSE_ROUGHNESS ) {
|
|
210
|
+
|
|
211
|
+
const diffuseRoughnessNode = this.getFloat( scope );
|
|
212
|
+
|
|
213
|
+
if ( material.diffuseRoughnessMap && material.diffuseRoughnessMap.isTexture === true ) {
|
|
214
|
+
|
|
215
|
+
node = diffuseRoughnessNode.mul( this.getTexture( scope ).r );
|
|
216
|
+
|
|
217
|
+
} else {
|
|
218
|
+
|
|
219
|
+
node = diffuseRoughnessNode;
|
|
220
|
+
|
|
221
|
+
}
|
|
222
|
+
|
|
204
223
|
} else if ( scope === MaterialNode.METALNESS ) {
|
|
205
224
|
|
|
206
225
|
const metalnessNode = this.getFloat( scope );
|
|
@@ -273,7 +292,7 @@ class MaterialNode extends Node {
|
|
|
273
292
|
|
|
274
293
|
if ( material.clearcoatRoughnessMap && material.clearcoatRoughnessMap.isTexture === true ) {
|
|
275
294
|
|
|
276
|
-
node = clearcoatRoughnessNode.mul( this.getTexture( scope ).
|
|
295
|
+
node = clearcoatRoughnessNode.mul( this.getTexture( scope ).g );
|
|
277
296
|
|
|
278
297
|
} else {
|
|
279
298
|
|
|
@@ -340,11 +359,11 @@ class MaterialNode extends Node {
|
|
|
340
359
|
|
|
341
360
|
} else if ( scope === MaterialNode.IRIDESCENCE_THICKNESS ) {
|
|
342
361
|
|
|
343
|
-
const iridescenceThicknessMaximum =
|
|
362
|
+
const iridescenceThicknessMaximum = this.getFloat( 'iridescenceThicknessMaximum' );
|
|
344
363
|
|
|
345
364
|
if ( material.iridescenceThicknessMap ) {
|
|
346
365
|
|
|
347
|
-
const iridescenceThicknessMinimum =
|
|
366
|
+
const iridescenceThicknessMinimum = this.getFloat( 'iridescenceThicknessMinimum' );
|
|
348
367
|
|
|
349
368
|
node = iridescenceThicknessMaximum.sub( iridescenceThicknessMinimum ).mul( this.getTexture( scope ).g ).add( iridescenceThicknessMinimum );
|
|
350
369
|
|
|
@@ -438,6 +457,7 @@ MaterialNode.SPECULAR_INTENSITY = 'specularIntensity';
|
|
|
438
457
|
MaterialNode.SPECULAR_COLOR = 'specularColor';
|
|
439
458
|
MaterialNode.REFLECTIVITY = 'reflectivity';
|
|
440
459
|
MaterialNode.ROUGHNESS = 'roughness';
|
|
460
|
+
MaterialNode.DIFFUSE_ROUGHNESS = 'diffuseRoughness';
|
|
441
461
|
MaterialNode.METALNESS = 'metalness';
|
|
442
462
|
MaterialNode.NORMAL = 'normal';
|
|
443
463
|
MaterialNode.CLEARCOAT = 'clearcoat';
|
|
@@ -564,6 +584,15 @@ export const materialReflectivity = /*@__PURE__*/ nodeImmutable( MaterialNode, M
|
|
|
564
584
|
*/
|
|
565
585
|
export const materialRoughness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS );
|
|
566
586
|
|
|
587
|
+
/**
|
|
588
|
+
* TSL object that represents the diffuse roughness of the current material.
|
|
589
|
+
* The value is composed via `diffuseRoughness` * `diffuseRoughnessMap.r`.
|
|
590
|
+
*
|
|
591
|
+
* @tsl
|
|
592
|
+
* @type {Node<float>}
|
|
593
|
+
*/
|
|
594
|
+
export const materialDiffuseRoughness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.DIFFUSE_ROUGHNESS );
|
|
595
|
+
|
|
567
596
|
/**
|
|
568
597
|
* TSL object that represents the metalness of the current material.
|
|
569
598
|
* The value is composed via `metalness` * `metalnessMap.b`.
|