@plastic-software/three 0.179.0 → 0.181.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 +1108 -591
- package/build/three.core.js +616 -345
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +488 -250
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +37 -6
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +6576 -2152
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +6575 -2151
- package/build/three.webgpu.nodes.min.js +1 -1
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +1 -1
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +8 -8
- package/examples/jsm/controls/DragControls.js +7 -57
- package/examples/jsm/controls/FirstPersonControls.js +3 -3
- package/examples/jsm/controls/FlyControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +1 -1
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +33 -25
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +9 -2
- package/examples/jsm/geometries/DecalGeometry.js +2 -2
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +3 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/ViewHelper.js +43 -5
- package/examples/jsm/inspector/Inspector.js +427 -0
- package/examples/jsm/inspector/RendererInspector.js +415 -0
- package/examples/jsm/inspector/tabs/Console.js +204 -0
- package/examples/jsm/inspector/tabs/Parameters.js +332 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Viewer.js +166 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +170 -0
- package/examples/jsm/inspector/ui/Style.js +654 -0
- package/examples/jsm/inspector/ui/Tab.js +46 -0
- package/examples/jsm/inspector/ui/Values.js +423 -0
- package/examples/jsm/inspector/ui/utils.js +56 -0
- package/examples/jsm/interactive/HTMLMesh.js +6 -10
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +3 -3
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +5 -5
- package/examples/jsm/loaders/FBXLoader.js +2 -2
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GLTFLoader.js +14 -8
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +486 -0
- package/examples/jsm/loaders/KTX2Loader.js +136 -49
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +1 -1
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +2 -2
- package/examples/jsm/loaders/MaterialXLoader.js +22 -5
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +2 -2
- package/examples/jsm/loaders/TTFLoader.js +4 -4
- package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +3 -3
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +1 -1
- package/examples/jsm/objects/SkyMesh.js +1 -1
- package/examples/jsm/objects/Water.js +3 -3
- package/examples/jsm/objects/WaterMesh.js +6 -6
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
- package/examples/jsm/renderers/SVGRenderer.js +1 -1
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +2 -2
- package/examples/jsm/shaders/GodRaysShader.js +1 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
- package/examples/jsm/shaders/SSRShader.js +1 -1
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
- package/examples/jsm/transpiler/TSLEncoder.js +9 -10
- package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
- package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
- package/examples/jsm/tsl/display/BloomNode.js +7 -3
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
- package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- package/examples/jsm/tsl/display/GTAONode.js +53 -5
- package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
- package/examples/jsm/tsl/display/OutlineNode.js +13 -2
- package/examples/jsm/tsl/display/SSGINode.js +654 -0
- package/examples/jsm/tsl/display/SSRNode.js +182 -65
- package/examples/jsm/tsl/display/SSSNode.js +488 -0
- package/examples/jsm/tsl/display/TRAANode.js +124 -7
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/hashBlur.js +16 -18
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
- package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
- package/package.json +5 -10
- package/src/Three.Core.js +4 -2
- package/src/Three.TSL.js +36 -5
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +2 -0
- package/src/animation/AnimationClip.js +20 -4
- package/src/animation/AnimationMixer.js +3 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/KeyframeTrack.js +7 -6
- package/src/animation/PropertyBinding.js +12 -11
- package/src/audio/Audio.js +10 -9
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +11 -3
- package/src/core/BufferGeometry.js +10 -10
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +3 -2
- package/src/core/Raycaster.js +2 -1
- package/src/core/RenderTarget.js +10 -1
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +268 -55
- package/src/extras/TextureUtils.js +2 -1
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/lib/earcut.js +8 -8
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +8 -6
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +1 -0
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +1 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +2 -1
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +2 -2
- package/src/loaders/DataTextureLoader.js +1 -1
- package/src/loaders/FileLoader.js +3 -2
- package/src/loaders/ImageBitmapLoader.js +5 -4
- package/src/loaders/ImageLoader.js +1 -1
- package/src/loaders/Loader.js +3 -3
- package/src/loaders/LoadingManager.js +25 -3
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +13 -13
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +3 -2
- package/src/materials/Material.js +16 -3
- package/src/materials/MeshBasicMaterial.js +1 -0
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +2 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +2 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +1 -0
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +2 -2
- package/src/materials/nodes/Line2NodeMaterial.js +2 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/NodeMaterial.js +62 -22
- package/src/materials/nodes/PointsNodeMaterial.js +81 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +9 -3
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/MathUtils.js +13 -11
- package/src/math/Matrix2.js +1 -1
- package/src/math/Matrix3.js +2 -2
- package/src/math/Matrix4.js +7 -7
- package/src/math/Plane.js +1 -1
- package/src/math/Quaternion.js +68 -66
- package/src/math/Spherical.js +1 -1
- package/src/nodes/Nodes.js +4 -1
- package/src/nodes/TSL.js +4 -1
- package/src/nodes/accessors/BufferNode.js +1 -1
- package/src/nodes/accessors/Camera.js +133 -7
- package/src/nodes/accessors/ClippingNode.js +6 -5
- package/src/nodes/accessors/CubeTextureNode.js +5 -4
- package/src/nodes/accessors/InstanceNode.js +25 -5
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/Normal.js +5 -4
- package/src/nodes/accessors/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +18 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
- package/src/nodes/accessors/ReferenceNode.js +3 -2
- package/src/nodes/accessors/SceneNode.js +2 -1
- package/src/nodes/accessors/StorageBufferNode.js +2 -1
- package/src/nodes/accessors/StorageTextureNode.js +22 -0
- package/src/nodes/accessors/Texture3DNode.js +14 -1
- package/src/nodes/accessors/TextureNode.js +130 -44
- package/src/nodes/code/FunctionCallNode.js +24 -4
- package/src/nodes/code/FunctionNode.js +23 -0
- package/src/nodes/core/ArrayNode.js +1 -0
- package/src/nodes/core/AssignNode.js +4 -3
- package/src/nodes/core/AttributeNode.js +2 -1
- package/src/nodes/core/ContextNode.js +29 -10
- package/src/nodes/core/IndexNode.js +2 -2
- package/src/nodes/core/InputNode.js +2 -1
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
- package/src/nodes/core/Node.js +152 -31
- package/src/nodes/core/NodeBuilder.js +183 -35
- package/src/nodes/core/NodeFrame.js +21 -21
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +17 -91
- package/src/nodes/core/ParameterNode.js +31 -0
- package/src/nodes/core/PropertyNode.js +7 -0
- package/src/nodes/core/StackNode.js +43 -16
- package/src/nodes/core/StructNode.js +5 -5
- package/src/nodes/core/StructTypeNode.js +1 -0
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformNode.js +18 -10
- package/src/nodes/core/VarNode.js +70 -33
- package/src/nodes/core/VaryingNode.js +3 -2
- package/src/nodes/display/BlendModes.js +5 -4
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +1 -1
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/NormalMapNode.js +2 -1
- package/src/nodes/display/PassNode.js +52 -11
- package/src/nodes/display/RenderOutputNode.js +28 -2
- package/src/nodes/display/ScreenNode.js +44 -14
- package/src/nodes/display/ToneMappingNode.js +31 -4
- package/src/nodes/display/ToonOutlinePassNode.js +8 -0
- package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +42 -12
- package/src/nodes/fog/Fog.js +3 -2
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhysicalLightingModel.js +3 -2
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/geometry/RangeNode.js +40 -4
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
- package/src/nodes/gpgpu/ComputeNode.js +17 -5
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
- package/src/nodes/lighting/EnvironmentNode.js +6 -6
- package/src/nodes/lighting/LightsNode.js +3 -4
- package/src/nodes/lighting/PointShadowNode.js +6 -0
- package/src/nodes/lighting/ShadowFilterNode.js +2 -0
- package/src/nodes/lighting/ShadowNode.js +75 -8
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/ConditionalNode.js +24 -7
- package/src/nodes/math/MathNode.js +25 -19
- package/src/nodes/math/OperatorNode.js +7 -5
- package/src/nodes/pmrem/PMREMUtils.js +117 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +5 -2
- package/src/nodes/tsl/TSLCore.js +460 -159
- package/src/nodes/utils/DebugNode.js +2 -1
- package/src/nodes/utils/EventNode.js +36 -0
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +6 -3
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +59 -7
- package/src/nodes/utils/PostProcessingUtils.js +28 -1
- package/src/nodes/utils/RTTNode.js +13 -3
- package/src/nodes/utils/ReflectorNode.js +58 -7
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SplitNode.js +11 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/objects/BatchedMesh.js +2 -2
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +2 -1
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Skeleton.js +3 -2
- package/src/objects/SkinnedMesh.js +3 -1
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +48 -41
- package/src/renderers/common/Animation.js +13 -1
- package/src/renderers/common/Attributes.js +1 -1
- package/src/renderers/common/Backend.js +108 -27
- package/src/renderers/common/Background.js +2 -1
- package/src/renderers/common/Bindings.js +58 -2
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +1 -1
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +26 -0
- package/src/renderers/common/Info.js +4 -2
- package/src/renderers/common/InspectorBase.js +146 -0
- package/src/renderers/common/Pipelines.js +1 -1
- package/src/renderers/common/PostProcessing.js +6 -25
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/RenderContext.js +2 -2
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderObject.js +16 -2
- package/src/renderers/common/RenderObjects.js +1 -1
- package/src/renderers/common/Renderer.js +473 -245
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +9 -1
- package/src/renderers/common/Sampler.js +50 -12
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +121 -45
- package/src/renderers/common/TimestampQueryPool.js +65 -3
- package/src/renderers/common/UniformsGroup.js +2 -1
- package/src/renderers/common/XRManager.js +42 -22
- package/src/renderers/common/extras/PMREMGenerator.js +160 -65
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/Nodes.js +38 -16
- package/src/renderers/shaders/DFGLUTData.js +64 -0
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/shaders/UniformsUtils.js +25 -4
- package/src/renderers/webgl/WebGLCapabilities.js +2 -1
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLProgram.js +15 -14
- package/src/renderers/webgl/WebGLPrograms.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +3 -2
- package/src/renderers/webgl/WebGLState.js +15 -14
- package/src/renderers/webgl/WebGLTextures.js +19 -14
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl/WebGLUtils.js +3 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
- package/src/renderers/webgpu/WebGPUBackend.js +153 -123
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +3 -2
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
- package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
- package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
- package/src/renderers/webxr/WebXRManager.js +42 -26
- package/src/textures/ExternalTexture.js +15 -4
- package/src/textures/Source.js +3 -2
- package/src/textures/Texture.js +3 -2
- package/src/textures/VideoTexture.js +2 -3
- package/src/utils.js +67 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
|
@@ -22,19 +22,22 @@ import { Color } from '../math/Color.js';
|
|
|
22
22
|
import { WebGLRenderTarget } from '../renderers/WebGLRenderTarget.js';
|
|
23
23
|
import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';
|
|
24
24
|
import { BoxGeometry } from '../geometries/BoxGeometry.js';
|
|
25
|
+
import { error, warn } from '../utils.js';
|
|
25
26
|
|
|
26
27
|
const LOD_MIN = 4;
|
|
27
28
|
|
|
28
|
-
// The standard deviations (radians) associated with the extra mips.
|
|
29
|
-
//
|
|
30
|
-
// geometric shadowing function. These sigma values squared must match the
|
|
31
|
-
// variance #defines in cube_uv_reflection_fragment.glsl.js.
|
|
29
|
+
// The standard deviations (radians) associated with the extra mips.
|
|
30
|
+
// Used for scene blur in fromScene() method.
|
|
32
31
|
const EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];
|
|
33
32
|
|
|
34
33
|
// The maximum length of the blur for loop. Smaller sigmas will use fewer
|
|
35
34
|
// samples and exit early, but not recompile the shader.
|
|
35
|
+
// Used for scene blur in fromScene() method.
|
|
36
36
|
const MAX_SAMPLES = 20;
|
|
37
37
|
|
|
38
|
+
// GGX VNDF importance sampling configuration
|
|
39
|
+
const GGX_SAMPLES = 256;
|
|
40
|
+
|
|
38
41
|
const _flatCamera = /*@__PURE__*/ new OrthographicCamera();
|
|
39
42
|
const _clearColor = /*@__PURE__*/ new Color();
|
|
40
43
|
let _oldTarget = null;
|
|
@@ -42,24 +45,6 @@ let _oldActiveCubeFace = 0;
|
|
|
42
45
|
let _oldActiveMipmapLevel = 0;
|
|
43
46
|
let _oldXrEnabled = false;
|
|
44
47
|
|
|
45
|
-
// Golden Ratio
|
|
46
|
-
const PHI = ( 1 + Math.sqrt( 5 ) ) / 2;
|
|
47
|
-
const INV_PHI = 1 / PHI;
|
|
48
|
-
|
|
49
|
-
// Vertices of a dodecahedron (except the opposites, which represent the
|
|
50
|
-
// same axis), used as axis directions evenly spread on a sphere.
|
|
51
|
-
const _axisDirections = [
|
|
52
|
-
/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ),
|
|
53
|
-
/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),
|
|
54
|
-
/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),
|
|
55
|
-
/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),
|
|
56
|
-
/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),
|
|
57
|
-
/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),
|
|
58
|
-
/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),
|
|
59
|
-
/*@__PURE__*/ new Vector3( 1, 1, - 1 ),
|
|
60
|
-
/*@__PURE__*/ new Vector3( - 1, 1, 1 ),
|
|
61
|
-
/*@__PURE__*/ new Vector3( 1, 1, 1 ) ];
|
|
62
|
-
|
|
63
48
|
const _origin = /*@__PURE__*/ new Vector3();
|
|
64
49
|
|
|
65
50
|
/**
|
|
@@ -73,9 +58,11 @@ const _origin = /*@__PURE__*/ new Vector3();
|
|
|
73
58
|
* higher roughness levels. In this way we maintain resolution to smoothly
|
|
74
59
|
* interpolate diffuse lighting while limiting sampling computation.
|
|
75
60
|
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
|
|
61
|
+
* The prefiltering uses GGX VNDF (Visible Normal Distribution Function)
|
|
62
|
+
* importance sampling based on "Sampling the GGX Distribution of Visible Normals"
|
|
63
|
+
* (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF
|
|
64
|
+
* used in material rendering for physically-based image-based lighting.
|
|
65
|
+
*/
|
|
79
66
|
class PMREMGenerator {
|
|
80
67
|
|
|
81
68
|
/**
|
|
@@ -90,15 +77,17 @@ class PMREMGenerator {
|
|
|
90
77
|
|
|
91
78
|
this._lodMax = 0;
|
|
92
79
|
this._cubeSize = 0;
|
|
93
|
-
this._lodPlanes = [];
|
|
94
80
|
this._sizeLods = [];
|
|
95
81
|
this._sigmas = [];
|
|
82
|
+
this._lodMeshes = [];
|
|
83
|
+
|
|
84
|
+
this._backgroundBox = null;
|
|
96
85
|
|
|
97
|
-
this._blurMaterial = null;
|
|
98
86
|
this._cubemapMaterial = null;
|
|
99
87
|
this._equirectMaterial = null;
|
|
100
88
|
|
|
101
|
-
this.
|
|
89
|
+
this._blurMaterial = null;
|
|
90
|
+
this._ggxMaterial = null;
|
|
102
91
|
|
|
103
92
|
}
|
|
104
93
|
|
|
@@ -223,6 +212,13 @@ class PMREMGenerator {
|
|
|
223
212
|
if ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();
|
|
224
213
|
if ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();
|
|
225
214
|
|
|
215
|
+
if ( this._backgroundBox !== null ) {
|
|
216
|
+
|
|
217
|
+
this._backgroundBox.geometry.dispose();
|
|
218
|
+
this._backgroundBox.material.dispose();
|
|
219
|
+
|
|
220
|
+
}
|
|
221
|
+
|
|
226
222
|
}
|
|
227
223
|
|
|
228
224
|
// private interface
|
|
@@ -237,12 +233,13 @@ class PMREMGenerator {
|
|
|
237
233
|
_dispose() {
|
|
238
234
|
|
|
239
235
|
if ( this._blurMaterial !== null ) this._blurMaterial.dispose();
|
|
236
|
+
if ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();
|
|
240
237
|
|
|
241
238
|
if ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();
|
|
242
239
|
|
|
243
|
-
for ( let i = 0; i < this.
|
|
240
|
+
for ( let i = 0; i < this._lodMeshes.length; i ++ ) {
|
|
244
241
|
|
|
245
|
-
this.
|
|
242
|
+
this._lodMeshes[ i ].geometry.dispose();
|
|
246
243
|
|
|
247
244
|
}
|
|
248
245
|
|
|
@@ -314,7 +311,7 @@ class PMREMGenerator {
|
|
|
314
311
|
this._pingPongRenderTarget = _createRenderTarget( width, height, params );
|
|
315
312
|
|
|
316
313
|
const { _lodMax } = this;
|
|
317
|
-
( {
|
|
314
|
+
( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );
|
|
318
315
|
|
|
319
316
|
this._blurMaterial = _getBlurShader( _lodMax, width, height );
|
|
320
317
|
|
|
@@ -326,8 +323,8 @@ class PMREMGenerator {
|
|
|
326
323
|
|
|
327
324
|
_compileMaterial( material ) {
|
|
328
325
|
|
|
329
|
-
const
|
|
330
|
-
this._renderer.compile(
|
|
326
|
+
const mesh = new Mesh( new BufferGeometry(), material );
|
|
327
|
+
this._renderer.compile( mesh, _flatCamera );
|
|
331
328
|
|
|
332
329
|
}
|
|
333
330
|
|
|
@@ -358,16 +355,25 @@ class PMREMGenerator {
|
|
|
358
355
|
|
|
359
356
|
}
|
|
360
357
|
|
|
361
|
-
|
|
362
|
-
name: 'PMREM.Background',
|
|
363
|
-
side: BackSide,
|
|
364
|
-
depthWrite: false,
|
|
365
|
-
depthTest: false,
|
|
366
|
-
} );
|
|
358
|
+
if ( this._backgroundBox === null ) {
|
|
367
359
|
|
|
368
|
-
|
|
360
|
+
this._backgroundBox = new Mesh(
|
|
361
|
+
new BoxGeometry(),
|
|
362
|
+
new MeshBasicMaterial( {
|
|
363
|
+
name: 'PMREM.Background',
|
|
364
|
+
side: BackSide,
|
|
365
|
+
depthWrite: false,
|
|
366
|
+
depthTest: false,
|
|
367
|
+
} )
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
const backgroundBox = this._backgroundBox;
|
|
373
|
+
const backgroundMaterial = backgroundBox.material;
|
|
369
374
|
|
|
370
375
|
let useSolidColor = false;
|
|
376
|
+
|
|
371
377
|
const background = scene.background;
|
|
372
378
|
|
|
373
379
|
if ( background ) {
|
|
@@ -428,9 +434,6 @@ class PMREMGenerator {
|
|
|
428
434
|
|
|
429
435
|
}
|
|
430
436
|
|
|
431
|
-
backgroundBox.geometry.dispose();
|
|
432
|
-
backgroundBox.material.dispose();
|
|
433
|
-
|
|
434
437
|
renderer.toneMapping = toneMapping;
|
|
435
438
|
renderer.autoClear = originalAutoClear;
|
|
436
439
|
scene.background = background;
|
|
@@ -464,7 +467,9 @@ class PMREMGenerator {
|
|
|
464
467
|
}
|
|
465
468
|
|
|
466
469
|
const material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;
|
|
467
|
-
|
|
470
|
+
|
|
471
|
+
const mesh = this._lodMeshes[ 0 ];
|
|
472
|
+
mesh.material = material;
|
|
468
473
|
|
|
469
474
|
const uniforms = material.uniforms;
|
|
470
475
|
|
|
@@ -484,19 +489,82 @@ class PMREMGenerator {
|
|
|
484
489
|
const renderer = this._renderer;
|
|
485
490
|
const autoClear = renderer.autoClear;
|
|
486
491
|
renderer.autoClear = false;
|
|
487
|
-
const n = this._lodPlanes.length;
|
|
488
492
|
|
|
493
|
+
const n = this._lodMeshes.length;
|
|
494
|
+
|
|
495
|
+
// Use GGX VNDF importance sampling
|
|
489
496
|
for ( let i = 1; i < n; i ++ ) {
|
|
490
497
|
|
|
491
|
-
|
|
498
|
+
this._applyGGXFilter( cubeUVRenderTarget, i - 1, i );
|
|
499
|
+
|
|
500
|
+
}
|
|
492
501
|
|
|
493
|
-
|
|
502
|
+
renderer.autoClear = autoClear;
|
|
503
|
+
|
|
504
|
+
}
|
|
494
505
|
|
|
495
|
-
|
|
506
|
+
/**
|
|
507
|
+
* Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.
|
|
508
|
+
* Uses Monte Carlo integration with VNDF importance sampling to accurately represent the
|
|
509
|
+
* GGX BRDF for physically-based rendering. Reads from the previous LOD level and
|
|
510
|
+
* applies incremental roughness filtering to avoid over-blurring.
|
|
511
|
+
*
|
|
512
|
+
* @private
|
|
513
|
+
* @param {WebGLRenderTarget} cubeUVRenderTarget
|
|
514
|
+
* @param {number} lodIn - Source LOD level to read from
|
|
515
|
+
* @param {number} lodOut - Target LOD level to write to
|
|
516
|
+
*/
|
|
517
|
+
_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {
|
|
518
|
+
|
|
519
|
+
const renderer = this._renderer;
|
|
520
|
+
const pingPongRenderTarget = this._pingPongRenderTarget;
|
|
521
|
+
|
|
522
|
+
if ( this._ggxMaterial === null ) {
|
|
523
|
+
|
|
524
|
+
const width = 3 * Math.max( this._cubeSize, 16 );
|
|
525
|
+
const height = 4 * this._cubeSize;
|
|
526
|
+
this._ggxMaterial = _getGGXShader( this._lodMax, width, height );
|
|
496
527
|
|
|
497
528
|
}
|
|
498
529
|
|
|
499
|
-
|
|
530
|
+
const ggxMaterial = this._ggxMaterial;
|
|
531
|
+
const ggxMesh = this._lodMeshes[ lodOut ];
|
|
532
|
+
ggxMesh.material = ggxMaterial;
|
|
533
|
+
|
|
534
|
+
const ggxUniforms = ggxMaterial.uniforms;
|
|
535
|
+
|
|
536
|
+
// Calculate incremental roughness between LOD levels
|
|
537
|
+
const targetRoughness = lodOut / ( this._lodMeshes.length - 1 );
|
|
538
|
+
const sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );
|
|
539
|
+
const incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );
|
|
540
|
+
|
|
541
|
+
// Apply blur strength mapping for better quality across the roughness range
|
|
542
|
+
const blurStrength = 0.05 + targetRoughness * 0.95;
|
|
543
|
+
const adjustedRoughness = incrementalRoughness * blurStrength;
|
|
544
|
+
|
|
545
|
+
// Calculate viewport position based on output LOD level
|
|
546
|
+
const { _lodMax } = this;
|
|
547
|
+
const outputSize = this._sizeLods[ lodOut ];
|
|
548
|
+
const x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );
|
|
549
|
+
const y = 4 * ( this._cubeSize - outputSize );
|
|
550
|
+
|
|
551
|
+
// Read from previous LOD with incremental roughness
|
|
552
|
+
ggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;
|
|
553
|
+
ggxUniforms[ 'roughness' ].value = adjustedRoughness;
|
|
554
|
+
ggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD
|
|
555
|
+
|
|
556
|
+
_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );
|
|
557
|
+
renderer.setRenderTarget( pingPongRenderTarget );
|
|
558
|
+
renderer.render( ggxMesh, _flatCamera );
|
|
559
|
+
|
|
560
|
+
// Copy from pingPong back to cubeUV (simple direct copy)
|
|
561
|
+
ggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;
|
|
562
|
+
ggxUniforms[ 'roughness' ].value = 0.0; // Direct copy
|
|
563
|
+
ggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote
|
|
564
|
+
|
|
565
|
+
_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );
|
|
566
|
+
renderer.setRenderTarget( cubeUVRenderTarget );
|
|
567
|
+
renderer.render( ggxMesh, _flatCamera );
|
|
500
568
|
|
|
501
569
|
}
|
|
502
570
|
|
|
@@ -507,6 +575,8 @@ class PMREMGenerator {
|
|
|
507
575
|
* the poles) to approximate the orthogonally-separable blur. It is least
|
|
508
576
|
* accurate at the poles, but still does a decent job.
|
|
509
577
|
*
|
|
578
|
+
* Used for initial scene blur in fromScene() method when sigma > 0.
|
|
579
|
+
*
|
|
510
580
|
* @private
|
|
511
581
|
* @param {WebGLRenderTarget} cubeUVRenderTarget
|
|
512
582
|
* @param {number} lodIn
|
|
@@ -545,7 +615,7 @@ class PMREMGenerator {
|
|
|
545
615
|
|
|
546
616
|
if ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {
|
|
547
617
|
|
|
548
|
-
|
|
618
|
+
error(
|
|
549
619
|
'blur direction must be either latitudinal or longitudinal!' );
|
|
550
620
|
|
|
551
621
|
}
|
|
@@ -553,7 +623,9 @@ class PMREMGenerator {
|
|
|
553
623
|
// Number of standard deviations at which to cut off the discrete approximation.
|
|
554
624
|
const STANDARD_DEVIATIONS = 3;
|
|
555
625
|
|
|
556
|
-
const blurMesh =
|
|
626
|
+
const blurMesh = this._lodMeshes[ lodOut ];
|
|
627
|
+
blurMesh.material = blurMaterial;
|
|
628
|
+
|
|
557
629
|
const blurUniforms = blurMaterial.uniforms;
|
|
558
630
|
|
|
559
631
|
const pixels = this._sizeLods[ lodIn ] - 1;
|
|
@@ -563,7 +635,7 @@ class PMREMGenerator {
|
|
|
563
635
|
|
|
564
636
|
if ( samples > MAX_SAMPLES ) {
|
|
565
637
|
|
|
566
|
-
|
|
638
|
+
warn( `sigmaRadians, ${
|
|
567
639
|
sigmaRadians}, is too large and will clip, as it requested ${
|
|
568
640
|
samples} samples when the maximum is set to ${MAX_SAMPLES}` );
|
|
569
641
|
|
|
@@ -627,9 +699,9 @@ class PMREMGenerator {
|
|
|
627
699
|
|
|
628
700
|
function _createPlanes( lodMax ) {
|
|
629
701
|
|
|
630
|
-
const lodPlanes = [];
|
|
631
702
|
const sizeLods = [];
|
|
632
703
|
const sigmas = [];
|
|
704
|
+
const lodMeshes = [];
|
|
633
705
|
|
|
634
706
|
let lod = lodMax;
|
|
635
707
|
|
|
@@ -691,7 +763,7 @@ function _createPlanes( lodMax ) {
|
|
|
691
763
|
planes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );
|
|
692
764
|
planes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );
|
|
693
765
|
planes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );
|
|
694
|
-
|
|
766
|
+
lodMeshes.push( new Mesh( planes, null ) );
|
|
695
767
|
|
|
696
768
|
if ( lod > LOD_MIN ) {
|
|
697
769
|
|
|
@@ -701,7 +773,7 @@ function _createPlanes( lodMax ) {
|
|
|
701
773
|
|
|
702
774
|
}
|
|
703
775
|
|
|
704
|
-
return {
|
|
776
|
+
return { lodMeshes, sizeLods, sigmas };
|
|
705
777
|
|
|
706
778
|
}
|
|
707
779
|
|
|
@@ -722,6 +794,147 @@ function _setViewport( target, x, y, width, height ) {
|
|
|
722
794
|
|
|
723
795
|
}
|
|
724
796
|
|
|
797
|
+
function _getGGXShader( lodMax, width, height ) {
|
|
798
|
+
|
|
799
|
+
const shaderMaterial = new ShaderMaterial( {
|
|
800
|
+
|
|
801
|
+
name: 'PMREMGGXConvolution',
|
|
802
|
+
|
|
803
|
+
defines: {
|
|
804
|
+
'GGX_SAMPLES': GGX_SAMPLES,
|
|
805
|
+
'CUBEUV_TEXEL_WIDTH': 1.0 / width,
|
|
806
|
+
'CUBEUV_TEXEL_HEIGHT': 1.0 / height,
|
|
807
|
+
'CUBEUV_MAX_MIP': `${lodMax}.0`,
|
|
808
|
+
},
|
|
809
|
+
|
|
810
|
+
uniforms: {
|
|
811
|
+
'envMap': { value: null },
|
|
812
|
+
'roughness': { value: 0.0 },
|
|
813
|
+
'mipInt': { value: 0 }
|
|
814
|
+
},
|
|
815
|
+
|
|
816
|
+
vertexShader: _getCommonVertexShader(),
|
|
817
|
+
|
|
818
|
+
fragmentShader: /* glsl */`
|
|
819
|
+
|
|
820
|
+
precision highp float;
|
|
821
|
+
precision highp int;
|
|
822
|
+
|
|
823
|
+
varying vec3 vOutputDirection;
|
|
824
|
+
|
|
825
|
+
uniform sampler2D envMap;
|
|
826
|
+
uniform float roughness;
|
|
827
|
+
uniform float mipInt;
|
|
828
|
+
|
|
829
|
+
#define ENVMAP_TYPE_CUBE_UV
|
|
830
|
+
#include <cube_uv_reflection_fragment>
|
|
831
|
+
|
|
832
|
+
#define PI 3.14159265359
|
|
833
|
+
|
|
834
|
+
// Van der Corput radical inverse
|
|
835
|
+
float radicalInverse_VdC(uint bits) {
|
|
836
|
+
bits = (bits << 16u) | (bits >> 16u);
|
|
837
|
+
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
|
|
838
|
+
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
|
|
839
|
+
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
|
|
840
|
+
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
|
|
841
|
+
return float(bits) * 2.3283064365386963e-10; // / 0x100000000
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// Hammersley sequence
|
|
845
|
+
vec2 hammersley(uint i, uint N) {
|
|
846
|
+
return vec2(float(i) / float(N), radicalInverse_VdC(i));
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
// GGX VNDF importance sampling (Eric Heitz 2018)
|
|
850
|
+
// "Sampling the GGX Distribution of Visible Normals"
|
|
851
|
+
// https://jcgt.org/published/0007/04/01/
|
|
852
|
+
vec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {
|
|
853
|
+
float alpha = roughness * roughness;
|
|
854
|
+
|
|
855
|
+
// Section 3.2: Transform view direction to hemisphere configuration
|
|
856
|
+
vec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));
|
|
857
|
+
|
|
858
|
+
// Section 4.1: Orthonormal basis
|
|
859
|
+
float lensq = Vh.x * Vh.x + Vh.y * Vh.y;
|
|
860
|
+
vec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);
|
|
861
|
+
vec3 T2 = cross(Vh, T1);
|
|
862
|
+
|
|
863
|
+
// Section 4.2: Parameterization of projected area
|
|
864
|
+
float r = sqrt(Xi.x);
|
|
865
|
+
float phi = 2.0 * PI * Xi.y;
|
|
866
|
+
float t1 = r * cos(phi);
|
|
867
|
+
float t2 = r * sin(phi);
|
|
868
|
+
float s = 0.5 * (1.0 + Vh.z);
|
|
869
|
+
t2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;
|
|
870
|
+
|
|
871
|
+
// Section 4.3: Reprojection onto hemisphere
|
|
872
|
+
vec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;
|
|
873
|
+
|
|
874
|
+
// Section 3.4: Transform back to ellipsoid configuration
|
|
875
|
+
return normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
void main() {
|
|
879
|
+
vec3 N = normalize(vOutputDirection);
|
|
880
|
+
vec3 V = N; // Assume view direction equals normal for pre-filtering
|
|
881
|
+
|
|
882
|
+
vec3 prefilteredColor = vec3(0.0);
|
|
883
|
+
float totalWeight = 0.0;
|
|
884
|
+
|
|
885
|
+
// For very low roughness, just sample the environment directly
|
|
886
|
+
if (roughness < 0.001) {
|
|
887
|
+
gl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
// Tangent space basis for VNDF sampling
|
|
892
|
+
vec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
|
|
893
|
+
vec3 tangent = normalize(cross(up, N));
|
|
894
|
+
vec3 bitangent = cross(N, tangent);
|
|
895
|
+
|
|
896
|
+
for(uint i = 0u; i < uint(GGX_SAMPLES); i++) {
|
|
897
|
+
vec2 Xi = hammersley(i, uint(GGX_SAMPLES));
|
|
898
|
+
|
|
899
|
+
// For PMREM, V = N, so in tangent space V is always (0, 0, 1)
|
|
900
|
+
vec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);
|
|
901
|
+
|
|
902
|
+
// Transform H back to world space
|
|
903
|
+
vec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);
|
|
904
|
+
vec3 L = normalize(2.0 * dot(V, H) * H - V);
|
|
905
|
+
|
|
906
|
+
float NdotL = max(dot(N, L), 0.0);
|
|
907
|
+
|
|
908
|
+
if(NdotL > 0.0) {
|
|
909
|
+
// Sample environment at fixed mip level
|
|
910
|
+
// VNDF importance sampling handles the distribution filtering
|
|
911
|
+
vec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);
|
|
912
|
+
|
|
913
|
+
// Weight by NdotL for the split-sum approximation
|
|
914
|
+
// VNDF PDF naturally accounts for the visible microfacet distribution
|
|
915
|
+
prefilteredColor += sampleColor * NdotL;
|
|
916
|
+
totalWeight += NdotL;
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
if (totalWeight > 0.0) {
|
|
921
|
+
prefilteredColor = prefilteredColor / totalWeight;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
gl_FragColor = vec4(prefilteredColor, 1.0);
|
|
925
|
+
}
|
|
926
|
+
`,
|
|
927
|
+
|
|
928
|
+
blending: NoBlending,
|
|
929
|
+
depthTest: false,
|
|
930
|
+
depthWrite: false
|
|
931
|
+
|
|
932
|
+
} );
|
|
933
|
+
|
|
934
|
+
return shaderMaterial;
|
|
935
|
+
|
|
936
|
+
}
|
|
937
|
+
|
|
725
938
|
function _getBlurShader( lodMax, width, height ) {
|
|
726
939
|
|
|
727
940
|
const weights = new Float32Array( MAX_SAMPLES );
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AlphaFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBFormat, RGBAFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, UnsignedByteType, ByteType, UnsignedShortType, ShortType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedIntType, IntType, FloatType, UnsignedInt5999Type } from '../constants.js';
|
|
1
|
+
import { AlphaFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBFormat, RGBAFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, UnsignedByteType, ByteType, UnsignedShortType, ShortType, HalfFloatType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedIntType, IntType, FloatType, UnsignedInt5999Type, UnsignedInt101111Type } from '../constants.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Scales the texture as large as possible within its surface without cropping
|
|
@@ -215,6 +215,7 @@ function getTextureTypeByteLength( type ) {
|
|
|
215
215
|
case FloatType:
|
|
216
216
|
return { byteLength: 4, components: 1 };
|
|
217
217
|
case UnsignedInt5999Type:
|
|
218
|
+
case UnsignedInt101111Type:
|
|
218
219
|
return { byteLength: 4, components: 3 };
|
|
219
220
|
|
|
220
221
|
}
|
package/src/extras/core/Curve.js
CHANGED
|
@@ -2,6 +2,7 @@ import { clamp } from '../../math/MathUtils.js';
|
|
|
2
2
|
import { Vector2 } from '../../math/Vector2.js';
|
|
3
3
|
import { Vector3 } from '../../math/Vector3.js';
|
|
4
4
|
import { Matrix4 } from '../../math/Matrix4.js';
|
|
5
|
+
import { warn } from '../../utils.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* An abstract base class for creating an analytic curve object that contains methods
|
|
@@ -66,7 +67,7 @@ class Curve {
|
|
|
66
67
|
*/
|
|
67
68
|
getPoint( /* t, optionalTarget */ ) {
|
|
68
69
|
|
|
69
|
-
|
|
70
|
+
warn( 'Curve: .getPoint() not implemented.' );
|
|
70
71
|
|
|
71
72
|
}
|
|
72
73
|
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Interpolations contains spline and Bézier functions internally used by concrete curve classes.
|
|
3
|
+
*
|
|
4
|
+
* Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve
|
|
5
|
+
*
|
|
6
|
+
* @module Interpolations
|
|
7
|
+
*/
|
|
2
8
|
|
|
3
9
|
/**
|
|
4
10
|
* Computes a point on a Catmull-Rom spline.
|
|
@@ -236,7 +236,7 @@ class ShapePath {
|
|
|
236
236
|
let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );
|
|
237
237
|
holesFirst = isCCW ? ! holesFirst : holesFirst;
|
|
238
238
|
|
|
239
|
-
//
|
|
239
|
+
// log("Holes first", holesFirst);
|
|
240
240
|
|
|
241
241
|
const betterShapeHoles = [];
|
|
242
242
|
const newShapes = [];
|
|
@@ -264,13 +264,13 @@ class ShapePath {
|
|
|
264
264
|
if ( holesFirst ) mainIdx ++;
|
|
265
265
|
newShapeHoles[ mainIdx ] = [];
|
|
266
266
|
|
|
267
|
-
//
|
|
267
|
+
//log('cw', i);
|
|
268
268
|
|
|
269
269
|
} else {
|
|
270
270
|
|
|
271
271
|
newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );
|
|
272
272
|
|
|
273
|
-
//
|
|
273
|
+
//log('ccw', i);
|
|
274
274
|
|
|
275
275
|
}
|
|
276
276
|
|
|
@@ -355,7 +355,7 @@ class ShapePath {
|
|
|
355
355
|
|
|
356
356
|
}
|
|
357
357
|
|
|
358
|
-
//
|
|
358
|
+
//log("shape", shapes);
|
|
359
359
|
|
|
360
360
|
return shapes;
|
|
361
361
|
|
package/src/extras/lib/earcut.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable */
|
|
2
|
-
// copy of mapbox/earcut version 3.0.
|
|
3
|
-
// https://github.com/mapbox/earcut/tree/v3.0.
|
|
2
|
+
// copy of mapbox/earcut version 3.0.2
|
|
3
|
+
// https://github.com/mapbox/earcut/tree/v3.0.2
|
|
4
4
|
|
|
5
5
|
export default function earcut(data, holeIndices, dim = 2) {
|
|
6
6
|
|
|
@@ -17,10 +17,10 @@ export default function earcut(data, holeIndices, dim = 2) {
|
|
|
17
17
|
|
|
18
18
|
// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
|
|
19
19
|
if (data.length > 80 * dim) {
|
|
20
|
-
minX =
|
|
21
|
-
minY =
|
|
22
|
-
let maxX =
|
|
23
|
-
let maxY =
|
|
20
|
+
minX = data[0];
|
|
21
|
+
minY = data[1];
|
|
22
|
+
let maxX = minX;
|
|
23
|
+
let maxY = minY;
|
|
24
24
|
|
|
25
25
|
for (let i = dim; i < outerLen; i += dim) {
|
|
26
26
|
const x = data[i];
|
|
@@ -296,7 +296,7 @@ function compareXYSlope(a, b) {
|
|
|
296
296
|
return result;
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
-
// find a bridge between vertices that connects hole with an outer ring and
|
|
299
|
+
// find a bridge between vertices that connects hole with an outer ring and link it
|
|
300
300
|
function eliminateHole(hole, outerNode) {
|
|
301
301
|
const bridge = findHoleBridge(hole, outerNode);
|
|
302
302
|
if (!bridge) {
|
|
@@ -487,7 +487,7 @@ function pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {
|
|
|
487
487
|
|
|
488
488
|
// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
|
|
489
489
|
function isValidDiagonal(a, b) {
|
|
490
|
-
return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && //
|
|
490
|
+
return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges
|
|
491
491
|
(locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
|
|
492
492
|
(area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
|
|
493
493
|
equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
|