@gnsx/three 0.185.16 → 0.186.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +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,12 +1,10 @@
|
|
|
1
1
|
import NodeMaterial from '../../../materials/nodes/NodeMaterial.js';
|
|
2
|
-
import {
|
|
2
|
+
import { sphericalGaussianBlur, ggxConvolution } from '../../../nodes/pmrem/PMREMUtils.js';
|
|
3
3
|
import { equirectUV } from '../../../nodes/utils/EquirectUV.js';
|
|
4
4
|
import { uniform } from '../../../nodes/core/UniformNode.js';
|
|
5
|
-
import { uniformArray } from '../../../nodes/accessors/UniformArrayNode.js';
|
|
6
5
|
import { texture } from '../../../nodes/accessors/TextureNode.js';
|
|
7
6
|
import { cubeTexture } from '../../../nodes/accessors/CubeTextureNode.js';
|
|
8
|
-
import { float,
|
|
9
|
-
import { uv } from '../../../nodes/accessors/UV.js';
|
|
7
|
+
import { float, int, uint } from '../../../nodes/tsl/TSLBase.js';
|
|
10
8
|
import { attribute } from '../../../nodes/core/AttributeNode.js';
|
|
11
9
|
|
|
12
10
|
import { OrthographicCamera } from '../../../cameras/OrthographicCamera.js';
|
|
@@ -30,21 +28,20 @@ import {
|
|
|
30
28
|
BackSide,
|
|
31
29
|
LinearSRGBColorSpace
|
|
32
30
|
} from '../../../constants.js';
|
|
33
|
-
import {
|
|
31
|
+
import { warnOnce } from '../../../utils.js';
|
|
34
32
|
|
|
35
33
|
const LOD_MIN = 4;
|
|
36
34
|
|
|
37
|
-
// The
|
|
35
|
+
// The number of extra mips.
|
|
38
36
|
// Used for scene blur in fromScene() method.
|
|
39
|
-
const
|
|
37
|
+
const EXTRA_LODS = 6;
|
|
40
38
|
|
|
41
|
-
// The
|
|
42
|
-
// samples and exit early, but not recompile the shader.
|
|
39
|
+
// The number of spiral samples per blur pass.
|
|
43
40
|
// Used for scene blur in fromScene() method.
|
|
44
|
-
const
|
|
41
|
+
const BLUR_SAMPLES = 20;
|
|
45
42
|
|
|
46
43
|
// GGX VNDF importance sampling configuration
|
|
47
|
-
const GGX_SAMPLES =
|
|
44
|
+
const GGX_SAMPLES = 256;
|
|
48
45
|
|
|
49
46
|
const _flatCamera = /*@__PURE__*/ new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
|
|
50
47
|
const _cubeCamera = /*@__PURE__*/ new PerspectiveCamera( 90, 1 );
|
|
@@ -54,6 +51,7 @@ let _oldActiveCubeFace = 0;
|
|
|
54
51
|
let _oldActiveMipmapLevel = 0;
|
|
55
52
|
|
|
56
53
|
const _origin = /*@__PURE__*/ new Vector3();
|
|
54
|
+
const _direction = /*@__PURE__*/ new Vector3();
|
|
57
55
|
|
|
58
56
|
// maps blur materials to their uniforms dictionary
|
|
59
57
|
|
|
@@ -65,8 +63,7 @@ const _faceLib = [
|
|
|
65
63
|
0, 4, 2
|
|
66
64
|
];
|
|
67
65
|
|
|
68
|
-
const
|
|
69
|
-
const _outputDirection = /*@__PURE__*/ vec3( _direction.x, _direction.y, _direction.z );
|
|
66
|
+
const _outputDirection = /*@__PURE__*/ attribute( 'outputDirection' ).normalize();
|
|
70
67
|
|
|
71
68
|
/**
|
|
72
69
|
* This class generates a Prefiltered, Mipmapped Radiance Environment Map
|
|
@@ -99,7 +96,6 @@ class PMREMGenerator {
|
|
|
99
96
|
this._lodMax = 0;
|
|
100
97
|
this._cubeSize = 0;
|
|
101
98
|
this._sizeLods = [];
|
|
102
|
-
this._sigmas = [];
|
|
103
99
|
this._lodMeshes = [];
|
|
104
100
|
|
|
105
101
|
this._blurMaterial = null;
|
|
@@ -129,7 +125,7 @@ class PMREMGenerator {
|
|
|
129
125
|
* @param {number} [far=100] - The far plane distance.
|
|
130
126
|
* @param {Object} [options={}] - The configuration options.
|
|
131
127
|
* @param {number} [options.size=256] - The texture size of the PMREM.
|
|
132
|
-
* @param {Vector3} [options.
|
|
128
|
+
* @param {Vector3} [options.position=origin] - The position of the internal cube camera that renders the scene.
|
|
133
129
|
* @param {?RenderTarget} [options.renderTarget=null] - The render target to use.
|
|
134
130
|
* @return {RenderTarget} The resulting PMREM.
|
|
135
131
|
* @see {@link PMREMGenerator#fromScene}
|
|
@@ -433,7 +429,7 @@ class PMREMGenerator {
|
|
|
433
429
|
this._pingPongRenderTarget = _createRenderTarget( renderTarget.width, renderTarget.height );
|
|
434
430
|
|
|
435
431
|
const { _lodMax } = this;
|
|
436
|
-
( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods
|
|
432
|
+
( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods } = _createPlanes( _lodMax ) );
|
|
437
433
|
|
|
438
434
|
this._blurMaterial = _getBlurShader( _lodMax, renderTarget.width, renderTarget.height );
|
|
439
435
|
this._ggxMaterial = _getGGXShader( _lodMax, renderTarget.width, renderTarget.height );
|
|
@@ -638,7 +634,7 @@ class PMREMGenerator {
|
|
|
638
634
|
const incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );
|
|
639
635
|
|
|
640
636
|
// Apply blur strength mapping for better quality across the roughness range
|
|
641
|
-
const blurStrength =
|
|
637
|
+
const blurStrength = targetRoughness * 1.25;
|
|
642
638
|
const adjustedRoughness = incrementalRoughness * blurStrength;
|
|
643
639
|
|
|
644
640
|
// Calculate viewport position based on output LOD level
|
|
@@ -670,11 +666,9 @@ class PMREMGenerator {
|
|
|
670
666
|
}
|
|
671
667
|
|
|
672
668
|
/**
|
|
673
|
-
* This is a two-pass Gaussian blur for a cubemap.
|
|
674
|
-
*
|
|
675
|
-
* the
|
|
676
|
-
* the poles) to approximate the orthogonally-separable blur. It is least
|
|
677
|
-
* accurate at the poles, but still does a decent job.
|
|
669
|
+
* This is a two-pass Gaussian blur for a cubemap. Each pass importance-samples
|
|
670
|
+
* the Gaussian along a spiral kernel (Golden Angle), which distributes samples
|
|
671
|
+
* isotropically on the sphere (no pole artifacts).
|
|
678
672
|
*
|
|
679
673
|
* Used for initial scene blur in fromScene() method when sigma > 0.
|
|
680
674
|
*
|
|
@@ -683,110 +677,39 @@ class PMREMGenerator {
|
|
|
683
677
|
* @param {number} lodIn - The input level-of-detail.
|
|
684
678
|
* @param {number} lodOut - The output level-of-detail.
|
|
685
679
|
* @param {number} sigma - The blur radius in radians.
|
|
686
|
-
* @param {Vector3} [poleAxis] - The pole axis.
|
|
687
680
|
*/
|
|
688
|
-
_blur( cubeUVRenderTarget, lodIn, lodOut, sigma
|
|
681
|
+
_blur( cubeUVRenderTarget, lodIn, lodOut, sigma ) {
|
|
689
682
|
|
|
690
683
|
const pingPongRenderTarget = this._pingPongRenderTarget;
|
|
691
684
|
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
poleAxis );
|
|
700
|
-
|
|
701
|
-
this._halfBlur(
|
|
702
|
-
pingPongRenderTarget,
|
|
703
|
-
cubeUVRenderTarget,
|
|
704
|
-
lodOut,
|
|
705
|
-
lodOut,
|
|
706
|
-
sigma,
|
|
707
|
-
'longitudinal',
|
|
708
|
-
poleAxis );
|
|
685
|
+
// Two passes of sigma / sqrt( 2 ) compose to a blur of sigma while squaring
|
|
686
|
+
// the effective sample count. Sigmas beyond PI are visually indistinguishable
|
|
687
|
+
// from a uniform blur, so clamp to keep the shader math finite.
|
|
688
|
+
const blurSigma = Math.min( sigma, Math.PI ) / Math.SQRT2;
|
|
689
|
+
|
|
690
|
+
this._blurPass( cubeUVRenderTarget, pingPongRenderTarget, lodIn, lodOut, blurSigma );
|
|
691
|
+
this._blurPass( pingPongRenderTarget, cubeUVRenderTarget, lodOut, lodOut, blurSigma );
|
|
709
692
|
|
|
710
693
|
}
|
|
711
694
|
|
|
712
|
-
|
|
695
|
+
_blurPass( targetIn, targetOut, lodIn, lodOut, sigmaRadians ) {
|
|
713
696
|
|
|
714
697
|
const renderer = this._renderer;
|
|
715
698
|
const blurMaterial = this._blurMaterial;
|
|
716
699
|
|
|
717
|
-
if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {
|
|
718
|
-
|
|
719
|
-
error( 'blur direction must be either latitudinal or longitudinal!' );
|
|
720
|
-
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
// Number of standard deviations at which to cut off the discrete approximation.
|
|
724
|
-
const STANDARD_DEVIATIONS = 3;
|
|
725
|
-
|
|
726
700
|
const blurMesh = this._lodMeshes[ lodOut ];
|
|
727
701
|
blurMesh.material = blurMaterial;
|
|
728
702
|
|
|
729
703
|
const blurUniforms = _uniformsMap.get( blurMaterial );
|
|
730
704
|
|
|
731
|
-
const pixels = this._sizeLods[ lodIn ] - 1;
|
|
732
|
-
const radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );
|
|
733
|
-
const sigmaPixels = sigmaRadians / radiansPerPixel;
|
|
734
|
-
const samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;
|
|
735
|
-
|
|
736
|
-
if ( samples > MAX_SAMPLES ) {
|
|
737
|
-
|
|
738
|
-
warn( `sigmaRadians, ${
|
|
739
|
-
sigmaRadians}, is too large and will clip, as it requested ${
|
|
740
|
-
samples} samples when the maximum is set to ${MAX_SAMPLES}` );
|
|
741
|
-
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
const weights = [];
|
|
745
|
-
let sum = 0;
|
|
746
|
-
|
|
747
|
-
for ( let i = 0; i < MAX_SAMPLES; ++ i ) {
|
|
748
|
-
|
|
749
|
-
const x = i / sigmaPixels;
|
|
750
|
-
const weight = Math.exp( - x * x / 2 );
|
|
751
|
-
weights.push( weight );
|
|
752
|
-
|
|
753
|
-
if ( i === 0 ) {
|
|
754
|
-
|
|
755
|
-
sum += weight;
|
|
756
|
-
|
|
757
|
-
} else if ( i < samples ) {
|
|
758
|
-
|
|
759
|
-
sum += 2 * weight;
|
|
760
|
-
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
for ( let i = 0; i < weights.length; i ++ ) {
|
|
766
|
-
|
|
767
|
-
weights[ i ] = weights[ i ] / sum;
|
|
768
|
-
|
|
769
|
-
}
|
|
770
|
-
|
|
771
705
|
targetIn.texture.frame = ( targetIn.texture.frame || 0 ) + 1;
|
|
772
706
|
|
|
773
707
|
blurUniforms.envMap.value = targetIn.texture;
|
|
774
|
-
blurUniforms.
|
|
775
|
-
blurUniforms.
|
|
776
|
-
blurUniforms.latitudinal.value = direction === 'latitudinal' ? 1 : 0;
|
|
777
|
-
|
|
778
|
-
if ( poleAxis ) {
|
|
779
|
-
|
|
780
|
-
blurUniforms.poleAxis.value = poleAxis;
|
|
781
|
-
|
|
782
|
-
}
|
|
783
|
-
|
|
784
|
-
const { _lodMax } = this;
|
|
785
|
-
blurUniforms.dTheta.value = radiansPerPixel;
|
|
786
|
-
blurUniforms.mipInt.value = _lodMax - lodIn;
|
|
708
|
+
blurUniforms.sigma.value = sigmaRadians;
|
|
709
|
+
blurUniforms.mipInt.value = this._lodMax - lodIn;
|
|
787
710
|
|
|
788
711
|
const outputSize = this._sizeLods[ lodOut ];
|
|
789
|
-
const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );
|
|
712
|
+
const x = 3 * outputSize * ( lodOut > this._lodMax - LOD_MIN ? lodOut - this._lodMax + LOD_MIN : 0 );
|
|
790
713
|
const y = 4 * ( this._cubeSize - outputSize );
|
|
791
714
|
|
|
792
715
|
this._setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );
|
|
@@ -817,31 +740,18 @@ class PMREMGenerator {
|
|
|
817
740
|
function _createPlanes( lodMax ) {
|
|
818
741
|
|
|
819
742
|
const sizeLods = [];
|
|
820
|
-
const sigmas = [];
|
|
821
743
|
const lodMeshes = [];
|
|
822
744
|
|
|
823
745
|
let lod = lodMax;
|
|
824
746
|
|
|
825
|
-
const totalLods = lodMax - LOD_MIN + 1 +
|
|
747
|
+
const totalLods = lodMax - LOD_MIN + 1 + EXTRA_LODS;
|
|
826
748
|
|
|
827
749
|
for ( let i = 0; i < totalLods; i ++ ) {
|
|
828
750
|
|
|
829
751
|
const sizeLod = Math.pow( 2, lod );
|
|
830
752
|
sizeLods.push( sizeLod );
|
|
831
|
-
let sigma = 1.0 / sizeLod;
|
|
832
|
-
|
|
833
|
-
if ( i > lodMax - LOD_MIN ) {
|
|
834
|
-
|
|
835
|
-
sigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];
|
|
836
|
-
|
|
837
|
-
} else if ( i === 0 ) {
|
|
838
|
-
|
|
839
|
-
sigma = 0;
|
|
840
|
-
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
sigmas.push( sigma );
|
|
844
753
|
|
|
754
|
+
// UVs overshoot the face by one texel to bake the CubeUV border into the directions.
|
|
845
755
|
const texelSize = 1.0 / ( sizeLod - 2 );
|
|
846
756
|
const min = - texelSize;
|
|
847
757
|
const max = 1 + texelSize;
|
|
@@ -850,12 +760,9 @@ function _createPlanes( lodMax ) {
|
|
|
850
760
|
const cubeFaces = 6;
|
|
851
761
|
const vertices = 6;
|
|
852
762
|
const positionSize = 3;
|
|
853
|
-
const uvSize = 2;
|
|
854
|
-
const faceIndexSize = 1;
|
|
855
763
|
|
|
856
764
|
const position = new Float32Array( positionSize * vertices * cubeFaces );
|
|
857
|
-
const
|
|
858
|
-
const faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );
|
|
765
|
+
const outputDirection = new Float32Array( positionSize * vertices * cubeFaces );
|
|
859
766
|
|
|
860
767
|
for ( let face = 0; face < cubeFaces; face ++ ) {
|
|
861
768
|
|
|
@@ -872,16 +779,48 @@ function _createPlanes( lodMax ) {
|
|
|
872
779
|
|
|
873
780
|
const faceIdx = _faceLib[ face ];
|
|
874
781
|
position.set( coordinates, positionSize * vertices * faceIdx );
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
782
|
+
|
|
783
|
+
for ( let vertex = 0; vertex < vertices; vertex ++ ) {
|
|
784
|
+
|
|
785
|
+
const u = uv1[ vertex * 2 ] * 2 - 1;
|
|
786
|
+
const v = uv1[ vertex * 2 + 1 ] * 2 - 1;
|
|
787
|
+
|
|
788
|
+
// RH coordinate system; PMREM face-indexing convention
|
|
789
|
+
if ( faceIdx === 0 ) {
|
|
790
|
+
|
|
791
|
+
_direction.set( 1, v, u ); // pos x
|
|
792
|
+
|
|
793
|
+
} else if ( faceIdx === 1 ) {
|
|
794
|
+
|
|
795
|
+
_direction.set( - u, 1, - v ); // pos y
|
|
796
|
+
|
|
797
|
+
} else if ( faceIdx === 2 ) {
|
|
798
|
+
|
|
799
|
+
_direction.set( - u, v, 1 ); // pos z
|
|
800
|
+
|
|
801
|
+
} else if ( faceIdx === 3 ) {
|
|
802
|
+
|
|
803
|
+
_direction.set( - 1, v, - u ); // neg x
|
|
804
|
+
|
|
805
|
+
} else if ( faceIdx === 4 ) {
|
|
806
|
+
|
|
807
|
+
_direction.set( - u, - 1, v ); // neg y
|
|
808
|
+
|
|
809
|
+
} else {
|
|
810
|
+
|
|
811
|
+
_direction.set( u, v, - 1 ); // neg z
|
|
812
|
+
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
_direction.toArray( outputDirection, ( faceIdx * vertices + vertex ) * positionSize );
|
|
816
|
+
|
|
817
|
+
}
|
|
878
818
|
|
|
879
819
|
}
|
|
880
820
|
|
|
881
821
|
const planes = new BufferGeometry();
|
|
882
822
|
planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );
|
|
883
|
-
planes.setAttribute( '
|
|
884
|
-
planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );
|
|
823
|
+
planes.setAttribute( 'outputDirection', new BufferAttribute( outputDirection, positionSize ) );
|
|
885
824
|
lodMeshes.push( new Mesh( planes, null ) );
|
|
886
825
|
|
|
887
826
|
if ( lod > LOD_MIN ) {
|
|
@@ -892,7 +831,7 @@ function _createPlanes( lodMax ) {
|
|
|
892
831
|
|
|
893
832
|
}
|
|
894
833
|
|
|
895
|
-
return { lodMeshes, sizeLods
|
|
834
|
+
return { lodMeshes, sizeLods };
|
|
896
835
|
|
|
897
836
|
}
|
|
898
837
|
|
|
@@ -931,27 +870,16 @@ function _getMaterial( type ) {
|
|
|
931
870
|
|
|
932
871
|
function _getBlurShader( lodMax, width, height ) {
|
|
933
872
|
|
|
934
|
-
const weights = uniformArray( new Array( MAX_SAMPLES ).fill( 0 ) );
|
|
935
|
-
const poleAxis = uniform( new Vector3( 0, 1, 0 ) );
|
|
936
|
-
const dTheta = uniform( 0 );
|
|
937
|
-
const n = float( MAX_SAMPLES );
|
|
938
|
-
const latitudinal = uniform( 0 ); // false, bool
|
|
939
|
-
const samples = uniform( 1 ); // int
|
|
940
873
|
const envMap = texture();
|
|
874
|
+
const sigma = uniform( 0 );
|
|
941
875
|
const mipInt = uniform( 0 ); // int
|
|
942
876
|
const CUBEUV_TEXEL_WIDTH = float( 1 / width );
|
|
943
877
|
const CUBEUV_TEXEL_HEIGHT = float( 1 / height );
|
|
944
878
|
const CUBEUV_MAX_MIP = float( lodMax );
|
|
945
879
|
|
|
946
880
|
const materialUniforms = {
|
|
947
|
-
n,
|
|
948
|
-
latitudinal,
|
|
949
|
-
weights,
|
|
950
|
-
poleAxis,
|
|
951
|
-
outputDirection: _outputDirection,
|
|
952
|
-
dTheta,
|
|
953
|
-
samples,
|
|
954
881
|
envMap,
|
|
882
|
+
sigma,
|
|
955
883
|
mipInt,
|
|
956
884
|
CUBEUV_TEXEL_WIDTH,
|
|
957
885
|
CUBEUV_TEXEL_HEIGHT,
|
|
@@ -959,7 +887,11 @@ function _getBlurShader( lodMax, width, height ) {
|
|
|
959
887
|
};
|
|
960
888
|
|
|
961
889
|
const material = _getMaterial( 'blur' );
|
|
962
|
-
material.fragmentNode =
|
|
890
|
+
material.fragmentNode = sphericalGaussianBlur( {
|
|
891
|
+
...materialUniforms,
|
|
892
|
+
outputDirection: _outputDirection,
|
|
893
|
+
SAMPLES: int( BLUR_SAMPLES )
|
|
894
|
+
} );
|
|
963
895
|
|
|
964
896
|
_uniformsMap.set( material, materialUniforms );
|
|
965
897
|
|
|
@@ -165,6 +165,10 @@ class NodeManager extends DataMap {
|
|
|
165
165
|
_createNodeBuilder( renderObject, material ) {
|
|
166
166
|
|
|
167
167
|
const nodeBuilder = this.backend.createNodeBuilder( renderObject.object, this.renderer );
|
|
168
|
+
const onNodeBuilderCreated = this.renderer.debug.onNodeBuilderCreated;
|
|
169
|
+
|
|
170
|
+
if ( onNodeBuilderCreated !== null ) onNodeBuilderCreated( nodeBuilder, renderObject );
|
|
171
|
+
|
|
168
172
|
nodeBuilder.scene = renderObject.scene;
|
|
169
173
|
nodeBuilder.material = material;
|
|
170
174
|
nodeBuilder.camera = renderObject.camera;
|
|
@@ -446,9 +450,10 @@ class NodeManager extends DataMap {
|
|
|
446
450
|
* Returns a node builder state for the given compute node.
|
|
447
451
|
*
|
|
448
452
|
* @param {Node} computeNode - The compute node.
|
|
449
|
-
* @
|
|
453
|
+
* @param {boolean} [useAsync=false] - Whether to use async build with yielding.
|
|
454
|
+
* @return {NodeBuilderState|Promise<NodeBuilderState>} The node builder state (or Promise if async).
|
|
450
455
|
*/
|
|
451
|
-
getForCompute( computeNode ) {
|
|
456
|
+
getForCompute( computeNode, useAsync = false ) {
|
|
452
457
|
|
|
453
458
|
const computeData = this.get( computeNode );
|
|
454
459
|
|
|
@@ -456,7 +461,28 @@ class NodeManager extends DataMap {
|
|
|
456
461
|
|
|
457
462
|
if ( nodeBuilderState === undefined || computeData.version !== computeNode.version ) {
|
|
458
463
|
|
|
459
|
-
const nodeBuilder = this.backend.createNodeBuilder(
|
|
464
|
+
const nodeBuilder = this.backend.createNodeBuilder( null, this.renderer );
|
|
465
|
+
nodeBuilder.compute = computeNode;
|
|
466
|
+
|
|
467
|
+
const onNodeBuilderCreated = this.renderer.debug.onNodeBuilderCreated;
|
|
468
|
+
|
|
469
|
+
if ( onNodeBuilderCreated !== null ) onNodeBuilderCreated( nodeBuilder, computeNode );
|
|
470
|
+
|
|
471
|
+
if ( useAsync ) {
|
|
472
|
+
|
|
473
|
+
return nodeBuilder.buildAsync().then( () => {
|
|
474
|
+
|
|
475
|
+
nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
|
|
476
|
+
|
|
477
|
+
computeData.nodeBuilderState = nodeBuilderState;
|
|
478
|
+
computeData.version = computeNode.version;
|
|
479
|
+
|
|
480
|
+
return nodeBuilderState;
|
|
481
|
+
|
|
482
|
+
} );
|
|
483
|
+
|
|
484
|
+
}
|
|
485
|
+
|
|
460
486
|
nodeBuilder.build();
|
|
461
487
|
|
|
462
488
|
nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
|
|
@@ -470,6 +496,27 @@ class NodeManager extends DataMap {
|
|
|
470
496
|
|
|
471
497
|
}
|
|
472
498
|
|
|
499
|
+
/**
|
|
500
|
+
* Async version of getForCompute() that yields to main thread during build.
|
|
501
|
+
* Use this in compileComputeAsync() to prevent blocking the main thread.
|
|
502
|
+
*
|
|
503
|
+
* @param {Node} computeNode - The compute node.
|
|
504
|
+
* @return {Promise<NodeBuilderState>} A promise that resolves to the node builder state.
|
|
505
|
+
*/
|
|
506
|
+
getForComputeAsync( computeNode ) {
|
|
507
|
+
|
|
508
|
+
const result = this.getForCompute( computeNode, true );
|
|
509
|
+
|
|
510
|
+
if ( result.then ) {
|
|
511
|
+
|
|
512
|
+
return result;
|
|
513
|
+
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
return Promise.resolve( result );
|
|
517
|
+
|
|
518
|
+
}
|
|
519
|
+
|
|
473
520
|
/**
|
|
474
521
|
* Creates a node builder state for the given node builder.
|
|
475
522
|
*
|
|
@@ -756,6 +803,27 @@ class NodeManager extends DataMap {
|
|
|
756
803
|
|
|
757
804
|
if ( node === undefined || forceUpdate ) {
|
|
758
805
|
|
|
806
|
+
if ( node === undefined && object.isTexture === true ) {
|
|
807
|
+
|
|
808
|
+
const onTextureDispose = () => {
|
|
809
|
+
|
|
810
|
+
object.removeEventListener( 'dispose', onTextureDispose );
|
|
811
|
+
|
|
812
|
+
const node = nodeCache.get( object );
|
|
813
|
+
|
|
814
|
+
if ( node !== undefined ) {
|
|
815
|
+
|
|
816
|
+
nodeCache.delete( object );
|
|
817
|
+
node.dispose();
|
|
818
|
+
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
};
|
|
822
|
+
|
|
823
|
+
object.addEventListener( 'dispose', onTextureDispose );
|
|
824
|
+
|
|
825
|
+
}
|
|
826
|
+
|
|
759
827
|
node = callback();
|
|
760
828
|
nodeCache.set( object, node );
|
|
761
829
|
|
|
@@ -866,7 +934,18 @@ class NodeManager extends DataMap {
|
|
|
866
934
|
|
|
867
935
|
}
|
|
868
936
|
|
|
869
|
-
|
|
937
|
+
/**
|
|
938
|
+
* Returns a node frame configured with the given parameters.
|
|
939
|
+
*
|
|
940
|
+
* @param {Renderer} [renderer=this.renderer] - The renderer.
|
|
941
|
+
* @param {?Scene} [scene=null] - The scene.
|
|
942
|
+
* @param {?Object3D} [object=null] - The object.
|
|
943
|
+
* @param {?Camera} [camera=null] - The camera.
|
|
944
|
+
* @param {?Material} [material=null] - The material.
|
|
945
|
+
* @param {?Node} [compute=null] - The compute node.
|
|
946
|
+
* @return {NodeFrame} The node frame.
|
|
947
|
+
*/
|
|
948
|
+
getNodeFrame( renderer = this.renderer, scene = null, object = null, camera = null, material = null, compute = null ) {
|
|
870
949
|
|
|
871
950
|
const nodeFrame = this.nodeFrame;
|
|
872
951
|
nodeFrame.renderer = renderer;
|
|
@@ -874,17 +953,36 @@ class NodeManager extends DataMap {
|
|
|
874
953
|
nodeFrame.object = object;
|
|
875
954
|
nodeFrame.camera = camera;
|
|
876
955
|
nodeFrame.material = material;
|
|
956
|
+
nodeFrame.compute = compute;
|
|
877
957
|
|
|
878
958
|
return nodeFrame;
|
|
879
959
|
|
|
880
960
|
}
|
|
881
961
|
|
|
962
|
+
/**
|
|
963
|
+
* Returns a node frame configured for the given render object.
|
|
964
|
+
*
|
|
965
|
+
* @param {RenderObject} renderObject - The render object.
|
|
966
|
+
* @return {NodeFrame} The node frame.
|
|
967
|
+
*/
|
|
882
968
|
getNodeFrameForRender( renderObject ) {
|
|
883
969
|
|
|
884
970
|
return this.getNodeFrame( renderObject.renderer, renderObject.scene, renderObject.object, renderObject.camera, renderObject.material );
|
|
885
971
|
|
|
886
972
|
}
|
|
887
973
|
|
|
974
|
+
/**
|
|
975
|
+
* Returns a node frame configured for the given compute node.
|
|
976
|
+
*
|
|
977
|
+
* @param {Node} computeNode - The compute node.
|
|
978
|
+
* @return {NodeFrame} The node frame.
|
|
979
|
+
*/
|
|
980
|
+
getNodeFrameForCompute( computeNode ) {
|
|
981
|
+
|
|
982
|
+
return this.getNodeFrame( this.renderer, null, null, null, null, computeNode );
|
|
983
|
+
|
|
984
|
+
}
|
|
985
|
+
|
|
888
986
|
/**
|
|
889
987
|
* Returns the current output cache key.
|
|
890
988
|
*
|
|
@@ -985,6 +1083,46 @@ class NodeManager extends DataMap {
|
|
|
985
1083
|
|
|
986
1084
|
}
|
|
987
1085
|
|
|
1086
|
+
/**
|
|
1087
|
+
* Triggers the call of `updateBefore()` methods
|
|
1088
|
+
* for all nodes of the given compute node.
|
|
1089
|
+
*
|
|
1090
|
+
* @param {Node} computeNode - The compute node.
|
|
1091
|
+
*/
|
|
1092
|
+
updateBeforeForCompute( computeNode ) {
|
|
1093
|
+
|
|
1094
|
+
const nodeBuilder = this.getForCompute( computeNode );
|
|
1095
|
+
|
|
1096
|
+
for ( const node of nodeBuilder.updateBeforeNodes ) {
|
|
1097
|
+
|
|
1098
|
+
// update frame state for each node
|
|
1099
|
+
|
|
1100
|
+
this.getNodeFrameForCompute( computeNode ).updateBeforeNode( node );
|
|
1101
|
+
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
/**
|
|
1107
|
+
* Triggers the call of `updateAfter()` methods
|
|
1108
|
+
* for all nodes of the given compute node.
|
|
1109
|
+
*
|
|
1110
|
+
* @param {Node} computeNode - The compute node.
|
|
1111
|
+
*/
|
|
1112
|
+
updateAfterForCompute( computeNode ) {
|
|
1113
|
+
|
|
1114
|
+
const nodeBuilder = this.getForCompute( computeNode );
|
|
1115
|
+
|
|
1116
|
+
for ( const node of nodeBuilder.updateAfterNodes ) {
|
|
1117
|
+
|
|
1118
|
+
// update frame state for each node
|
|
1119
|
+
|
|
1120
|
+
this.getNodeFrameForCompute( computeNode ).updateAfterNode( node );
|
|
1121
|
+
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
}
|
|
1125
|
+
|
|
988
1126
|
/**
|
|
989
1127
|
* Triggers the call of `update()` methods
|
|
990
1128
|
* for all nodes of the given compute node.
|
|
@@ -1024,10 +1162,10 @@ class NodeManager extends DataMap {
|
|
|
1024
1162
|
}
|
|
1025
1163
|
|
|
1026
1164
|
/**
|
|
1027
|
-
* Returns
|
|
1165
|
+
* Returns the refresh type of the given render object.
|
|
1028
1166
|
*
|
|
1029
1167
|
* @param {RenderObject} renderObject - The render object.
|
|
1030
|
-
* @return {
|
|
1168
|
+
* @return {number} The refresh type, see `RenderObjectRefreshType`.
|
|
1031
1169
|
*/
|
|
1032
1170
|
needsRefresh( renderObject ) {
|
|
1033
1171
|
|
|
@@ -20,7 +20,9 @@ class NodeStorageBuffer extends StorageBuffer {
|
|
|
20
20
|
*/
|
|
21
21
|
constructor( nodeUniform, groupNode ) {
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
const label = nodeUniform && nodeUniform.name ? nodeUniform.name : _id ++;
|
|
24
|
+
|
|
25
|
+
super( 'StorageBuffer_' + label, nodeUniform ? nodeUniform.value : null );
|
|
24
26
|
|
|
25
27
|
/**
|
|
26
28
|
* The node uniform.
|
|
@@ -20,7 +20,9 @@ class NodeUniformBuffer extends UniformBuffer {
|
|
|
20
20
|
*/
|
|
21
21
|
constructor( nodeUniform, groupNode ) {
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
const label = nodeUniform && nodeUniform.name ? nodeUniform.name : _id ++;
|
|
24
|
+
|
|
25
|
+
super( 'UniformBuffer_' + label, nodeUniform ? nodeUniform.value : null );
|
|
24
26
|
|
|
25
27
|
/**
|
|
26
28
|
* The uniform buffer node.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Precomputed DFG LUT for
|
|
2
|
+
* Precomputed DFG LUT for physically based specular lighting, used by both
|
|
3
|
+
* image-based lighting and direct-light multi-scattering energy compensation
|
|
3
4
|
* Resolution: 16x16
|
|
4
5
|
* Samples: 4096 per texel
|
|
5
6
|
* Format: RG16F (2 half floats per texel: scale, bias)
|
|
@@ -10,7 +10,8 @@ vec3 transformedNormal = objectNormal;
|
|
|
10
10
|
#ifdef USE_BATCHING
|
|
11
11
|
|
|
12
12
|
// this is in lieu of a per-instance normal-matrix
|
|
13
|
-
//
|
|
13
|
+
// non-uniform scaling in the instance matrix is supported
|
|
14
|
+
// shear transforms are not supported
|
|
14
15
|
|
|
15
16
|
mat3 bm = mat3( batchingMatrix );
|
|
16
17
|
transformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );
|
|
@@ -27,7 +28,8 @@ vec3 transformedNormal = objectNormal;
|
|
|
27
28
|
#ifdef USE_INSTANCING
|
|
28
29
|
|
|
29
30
|
// this is in lieu of a per-instance normal-matrix
|
|
30
|
-
//
|
|
31
|
+
// non-uniform scaling in the instance matrix is supported
|
|
32
|
+
// shear transforms are not supported
|
|
31
33
|
|
|
32
34
|
mat3 im = mat3( instanceMatrix );
|
|
33
35
|
transformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );
|