@gnsx/three 0.185.15 → 0.186.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +10 -82600
- package/build/three.core.js +1303 -728
- package/build/three.module.js +439 -338
- package/build/three.tsl.js +74 -44
- package/build/three.webgpu.js +6036 -2184
- package/build/three.webgpu.nodes.js +6020 -2184
- package/examples/jsm/Addons.js +6 -6
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +44 -20
- package/examples/jsm/controls/OrbitControls.js +9 -0
- package/examples/jsm/controls/TrackballControls.js +109 -4
- package/examples/jsm/csm/CSMShadowNode.js +13 -0
- package/examples/jsm/exporters/GLTFExporter.js +23 -7
- package/examples/jsm/exporters/USDZExporter.js +2 -2
- package/examples/jsm/generators/CityGenerator.js +377 -45
- package/examples/jsm/generators/ForestGenerator.js +12 -12
- package/examples/jsm/generators/TerrainGenerator.js +49 -37
- package/examples/jsm/generators/TreeGenerator.js +70 -76
- package/examples/jsm/generators/city/BenchGenerator.js +127 -0
- package/examples/jsm/generators/city/CarGenerator.js +479 -0
- package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
- package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
- package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
- package/examples/jsm/generators/city/PersonGenerator.js +447 -0
- package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
- package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
- package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
- package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
- package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
- package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
- package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
- package/examples/jsm/gpgpu/CountingSort.js +271 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
- package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
- package/examples/jsm/inspector/Extension.js +94 -0
- package/examples/jsm/inspector/Inspector.js +145 -41
- package/examples/jsm/inspector/RendererInspector.js +100 -52
- package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
- package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
- package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
- package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
- package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
- package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
- package/examples/jsm/inspector/tabs/Memory.js +0 -2
- package/examples/jsm/inspector/tabs/Settings.js +4 -0
- package/examples/jsm/inspector/tabs/Timeline.js +223 -171
- package/examples/jsm/inspector/tabs/Viewer.js +515 -21
- package/examples/jsm/inspector/ui/List.js +15 -9
- package/examples/jsm/inspector/ui/Profiler.js +170 -14
- package/examples/jsm/inspector/ui/Style.js +269 -23
- package/examples/jsm/inspector/ui/Tab.js +2 -0
- package/examples/jsm/inspector/ui/Values.js +14 -2
- package/examples/jsm/interactive/HTMLMesh.js +19 -3
- package/examples/jsm/lighting/LightProbeGrid.js +484 -889
- package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
- package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
- package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
- package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
- package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
- package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
- package/examples/jsm/lights/SunLight.js +95 -0
- package/examples/jsm/lights/SunLightNode.js +56 -0
- package/examples/jsm/lights/SunLightShadow.js +319 -0
- package/examples/jsm/lights/SunShadowNode.js +312 -0
- package/examples/jsm/loaders/3DMLoader.js +150 -49
- package/examples/jsm/loaders/3MFLoader.js +202 -1
- package/examples/jsm/loaders/FBXLoader.js +81 -5
- package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
- package/examples/jsm/loaders/GLTFLoader.js +79 -14
- package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
- package/examples/jsm/loaders/KSPLATLoader.js +463 -0
- package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/SPLATLoader.js +139 -0
- package/examples/jsm/loaders/SPZLoader.js +561 -0
- package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
- package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
- package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
- package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
- package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
- package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
- package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
- package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
- package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
- package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
- package/examples/jsm/loaders/usd/USDAParser.js +15 -2
- package/examples/jsm/loaders/usd/USDCParser.js +1 -4
- package/examples/jsm/loaders/usd/USDComposer.js +80 -42
- package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
- package/examples/jsm/misc/RollerCoaster.js +2 -2
- package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
- package/examples/jsm/misc/Sculptor.js +1679 -0
- package/examples/jsm/misc/SculptorMesh.js +1504 -0
- package/examples/jsm/misc/SculptorTools.js +1180 -0
- package/examples/jsm/misc/SculptorUtils.js +345 -0
- package/examples/jsm/misc/TubePainter.js +28 -16
- package/examples/jsm/misc/VolumeSlice.js +24 -24
- package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
- package/examples/jsm/objects/GaussianSplat.js +1039 -0
- package/examples/jsm/objects/Sky.js +66 -45
- package/examples/jsm/objects/SkyMesh.js +70 -51
- package/examples/jsm/physics/JoltPhysics.js +1 -1
- package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
- package/examples/jsm/postprocessing/BloomPass.js +2 -2
- package/examples/jsm/postprocessing/GTAOPass.js +1 -1
- package/examples/jsm/postprocessing/OutlinePass.js +5 -5
- package/examples/jsm/postprocessing/SAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSAOPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +4 -2
- package/examples/jsm/postprocessing/SavePass.js +1 -1
- package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
- package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
- package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
- package/examples/jsm/shaders/ExposureShader.js +1 -1
- package/examples/jsm/shaders/FilmShader.js +2 -1
- package/examples/jsm/transpiler/AST.js +21 -2
- package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
- package/examples/jsm/transpiler/TSLEncoder.js +82 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
- package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
- package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
- package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
- package/examples/jsm/tsl/display/BloomNode.js +55 -30
- package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
- package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
- package/examples/jsm/tsl/display/FSR1Node.js +8 -4
- package/examples/jsm/tsl/display/GTAONode.js +199 -86
- package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
- package/examples/jsm/tsl/display/GodraysNode.js +5 -2
- package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
- package/examples/jsm/tsl/display/LensflareNode.js +5 -2
- package/examples/jsm/tsl/display/OITPassNode.js +352 -0
- package/examples/jsm/tsl/display/OutlineNode.js +2 -0
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
- package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
- package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
- package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
- package/examples/jsm/tsl/display/SMAANode.js +22 -61
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
- package/examples/jsm/tsl/display/SSAONode.js +436 -0
- package/examples/jsm/tsl/display/SSGINode.js +5 -2
- package/examples/jsm/tsl/display/SSRNode.js +7 -2
- package/examples/jsm/tsl/display/SSSNode.js +5 -2
- package/examples/jsm/tsl/display/SharpenNode.js +5 -4
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
- package/examples/jsm/tsl/display/TAAUNode.js +22 -125
- package/examples/jsm/tsl/display/TRAANode.js +16 -142
- package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
- package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
- package/examples/jsm/tsl/display/hashBlur.js +3 -2
- package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
- package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
- package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
- package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
- package/examples/jsm/tsl/utils/Raymarching.js +5 -5
- package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
- package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
- package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
- package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
- package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
- package/package.json +9 -16
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +73 -43
- package/src/Three.WebGPU.Nodes.js +1 -0
- package/src/Three.WebGPU.js +1 -0
- package/src/animation/AnimationClip.js +15 -2
- package/src/animation/AnimationObjectGroup.js +18 -6
- package/src/animation/AnimationUtils.js +26 -0
- package/src/animation/KeyframeTrack.js +37 -0
- package/src/constants.js +23 -1
- package/src/core/BufferAttribute.js +3 -2
- package/src/core/BufferGeometry.js +1 -1
- package/src/core/InterleavedBuffer.js +5 -1
- package/src/core/Object3D.js +40 -12
- package/src/core/Raycaster.js +4 -0
- package/src/core/RenderTarget.js +99 -9
- package/src/core/RenderTarget3D.js +12 -8
- package/src/extras/Controls.js +0 -8
- package/src/extras/PMREMGenerator.js +99 -205
- package/src/geometries/TorusGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +2 -0
- package/src/helpers/AxesHelper.js +2 -0
- package/src/helpers/Box3Helper.js +2 -0
- package/src/helpers/BoxHelper.js +2 -0
- package/src/helpers/CameraHelper.js +2 -0
- package/src/helpers/DirectionalLightHelper.js +2 -0
- package/src/helpers/GridHelper.js +2 -0
- package/src/helpers/HemisphereLightHelper.js +2 -0
- package/src/helpers/PlaneHelper.js +2 -0
- package/src/helpers/PointLightHelper.js +2 -0
- package/src/helpers/PolarGridHelper.js +2 -0
- package/src/helpers/SkeletonHelper.js +2 -0
- package/src/helpers/SpotLightHelper.js +2 -0
- package/src/lights/Light.js +0 -10
- package/src/lights/LightShadow.js +43 -12
- package/src/lights/SpotLightShadow.js +18 -0
- package/src/loaders/BufferGeometryLoader.js +5 -0
- package/src/loaders/ImageBitmapLoader.js +3 -1
- package/src/loaders/ObjectLoader.js +8 -5
- package/src/materials/Material.js +80 -57
- package/src/materials/MeshPhysicalMaterial.js +32 -0
- package/src/materials/nodes/Line2NodeMaterial.js +17 -8
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
- package/src/materials/nodes/NodeMaterial.js +19 -13
- package/src/materials/nodes/PointsNodeMaterial.js +2 -1
- package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
- package/src/math/Frustum.js +9 -0
- package/src/math/FrustumArray.js +1 -1
- package/src/math/MathUtils.js +5 -3
- package/src/math/Matrix4.js +2 -9
- package/src/math/Plane.js +30 -1
- package/src/math/Quaternion.js +0 -10
- package/src/math/Ray.js +95 -45
- package/src/math/Triangle.js +0 -2
- package/src/math/Vector3.js +2 -2
- package/src/math/Vector4.js +0 -4
- package/src/math/interpolants/BezierInterpolant.js +36 -23
- package/src/nodes/Nodes.js +2 -0
- package/src/nodes/TSL.js +11 -3
- package/src/nodes/accessors/Batch.js +85 -13
- package/src/nodes/accessors/BufferAttributeNode.js +1 -1
- package/src/nodes/accessors/BuiltinNode.js +1 -1
- package/src/nodes/accessors/Instance.js +19 -18
- package/src/nodes/accessors/MaterialNode.js +9 -0
- package/src/nodes/accessors/ModelNode.js +85 -9
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
- package/src/nodes/accessors/ReferenceElementNode.js +72 -0
- package/src/nodes/accessors/ReferenceNode.js +1 -70
- package/src/nodes/accessors/Skinning.js +124 -12
- package/src/nodes/accessors/StorageTextureNode.js +7 -3
- package/src/nodes/accessors/Texture3DNode.js +1 -1
- package/src/nodes/accessors/TextureNode.js +51 -21
- package/src/nodes/accessors/TextureSizeNode.js +4 -2
- package/src/nodes/accessors/UniformArrayNode.js +30 -5
- package/src/nodes/code/CodeNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +12 -2
- package/src/nodes/core/ArrayNode.js +2 -2
- package/src/nodes/core/ContextNode.js +57 -4
- package/src/nodes/core/IndexNode.js +69 -4
- package/src/nodes/core/InspectorNode.js +2 -2
- package/src/nodes/core/MRTNode.js +44 -2
- package/src/nodes/core/Node.js +6 -3
- package/src/nodes/core/NodeBuilder.js +65 -50
- package/src/nodes/core/NodeFrame.js +11 -3
- package/src/nodes/core/NodeUtils.js +88 -0
- package/src/nodes/core/PropertyNode.js +8 -0
- package/src/nodes/core/StackNode.js +0 -1
- package/src/nodes/core/StructNode.js +4 -3
- package/src/nodes/core/UniformGroupNode.js +3 -2
- package/src/nodes/core/UniformNode.js +26 -12
- package/src/nodes/core/VarNode.js +0 -1
- package/src/nodes/display/BumpMapNode.js +2 -2
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/PassNode.js +76 -15
- package/src/nodes/display/ScreenNode.js +22 -65
- package/src/nodes/fog/Fog.js +4 -4
- package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
- package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
- package/src/nodes/functions/BSDF/LTC.js +1 -1
- package/src/nodes/functions/PhongLightingModel.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +83 -25
- package/src/nodes/functions/ToonLightingModel.js +2 -2
- package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
- package/src/nodes/gpgpu/BarrierNode.js +13 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
- package/src/nodes/gpgpu/ComputeNode.js +20 -17
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
- package/src/nodes/lighting/EnvironmentNode.js +40 -4
- package/src/nodes/lighting/LightsNode.js +20 -4
- package/src/nodes/lighting/ShadowBaseNode.js +158 -1
- package/src/nodes/lighting/ShadowFilterNode.js +2 -106
- package/src/nodes/lighting/ShadowNode.js +22 -91
- package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
- package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
- package/src/nodes/materialx/MaterialXCore.js +37 -0
- package/src/nodes/materialx/MaterialXNodes.js +64 -72
- package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
- package/src/nodes/math/BitcountNode.js +24 -4
- package/src/nodes/math/MathNode.js +4 -4
- package/src/nodes/math/MathUtils.js +15 -4
- package/src/nodes/math/OperatorNode.js +2 -2
- package/src/nodes/math/PackFloatNode.js +29 -1
- package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
- package/src/nodes/math/UnpackFloatNode.js +30 -2
- package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +31 -74
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLCore.js +1 -31
- package/src/nodes/utils/EventNode.js +75 -0
- package/src/nodes/utils/LoopNode.js +54 -13
- package/src/nodes/utils/PostProcessingUtils.js +23 -2
- package/src/nodes/utils/RTTNode.js +97 -32
- package/src/nodes/utils/ReflectorNode.js +8 -4
- package/src/nodes/utils/RotateNode.js +85 -8
- package/src/nodes/utils/SpriteUtils.js +58 -23
- package/src/objects/BatchedMesh.js +6 -0
- package/src/objects/InstancedMesh.js +1 -1
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +12 -0
- package/src/objects/Mesh.js +12 -0
- package/src/objects/Points.js +12 -0
- package/src/objects/Sprite.js +12 -0
- package/src/renderers/WebGLRenderer.js +93 -27
- package/src/renderers/common/Animation.js +12 -2
- package/src/renderers/common/Backend.js +38 -10
- package/src/renderers/common/BindGroup.js +0 -1
- package/src/renderers/common/Bindings.js +50 -4
- package/src/renderers/common/BundleGroup.js +4 -0
- package/src/renderers/common/ClippingContext.js +11 -1
- package/src/renderers/common/Color4.js +9 -0
- package/src/renderers/common/Constants.js +0 -5
- package/src/renderers/common/DirectRenderPipeline.js +233 -0
- package/src/renderers/common/Geometries.js +24 -3
- package/src/renderers/common/Info.js +3 -3
- package/src/renderers/common/InspectorBase.js +37 -8
- package/src/renderers/common/Lighting.js +11 -4
- package/src/renderers/common/Pipelines.js +6 -4
- package/src/renderers/common/QuadMesh.js +16 -2
- package/src/renderers/common/RenderContext.js +8 -0
- package/src/renderers/common/RenderList.js +53 -19
- package/src/renderers/common/RenderLists.js +58 -11
- package/src/renderers/common/RenderObject.js +14 -0
- package/src/renderers/common/RenderObjects.js +14 -9
- package/src/renderers/common/RenderPipeline.js +52 -44
- package/src/renderers/common/Renderer.js +226 -55
- package/src/renderers/common/Storage3DTexture.js +16 -0
- package/src/renderers/common/Textures.js +3 -3
- package/src/renderers/common/XRManager.js +79 -72
- package/src/renderers/common/extras/PMREMGenerator.js +76 -144
- package/src/renderers/common/nodes/NodeManager.js +144 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
- package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
- package/src/renderers/shaders/DFGLUTData.js +2 -1
- package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
- package/src/renderers/shaders/ShaderLib.js +1 -0
- package/src/renderers/shaders/UniformsLib.js +16 -0
- package/src/renderers/webgl/WebGLAnimation.js +2 -2
- package/src/renderers/webgl/WebGLCapabilities.js +2 -2
- package/src/renderers/webgl/WebGLLights.js +74 -4
- package/src/renderers/webgl/WebGLMaterials.js +6 -0
- package/src/renderers/webgl/WebGLOutput.js +36 -24
- package/src/renderers/webgl/WebGLProgram.js +3 -0
- package/src/renderers/webgl/WebGLPrograms.js +8 -0
- package/src/renderers/webgl/WebGLRenderLists.js +6 -10
- package/src/renderers/webgl/WebGLShadowMap.js +47 -44
- package/src/renderers/webgl/WebGLTextures.js +7 -7
- package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
- package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
- package/src/renderers/webgpu/WebGPUBackend.js +513 -145
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
- package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
- package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
- package/src/renderers/webxr/WebXRManager.js +25 -2
- package/src/scenes/Scene.js +3 -3
- package/src/textures/CompressedArrayTexture.js +16 -0
- package/src/textures/Data3DTexture.js +16 -0
- package/src/textures/DataArrayTexture.js +16 -0
- package/src/textures/DepthTexture.js +3 -3
- package/src/textures/Texture.js +3 -3
- package/src/textures/{Source.js → TextureSource.js} +39 -8
- package/build/three.core.min.js +0 -6
- package/build/three.module.min.js +0 -6
- package/build/three.tsl.min.js +0 -6
- package/build/three.webgpu.min.js +0 -6
- package/build/three.webgpu.nodes.min.js +0 -6
- package/examples/jsm/libs/ecsy.module.js +0 -1792
- package/examples/jsm/loaders/LottieLoader.js +0 -130
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
import { vec3, mat4, Fn } from '../tsl/TSLBase.js';
|
|
3
|
-
import {
|
|
3
|
+
import { OnAfterObjectUpdate, OnBeforeFrameUpdate } 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';
|
|
@@ -172,34 +172,28 @@ export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder
|
|
|
172
172
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
-
// Synchronization of dynamic buffer updates per frame
|
|
175
|
+
// Synchronization of dynamic buffer updates per frame.
|
|
176
176
|
if ( interleavedMatrix !== null || interleavedColor !== null ) {
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
OnBeforeFrameUpdate( () => {
|
|
179
179
|
|
|
180
|
-
if ( interleavedMatrix !== null ) {
|
|
180
|
+
if ( interleavedMatrix !== null && interleavedMatrix.version !== matrices.version ) {
|
|
181
181
|
|
|
182
182
|
interleavedMatrix.clearUpdateRanges();
|
|
183
183
|
interleavedMatrix.updateRanges.push( ...matrices.updateRanges );
|
|
184
|
+
matrices.clearUpdateRanges(); // "matrices" as the source is never uploaded directly. clear to avoid update range accumulation
|
|
184
185
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
interleavedMatrix.version = matrices.version;
|
|
188
|
-
|
|
189
|
-
}
|
|
186
|
+
interleavedMatrix.version = matrices.version;
|
|
190
187
|
|
|
191
188
|
}
|
|
192
189
|
|
|
193
|
-
if ( colors && interleavedColor !== null ) {
|
|
190
|
+
if ( colors && interleavedColor !== null && interleavedColor.version !== colors.version ) {
|
|
194
191
|
|
|
195
192
|
interleavedColor.clearUpdateRanges();
|
|
196
193
|
interleavedColor.updateRanges.push( ...colors.updateRanges );
|
|
194
|
+
colors.clearUpdateRanges();
|
|
197
195
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
interleavedColor.version = colors.version;
|
|
201
|
-
|
|
202
|
-
}
|
|
196
|
+
interleavedColor.version = colors.version;
|
|
203
197
|
|
|
204
198
|
}
|
|
205
199
|
|
|
@@ -216,11 +210,18 @@ export const instance = /*@__PURE__*/ Fn( ( [ matrices, colors = null ], builder
|
|
|
216
210
|
|
|
217
211
|
const instancedMesh = builder.object;
|
|
218
212
|
|
|
219
|
-
|
|
213
|
+
OnAfterObjectUpdate( ( { object } ) => {
|
|
214
|
+
|
|
215
|
+
const { previousInstanceMatrix } = _previousInstanceMatrices.get( object );
|
|
216
|
+
|
|
217
|
+
previousInstanceMatrix.array.set( matrices.array );
|
|
218
|
+
previousInstanceMatrix.version = matrices.version;
|
|
219
|
+
|
|
220
|
+
// handle interleaved path
|
|
220
221
|
|
|
221
|
-
const
|
|
222
|
+
const previousInterleavedMatrix = _matrixBuffers.get( previousInstanceMatrix );
|
|
222
223
|
|
|
223
|
-
|
|
224
|
+
if ( previousInterleavedMatrix !== undefined ) previousInterleavedMatrix.version = matrices.version;
|
|
224
225
|
|
|
225
226
|
} );
|
|
226
227
|
|
|
@@ -463,6 +463,7 @@ MaterialNode.LINE_WIDTH = 'linewidth';
|
|
|
463
463
|
MaterialNode.LINE_DASH_OFFSET = 'dashOffset';
|
|
464
464
|
MaterialNode.POINT_SIZE = 'size';
|
|
465
465
|
MaterialNode.DISPERSION = 'dispersion';
|
|
466
|
+
MaterialNode.RETROREFLECTIVITY = 'retroreflectivity';
|
|
466
467
|
MaterialNode.LIGHT_MAP = 'light';
|
|
467
468
|
MaterialNode.AO = 'ao';
|
|
468
469
|
|
|
@@ -764,6 +765,14 @@ export const materialPointSize = /*@__PURE__*/ nodeImmutable( MaterialNode, Mate
|
|
|
764
765
|
*/
|
|
765
766
|
export const materialDispersion = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.DISPERSION );
|
|
766
767
|
|
|
768
|
+
/**
|
|
769
|
+
* TSL object that represents the retroreflective strength of the current material.
|
|
770
|
+
*
|
|
771
|
+
* @tsl
|
|
772
|
+
* @type {Node<float>}
|
|
773
|
+
*/
|
|
774
|
+
export const materialRetroreflectivity = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.RETROREFLECTIVITY );
|
|
775
|
+
|
|
767
776
|
/**
|
|
768
777
|
* TSL object that represents the light map of the current material.
|
|
769
778
|
* The value is composed via `lightMapIntensity` * `lightMap.rgb`.
|
|
@@ -3,9 +3,13 @@ import { Fn, nodeImmutable } from '../tsl/TSLBase.js';
|
|
|
3
3
|
import { uniform } from '../core/UniformNode.js';
|
|
4
4
|
|
|
5
5
|
import { Matrix4 } from '../../math/Matrix4.js';
|
|
6
|
-
import {
|
|
6
|
+
import { builtin } from './BuiltinNode.js';
|
|
7
|
+
import { cameraIndex, cameraViewMatrix } from './Camera.js';
|
|
8
|
+
import { uniformArray } from './UniformArrayNode.js';
|
|
7
9
|
import { Matrix3 } from '../../math/Matrix3.js';
|
|
8
10
|
|
|
11
|
+
const _modelViewMatrix = /*@__PURE__*/ new Matrix4();
|
|
12
|
+
|
|
9
13
|
/**
|
|
10
14
|
* This type of node is a specialized version of `Object3DNode`
|
|
11
15
|
* with larger set of model related metrics. Unlike `Object3DNode`,
|
|
@@ -150,11 +154,46 @@ export const highpModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {
|
|
|
150
154
|
|
|
151
155
|
builder.context.isHighPrecisionModelViewMatrix = true;
|
|
152
156
|
|
|
153
|
-
|
|
157
|
+
const camera = builder.camera;
|
|
158
|
+
|
|
159
|
+
let highpModelViewMatrix;
|
|
160
|
+
|
|
161
|
+
if ( camera.isArrayCamera && camera.cameras.length > 0 ) {
|
|
162
|
+
|
|
163
|
+
const matrices = [];
|
|
164
|
+
|
|
165
|
+
for ( let i = 0; i < camera.cameras.length; i ++ ) {
|
|
166
|
+
|
|
167
|
+
matrices.push( new Matrix4() );
|
|
168
|
+
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const modelViewMatrices = uniformArray( matrices ).onObjectUpdate( ( { object, camera }, self ) => {
|
|
172
|
+
|
|
173
|
+
const subCameras = camera.cameras;
|
|
174
|
+
const array = self.array;
|
|
154
175
|
|
|
155
|
-
|
|
176
|
+
for ( let i = 0, l = subCameras.length; i < l; i ++ ) {
|
|
177
|
+
|
|
178
|
+
array[ i ].multiplyMatrices( subCameras[ i ].matrixWorldInverse, object.matrixWorld );
|
|
179
|
+
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
} );
|
|
183
|
+
|
|
184
|
+
highpModelViewMatrix = modelViewMatrices.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex );
|
|
185
|
+
|
|
186
|
+
} else {
|
|
187
|
+
|
|
188
|
+
highpModelViewMatrix = uniform( 'mat4' ).onObjectUpdate( ( { object, camera } ) => {
|
|
189
|
+
|
|
190
|
+
return object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
191
|
+
|
|
192
|
+
} );
|
|
193
|
+
|
|
194
|
+
}
|
|
156
195
|
|
|
157
|
-
|
|
196
|
+
return highpModelViewMatrix;
|
|
158
197
|
|
|
159
198
|
} ).once() )().toVar( 'highpModelViewMatrix' );
|
|
160
199
|
|
|
@@ -169,16 +208,53 @@ export const highpModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {
|
|
|
169
208
|
|
|
170
209
|
const isHighPrecisionModelViewMatrix = builder.context.isHighPrecisionModelViewMatrix;
|
|
171
210
|
|
|
172
|
-
|
|
211
|
+
const camera = builder.camera;
|
|
173
212
|
|
|
174
|
-
|
|
213
|
+
let highpModelNormalViewMatrix;
|
|
175
214
|
|
|
176
|
-
|
|
215
|
+
if ( camera.isArrayCamera && camera.cameras.length > 0 ) {
|
|
216
|
+
|
|
217
|
+
const matrices = [];
|
|
218
|
+
|
|
219
|
+
for ( let i = 0; i < camera.cameras.length; i ++ ) {
|
|
220
|
+
|
|
221
|
+
matrices.push( new Matrix3() );
|
|
177
222
|
|
|
178
223
|
}
|
|
179
224
|
|
|
180
|
-
|
|
225
|
+
const normalViewMatrices = uniformArray( matrices ).onObjectUpdate( ( { object, camera }, self ) => {
|
|
226
|
+
|
|
227
|
+
const subCameras = camera.cameras;
|
|
228
|
+
const array = self.array;
|
|
229
|
+
|
|
230
|
+
for ( let i = 0, l = subCameras.length; i < l; i ++ ) {
|
|
231
|
+
|
|
232
|
+
_modelViewMatrix.multiplyMatrices( subCameras[ i ].matrixWorldInverse, object.matrixWorld );
|
|
233
|
+
|
|
234
|
+
array[ i ].getNormalMatrix( _modelViewMatrix );
|
|
235
|
+
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
} );
|
|
239
|
+
|
|
240
|
+
highpModelNormalViewMatrix = normalViewMatrices.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex );
|
|
241
|
+
|
|
242
|
+
} else {
|
|
243
|
+
|
|
244
|
+
highpModelNormalViewMatrix = uniform( 'mat3' ).onObjectUpdate( ( { object, camera } ) => {
|
|
245
|
+
|
|
246
|
+
if ( isHighPrecisionModelViewMatrix !== true ) {
|
|
247
|
+
|
|
248
|
+
object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );
|
|
249
|
+
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return object.normalMatrix.getNormalMatrix( object.modelViewMatrix );
|
|
253
|
+
|
|
254
|
+
} );
|
|
255
|
+
|
|
256
|
+
}
|
|
181
257
|
|
|
182
|
-
|
|
258
|
+
return highpModelNormalViewMatrix;
|
|
183
259
|
|
|
184
260
|
} ).once() )().toVar( 'highpModelNormalViewMatrix' );
|
|
@@ -2,79 +2,10 @@ import Node from '../core/Node.js';
|
|
|
2
2
|
import { NodeUpdateType } from '../core/constants.js';
|
|
3
3
|
import { uniform } from '../core/UniformNode.js';
|
|
4
4
|
import { nodeObject } from '../tsl/TSLCore.js';
|
|
5
|
-
import
|
|
5
|
+
import ReferenceElementNode from './ReferenceElementNode.js';
|
|
6
6
|
|
|
7
7
|
// TODO: Avoid duplicated code and use only ReferenceBaseNode or ReferenceNode
|
|
8
8
|
|
|
9
|
-
/**
|
|
10
|
-
* This class is only relevant if the referenced property is array-like.
|
|
11
|
-
* In this case, `ReferenceElementNode` allows to refer to a specific
|
|
12
|
-
* element inside the data structure via an index.
|
|
13
|
-
*
|
|
14
|
-
* @augments ArrayElementNode
|
|
15
|
-
*/
|
|
16
|
-
class ReferenceElementNode extends ArrayElementNode {
|
|
17
|
-
|
|
18
|
-
static get type() {
|
|
19
|
-
|
|
20
|
-
return 'ReferenceElementNode';
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Constructs a new reference element node.
|
|
26
|
-
*
|
|
27
|
-
* @param {ReferenceBaseNode} referenceNode - The reference node.
|
|
28
|
-
* @param {Node} indexNode - The index node that defines the element access.
|
|
29
|
-
*/
|
|
30
|
-
constructor( referenceNode, indexNode ) {
|
|
31
|
-
|
|
32
|
-
super( referenceNode, indexNode );
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Similar to {@link ReferenceBaseNode#reference}, an additional
|
|
36
|
-
* property references to the current node.
|
|
37
|
-
*
|
|
38
|
-
* @type {?ReferenceBaseNode}
|
|
39
|
-
* @default null
|
|
40
|
-
*/
|
|
41
|
-
this.referenceNode = referenceNode;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* This flag can be used for type testing.
|
|
45
|
-
*
|
|
46
|
-
* @type {boolean}
|
|
47
|
-
* @readonly
|
|
48
|
-
* @default true
|
|
49
|
-
*/
|
|
50
|
-
this.isReferenceElementNode = true;
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* This method is overwritten since the node type is inferred from
|
|
56
|
-
* the uniform type of the reference node.
|
|
57
|
-
*
|
|
58
|
-
* @return {string} The node type.
|
|
59
|
-
*/
|
|
60
|
-
generateNodeType() {
|
|
61
|
-
|
|
62
|
-
return this.referenceNode.uniformType;
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
generate( builder ) {
|
|
67
|
-
|
|
68
|
-
const snippet = super.generate( builder );
|
|
69
|
-
const arrayType = this.referenceNode.getNodeType();
|
|
70
|
-
const elementType = this.getNodeType();
|
|
71
|
-
|
|
72
|
-
return builder.format( snippet, arrayType, elementType );
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
9
|
/**
|
|
79
10
|
* Base class for nodes which establishes a reference to a property of another object.
|
|
80
11
|
* In this way, the value of the node is automatically linked to the value of
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import ArrayElementNode from '../utils/ArrayElementNode.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This class is only relevant if the referenced property is array-like.
|
|
5
|
+
* In this case, `ReferenceElementNode` allows to refer to a specific
|
|
6
|
+
* element inside the data structure via an index.
|
|
7
|
+
*
|
|
8
|
+
* @augments ArrayElementNode
|
|
9
|
+
*/
|
|
10
|
+
class ReferenceElementNode extends ArrayElementNode {
|
|
11
|
+
|
|
12
|
+
static get type() {
|
|
13
|
+
|
|
14
|
+
return 'ReferenceElementNode';
|
|
15
|
+
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Constructs a new reference element node.
|
|
20
|
+
*
|
|
21
|
+
* @param {(ReferenceBaseNode|ReferenceNode)} referenceNode - The reference node.
|
|
22
|
+
* @param {Node} indexNode - The index node that defines the element access.
|
|
23
|
+
*/
|
|
24
|
+
constructor( referenceNode, indexNode ) {
|
|
25
|
+
|
|
26
|
+
super( referenceNode, indexNode );
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Similar to {@link ReferenceNode#reference}, an additional
|
|
30
|
+
* property references to the current node.
|
|
31
|
+
*
|
|
32
|
+
* @type {?(ReferenceBaseNode|ReferenceNode)}
|
|
33
|
+
* @default null
|
|
34
|
+
*/
|
|
35
|
+
this.referenceNode = referenceNode;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* This flag can be used for type testing.
|
|
39
|
+
*
|
|
40
|
+
* @type {boolean}
|
|
41
|
+
* @readonly
|
|
42
|
+
* @default true
|
|
43
|
+
*/
|
|
44
|
+
this.isReferenceElementNode = true;
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* This method is overwritten since the node type is inferred from
|
|
50
|
+
* the uniform type of the reference node.
|
|
51
|
+
*
|
|
52
|
+
* @return {string} The node type.
|
|
53
|
+
*/
|
|
54
|
+
generateNodeType() {
|
|
55
|
+
|
|
56
|
+
return this.referenceNode.uniformType;
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
generate( builder ) {
|
|
61
|
+
|
|
62
|
+
const snippet = super.generate( builder );
|
|
63
|
+
const arrayType = this.referenceNode.getNodeType( builder );
|
|
64
|
+
const elementType = this.getNodeType( builder );
|
|
65
|
+
|
|
66
|
+
return builder.format( snippet, arrayType, elementType );
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export default ReferenceElementNode;
|
|
@@ -6,80 +6,11 @@ import { cubeTexture } from './CubeTextureNode.js';
|
|
|
6
6
|
import { buffer } from './BufferNode.js';
|
|
7
7
|
import { nodeObject } from '../tsl/TSLBase.js';
|
|
8
8
|
import { uniformArray } from './UniformArrayNode.js';
|
|
9
|
-
import
|
|
9
|
+
import ReferenceElementNode from './ReferenceElementNode.js';
|
|
10
10
|
import { warn } from '../../utils.js';
|
|
11
11
|
|
|
12
12
|
// TODO: Avoid duplicated code and use only ReferenceBaseNode or ReferenceNode
|
|
13
13
|
|
|
14
|
-
/**
|
|
15
|
-
* This class is only relevant if the referenced property is array-like.
|
|
16
|
-
* In this case, `ReferenceElementNode` allows to refer to a specific
|
|
17
|
-
* element inside the data structure via an index.
|
|
18
|
-
*
|
|
19
|
-
* @augments ArrayElementNode
|
|
20
|
-
*/
|
|
21
|
-
class ReferenceElementNode extends ArrayElementNode {
|
|
22
|
-
|
|
23
|
-
static get type() {
|
|
24
|
-
|
|
25
|
-
return 'ReferenceElementNode';
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Constructs a new reference element node.
|
|
31
|
-
*
|
|
32
|
-
* @param {?ReferenceNode} referenceNode - The reference node.
|
|
33
|
-
* @param {Node} indexNode - The index node that defines the element access.
|
|
34
|
-
*/
|
|
35
|
-
constructor( referenceNode, indexNode ) {
|
|
36
|
-
|
|
37
|
-
super( referenceNode, indexNode );
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Similar to {@link ReferenceNode#reference}, an additional
|
|
41
|
-
* property references to the current node.
|
|
42
|
-
*
|
|
43
|
-
* @type {?ReferenceNode}
|
|
44
|
-
* @default null
|
|
45
|
-
*/
|
|
46
|
-
this.referenceNode = referenceNode;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* This flag can be used for type testing.
|
|
50
|
-
*
|
|
51
|
-
* @type {boolean}
|
|
52
|
-
* @readonly
|
|
53
|
-
* @default true
|
|
54
|
-
*/
|
|
55
|
-
this.isReferenceElementNode = true;
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* This method is overwritten since the node type is inferred from
|
|
61
|
-
* the uniform type of the reference node.
|
|
62
|
-
*
|
|
63
|
-
* @return {string} The node type.
|
|
64
|
-
*/
|
|
65
|
-
generateNodeType() {
|
|
66
|
-
|
|
67
|
-
return this.referenceNode.uniformType;
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
generate( builder ) {
|
|
72
|
-
|
|
73
|
-
const snippet = super.generate( builder );
|
|
74
|
-
const arrayType = this.referenceNode.getNodeType( builder );
|
|
75
|
-
const elementType = this.getNodeType( builder );
|
|
76
|
-
|
|
77
|
-
return builder.format( snippet, arrayType, elementType );
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
83
14
|
/**
|
|
84
15
|
* This type of node establishes a reference to a property of another object.
|
|
85
16
|
* In this way, the value of the node is automatically linked to the value of
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { Fn, add, uniform } from '../tsl/TSLBase.js';
|
|
2
|
+
import { Fn, add, uniform, int, ivec2, mat3, mat4 } from '../tsl/TSLBase.js';
|
|
3
3
|
import { attribute } from '../core/AttributeNode.js';
|
|
4
4
|
import { OnObjectUpdate } from '../utils/EventNode.js';
|
|
5
5
|
import { normalLocal } from './Normal.js';
|
|
@@ -8,13 +8,87 @@ import { tangentLocal } from './Tangent.js';
|
|
|
8
8
|
import { reference, referenceBuffer } from './ReferenceNode.js';
|
|
9
9
|
import { buffer } from './BufferNode.js';
|
|
10
10
|
import { storage } from './StorageBufferNode.js';
|
|
11
|
+
import { texture } from './TextureNode.js';
|
|
12
|
+
import { textureSize } from './TextureSizeNode.js';
|
|
11
13
|
import { instanceIndex } from '../core/IndexNode.js';
|
|
12
14
|
|
|
13
15
|
import { InstancedBufferAttribute } from '../../core/InstancedBufferAttribute.js';
|
|
16
|
+
import { DataTexture } from '../../textures/DataTexture.js';
|
|
17
|
+
import { RGBAFormat, FloatType } from '../../constants.js';
|
|
14
18
|
|
|
15
19
|
const _skeletonsUpdated = /*@__PURE__*/ new WeakMap();
|
|
16
20
|
const _previousBoneMatricesData = /*@__PURE__*/ new WeakMap();
|
|
17
21
|
|
|
22
|
+
/**
|
|
23
|
+
* Creates an accessor for bone matrices stored in a bone texture.
|
|
24
|
+
*
|
|
25
|
+
* @param {TextureNode} boneTexture - The bone texture node.
|
|
26
|
+
* @returns {Object} An accessor with the same `element()` interface as a buffer node.
|
|
27
|
+
*/
|
|
28
|
+
function getBoneTextureMatrices( boneTexture ) {
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
element: ( i ) => {
|
|
32
|
+
|
|
33
|
+
const size = int( textureSize( boneTexture ).x ).toConst();
|
|
34
|
+
const j = int( i ).mul( 4 ).toConst();
|
|
35
|
+
const y = j.div( size ).toConst();
|
|
36
|
+
const x = j.sub( y.mul( size ) ).toConst();
|
|
37
|
+
|
|
38
|
+
return mat4(
|
|
39
|
+
boneTexture.load( ivec2( x, y ) ),
|
|
40
|
+
boneTexture.load( ivec2( x.add( 1 ), y ) ),
|
|
41
|
+
boneTexture.load( ivec2( x.add( 2 ), y ) ),
|
|
42
|
+
boneTexture.load( ivec2( x.add( 3 ), y ) )
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Creates the bone matrices node. Skeletons that fit within the uniform buffer limit
|
|
52
|
+
* use a uniform buffer, larger skeletons fall back to a bone texture.
|
|
53
|
+
*
|
|
54
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
55
|
+
* @param {Skeleton} skeleton - The skeleton.
|
|
56
|
+
* @returns {Object} The bone matrices node.
|
|
57
|
+
*/
|
|
58
|
+
function getBoneMatricesNode( builder, skeleton ) {
|
|
59
|
+
|
|
60
|
+
let node;
|
|
61
|
+
|
|
62
|
+
const uniformBufferSize = skeleton.bones.length * 16 * 4;
|
|
63
|
+
|
|
64
|
+
if ( uniformBufferSize <= builder.getUniformBufferLimit() ) {
|
|
65
|
+
|
|
66
|
+
node = referenceBuffer( 'skeleton.boneMatrices', 'mat4', skeleton.bones.length );
|
|
67
|
+
|
|
68
|
+
} else {
|
|
69
|
+
|
|
70
|
+
if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
|
|
71
|
+
|
|
72
|
+
const boneTexture = texture( skeleton.boneTexture );
|
|
73
|
+
|
|
74
|
+
OnObjectUpdate( ( { object } ) => {
|
|
75
|
+
|
|
76
|
+
const skeleton = object.skeleton;
|
|
77
|
+
|
|
78
|
+
if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
|
|
79
|
+
|
|
80
|
+
boneTexture.value = skeleton.boneTexture;
|
|
81
|
+
|
|
82
|
+
} );
|
|
83
|
+
|
|
84
|
+
node = getBoneTextureMatrices( boneTexture );
|
|
85
|
+
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return node;
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
18
92
|
/**
|
|
19
93
|
* Computes the skinned position by applying bone matrices based on weights.
|
|
20
94
|
*
|
|
@@ -78,8 +152,10 @@ function getSkinnedNormalAndTangent( boneMatrices, normal, tangent, bindMatrix,
|
|
|
78
152
|
|
|
79
153
|
skinMatrix = bindMatrixInverse.mul( skinMatrix ).mul( bindMatrix );
|
|
80
154
|
|
|
81
|
-
const
|
|
82
|
-
|
|
155
|
+
const skinMatrix3 = mat3( skinMatrix );
|
|
156
|
+
|
|
157
|
+
const skinNormal = skinMatrix3.mul( normal );
|
|
158
|
+
const skinTangent = skinMatrix3.mul( tangent );
|
|
83
159
|
|
|
84
160
|
return { skinNormal, skinTangent };
|
|
85
161
|
|
|
@@ -89,6 +165,7 @@ function getSkinnedNormalAndTangent( boneMatrices, normal, tangent, bindMatrix,
|
|
|
89
165
|
* Retrieves or initializes the previous frame skinned position node for motion vectors.
|
|
90
166
|
* Uses a WeakMap to cache previous frame bone matrix arrays and their TSL buffer nodes.
|
|
91
167
|
*
|
|
168
|
+
* @param {NodeBuilder} builder - The current node builder.
|
|
92
169
|
* @param {SkinnedMesh} skinnedMesh - The skinned mesh.
|
|
93
170
|
* @param {Node<mat4>} bindMatrixNode - The bind matrix node.
|
|
94
171
|
* @param {Node<mat4>} bindMatrixInverseNode - The inverse bind matrix node.
|
|
@@ -96,7 +173,7 @@ function getSkinnedNormalAndTangent( boneMatrices, normal, tangent, bindMatrix,
|
|
|
96
173
|
* @param {Node<vec4>} skinWeightNode - The skin weight attribute.
|
|
97
174
|
* @returns {Node<vec3>} The skinned position from the previous frame.
|
|
98
175
|
*/
|
|
99
|
-
function getPreviousSkinnedPosition( skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode ) {
|
|
176
|
+
function getPreviousSkinnedPosition( builder, skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode ) {
|
|
100
177
|
|
|
101
178
|
const skeleton = skinnedMesh.skeleton;
|
|
102
179
|
|
|
@@ -106,12 +183,35 @@ function getPreviousSkinnedPosition( skinnedMesh, bindMatrixNode, bindMatrixInve
|
|
|
106
183
|
|
|
107
184
|
skeleton.update();
|
|
108
185
|
|
|
109
|
-
const
|
|
186
|
+
const uniformBufferSize = skeleton.bones.length * 16 * 4;
|
|
187
|
+
|
|
188
|
+
if ( uniformBufferSize <= builder.getUniformBufferLimit() ) {
|
|
189
|
+
|
|
190
|
+
const previousBoneMatrices = new Float32Array( skeleton.boneMatrices );
|
|
191
|
+
|
|
192
|
+
data = {
|
|
193
|
+
previousBoneMatrices,
|
|
194
|
+
previousBoneTexture: null,
|
|
195
|
+
node: buffer( previousBoneMatrices, 'mat4', skeleton.bones.length )
|
|
196
|
+
};
|
|
110
197
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
198
|
+
} else {
|
|
199
|
+
|
|
200
|
+
if ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();
|
|
201
|
+
|
|
202
|
+
const { width, height } = skeleton.boneTexture.image;
|
|
203
|
+
|
|
204
|
+
const previousBoneMatrices = new Float32Array( skeleton.boneMatrices );
|
|
205
|
+
const previousBoneTexture = new DataTexture( previousBoneMatrices, width, height, RGBAFormat, FloatType );
|
|
206
|
+
previousBoneTexture.needsUpdate = true;
|
|
207
|
+
|
|
208
|
+
data = {
|
|
209
|
+
previousBoneMatrices,
|
|
210
|
+
previousBoneTexture,
|
|
211
|
+
node: getBoneTextureMatrices( texture( previousBoneTexture ) )
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
}
|
|
115
215
|
|
|
116
216
|
_previousBoneMatricesData.set( skeleton, data );
|
|
117
217
|
|
|
@@ -135,7 +235,7 @@ export const skinning = /*@__PURE__*/ Fn( ( [ skinnedMesh ], builder ) => {
|
|
|
135
235
|
const skinWeightNode = attribute( 'skinWeight', 'vec4' );
|
|
136
236
|
const bindMatrixNode = reference( 'bindMatrix', 'mat4' );
|
|
137
237
|
const bindMatrixInverseNode = reference( 'bindMatrixInverse', 'mat4' );
|
|
138
|
-
const boneMatricesNode =
|
|
238
|
+
const boneMatricesNode = getBoneMatricesNode( builder, skinnedMesh.skeleton );
|
|
139
239
|
|
|
140
240
|
OnObjectUpdate( ( { object, frameId } ) => {
|
|
141
241
|
|
|
@@ -151,6 +251,12 @@ export const skinning = /*@__PURE__*/ Fn( ( [ skinnedMesh ], builder ) => {
|
|
|
151
251
|
|
|
152
252
|
skeletonData.previousBoneMatrices.set( skeleton.boneMatrices );
|
|
153
253
|
|
|
254
|
+
if ( skeletonData.previousBoneTexture !== null ) {
|
|
255
|
+
|
|
256
|
+
skeletonData.previousBoneTexture.needsUpdate = true;
|
|
257
|
+
|
|
258
|
+
}
|
|
259
|
+
|
|
154
260
|
}
|
|
155
261
|
|
|
156
262
|
skeleton.update();
|
|
@@ -161,7 +267,7 @@ export const skinning = /*@__PURE__*/ Fn( ( [ skinnedMesh ], builder ) => {
|
|
|
161
267
|
|
|
162
268
|
if ( builder.needsPreviousData() ) {
|
|
163
269
|
|
|
164
|
-
const previousSkinnedPosition = getPreviousSkinnedPosition( skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode );
|
|
270
|
+
const previousSkinnedPosition = getPreviousSkinnedPosition( builder, skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode );
|
|
165
271
|
|
|
166
272
|
positionPrevious.assign( previousSkinnedPosition );
|
|
167
273
|
|
|
@@ -218,6 +324,12 @@ export const computeSkinning = /*@__PURE__*/ Fn( ( [ skinnedMesh, toPosition = n
|
|
|
218
324
|
|
|
219
325
|
state.previousBoneMatrices.set( skeleton.boneMatrices );
|
|
220
326
|
|
|
327
|
+
if ( state.previousBoneTexture !== null ) {
|
|
328
|
+
|
|
329
|
+
state.previousBoneTexture.needsUpdate = true;
|
|
330
|
+
|
|
331
|
+
}
|
|
332
|
+
|
|
221
333
|
}
|
|
222
334
|
|
|
223
335
|
skeleton.update();
|
|
@@ -228,7 +340,7 @@ export const computeSkinning = /*@__PURE__*/ Fn( ( [ skinnedMesh, toPosition = n
|
|
|
228
340
|
|
|
229
341
|
if ( builder.needsPreviousData() ) {
|
|
230
342
|
|
|
231
|
-
const previousSkinnedPosition = getPreviousSkinnedPosition( skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode );
|
|
343
|
+
const previousSkinnedPosition = getPreviousSkinnedPosition( builder, skinnedMesh, bindMatrixNode, bindMatrixInverseNode, skinIndexNode, skinWeightNode );
|
|
232
344
|
|
|
233
345
|
positionPrevious.assign( previousSkinnedPosition );
|
|
234
346
|
|