@plastic-software/three 0.180.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 +943 -486
- package/build/three.core.js +506 -327
- package/build/three.core.min.js +1 -1
- package/build/three.module.js +435 -163
- package/build/three.module.min.js +1 -1
- package/build/three.tsl.js +8 -2
- package/build/three.tsl.min.js +1 -1
- package/build/three.webgpu.js +3753 -1177
- package/build/three.webgpu.min.js +1 -1
- package/build/three.webgpu.nodes.js +3752 -1176
- 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/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/controls/ArcballControls.js +1 -1
- package/examples/jsm/controls/DragControls.js +1 -1
- package/examples/jsm/controls/FirstPersonControls.js +1 -1
- package/examples/jsm/controls/FlyControls.js +1 -1
- package/examples/jsm/controls/OrbitControls.js +2 -2
- package/examples/jsm/controls/PointerLockControls.js +2 -2
- 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 +3 -3
- 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/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/loaders/3MFLoader.js +1 -1
- package/examples/jsm/loaders/ColladaLoader.js +2 -2
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/FBXLoader.js +2 -2
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GLTFLoader.js +5 -3
- package/examples/jsm/loaders/KTX2Loader.js +28 -21
- 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/SVGLoader.js +2 -2
- package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
- package/examples/jsm/math/ConvexHull.js +1 -1
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/SimplexNoise.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/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/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/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/TSLEncoder.js +7 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
- package/examples/jsm/tsl/display/AnamorphicNode.js +2 -1
- package/examples/jsm/tsl/display/BloomNode.js +4 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +7 -0
- package/examples/jsm/tsl/display/GTAONode.js +45 -5
- package/examples/jsm/tsl/display/GaussianBlurNode.js +5 -3
- package/examples/jsm/tsl/display/OutlineNode.js +11 -0
- package/examples/jsm/tsl/display/SSGINode.js +654 -0
- package/examples/jsm/tsl/display/SSRNode.js +2 -0
- package/examples/jsm/tsl/display/SSSNode.js +488 -0
- package/examples/jsm/tsl/display/TRAANode.js +123 -6
- package/examples/jsm/tsl/display/boxBlur.js +1 -0
- package/examples/jsm/tsl/display/hashBlur.js +1 -0
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -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 +3 -2
- package/src/Three.TSL.js +7 -1
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +2 -0
- package/src/animation/AnimationClip.js +3 -2
- 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 +1 -1
- package/src/core/BufferGeometry.js +8 -8
- 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/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 +7 -7
- 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/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 +4 -3
- package/src/materials/MeshBasicMaterial.js +1 -0
- package/src/materials/MeshDepthMaterial.js +1 -0
- 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/manager/NodeMaterialObserver.js +2 -1
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +2 -2
- 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 +1 -1
- package/src/nodes/TSL.js +1 -1
- package/src/nodes/accessors/CubeTextureNode.js +3 -2
- package/src/nodes/accessors/InstanceNode.js +22 -4
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/Normal.js +5 -4
- package/src/nodes/accessors/Position.js +18 -2
- package/src/nodes/accessors/ReferenceNode.js +2 -1
- 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 +1 -1
- package/src/nodes/accessors/TextureNode.js +61 -27
- package/src/nodes/code/FunctionCallNode.js +5 -4
- package/src/nodes/core/ArrayNode.js +1 -0
- package/src/nodes/core/AttributeNode.js +2 -1
- package/src/nodes/core/ContextNode.js +5 -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 +137 -12
- package/src/nodes/core/NodeBuilder.js +135 -21
- package/src/nodes/core/NodeFrame.js +20 -20
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUtils.js +17 -90
- package/src/nodes/core/ParameterNode.js +31 -0
- package/src/nodes/core/PropertyNode.js +7 -0
- package/src/nodes/core/StackNode.js +16 -14
- package/src/nodes/core/UniformNode.js +2 -1
- package/src/nodes/core/VarNode.js +70 -12
- 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/NormalMapNode.js +2 -1
- package/src/nodes/display/PassNode.js +51 -10
- package/src/nodes/display/RenderOutputNode.js +28 -2
- package/src/nodes/display/ScreenNode.js +2 -1
- package/src/nodes/display/ToneMappingNode.js +31 -4
- package/src/nodes/display/ToonOutlinePassNode.js +8 -0
- 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 +25 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
- package/src/nodes/lighting/EnvironmentNode.js +6 -6
- package/src/nodes/lighting/LightsNode.js +2 -3
- 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/ConditionalNode.js +6 -5
- package/src/nodes/math/MathNode.js +22 -4
- package/src/nodes/math/OperatorNode.js +3 -2
- 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 +36 -15
- 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 +3 -2
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +2 -1
- package/src/nodes/utils/PostProcessingUtils.js +28 -1
- package/src/nodes/utils/RTTNode.js +12 -2
- package/src/nodes/utils/ReflectorNode.js +10 -3
- 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 +2 -1
- package/src/renderers/WebGLRenderer.js +48 -32
- package/src/renderers/common/Animation.js +13 -1
- package/src/renderers/common/Backend.js +93 -30
- package/src/renderers/common/Background.js +2 -1
- package/src/renderers/common/Bindings.js +56 -2
- package/src/renderers/common/CanvasTarget.js +341 -0
- 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/PostProcessing.js +6 -25
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderObject.js +3 -1
- package/src/renderers/common/RenderObjects.js +1 -1
- package/src/renderers/common/Renderer.js +436 -228
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +8 -0
- package/src/renderers/common/Sampler.js +37 -11
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +89 -35
- package/src/renderers/common/TimestampQueryPool.js +63 -1
- package/src/renderers/common/UniformsGroup.js +2 -1
- package/src/renderers/common/XRManager.js +7 -3
- package/src/renderers/common/extras/PMREMGenerator.js +160 -65
- package/src/renderers/common/nodes/NodeLibrary.js +4 -2
- 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/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 +11 -10
- package/src/renderers/webgl/WebGLPrograms.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +2 -1
- package/src/renderers/webgl/WebGLState.js +15 -14
- package/src/renderers/webgl/WebGLTextures.js +18 -14
- package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +22 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +74 -11
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +6 -5
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +117 -16
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +42 -12
- package/src/renderers/webgpu/WebGPUBackend.js +134 -108
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +3 -2
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +21 -19
- 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 +5 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +44 -16
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +146 -74
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +29 -6
- package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
- package/src/renderers/webxr/WebXRManager.js +3 -2
- package/src/textures/Source.js +2 -1
- package/src/textures/Texture.js +3 -2
- package/src/textures/VideoTexture.js +2 -0
- package/src/utils.js +67 -3
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Vector3 } from '../math/Vector3.js';
|
|
2
2
|
import { BufferAttribute } from './BufferAttribute.js';
|
|
3
3
|
import { denormalize, normalize } from '../math/MathUtils.js';
|
|
4
|
+
import { log } from '../utils.js';
|
|
4
5
|
|
|
5
6
|
const _vector = /*@__PURE__*/ new Vector3();
|
|
6
7
|
|
|
@@ -439,7 +440,7 @@ class InterleavedBufferAttribute {
|
|
|
439
440
|
|
|
440
441
|
if ( data === undefined ) {
|
|
441
442
|
|
|
442
|
-
|
|
443
|
+
log( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );
|
|
443
444
|
|
|
444
445
|
const array = [];
|
|
445
446
|
|
|
@@ -489,7 +490,7 @@ class InterleavedBufferAttribute {
|
|
|
489
490
|
|
|
490
491
|
if ( data === undefined ) {
|
|
491
492
|
|
|
492
|
-
|
|
493
|
+
log( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );
|
|
493
494
|
|
|
494
495
|
const array = [];
|
|
495
496
|
|
package/src/core/Object3D.js
CHANGED
|
@@ -6,6 +6,7 @@ import { Euler } from '../math/Euler.js';
|
|
|
6
6
|
import { Layers } from './Layers.js';
|
|
7
7
|
import { Matrix3 } from '../math/Matrix3.js';
|
|
8
8
|
import { generateUUID } from '../math/MathUtils.js';
|
|
9
|
+
import { error } from '../utils.js';
|
|
9
10
|
|
|
10
11
|
let _object3DId = 0;
|
|
11
12
|
|
|
@@ -733,7 +734,7 @@ class Object3D extends EventDispatcher {
|
|
|
733
734
|
|
|
734
735
|
if ( object === this ) {
|
|
735
736
|
|
|
736
|
-
|
|
737
|
+
error( 'Object3D.add: object can\'t be added as a child of itself.', object );
|
|
737
738
|
return this;
|
|
738
739
|
|
|
739
740
|
}
|
|
@@ -752,7 +753,7 @@ class Object3D extends EventDispatcher {
|
|
|
752
753
|
|
|
753
754
|
} else {
|
|
754
755
|
|
|
755
|
-
|
|
756
|
+
error( 'Object3D.add: object not an instance of THREE.Object3D.', object );
|
|
756
757
|
|
|
757
758
|
}
|
|
758
759
|
|
package/src/core/Raycaster.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Matrix4 } from '../math/Matrix4.js';
|
|
2
2
|
import { Ray } from '../math/Ray.js';
|
|
3
3
|
import { Layers } from './Layers.js';
|
|
4
|
+
import { error } from '../utils.js';
|
|
4
5
|
|
|
5
6
|
const _matrix = /*@__PURE__*/ new Matrix4();
|
|
6
7
|
|
|
@@ -131,7 +132,7 @@ class Raycaster {
|
|
|
131
132
|
|
|
132
133
|
} else {
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
error( 'Raycaster: Unsupported camera type: ' + camera.type );
|
|
135
136
|
|
|
136
137
|
}
|
|
137
138
|
|
package/src/core/RenderTarget.js
CHANGED
|
@@ -294,7 +294,16 @@ class RenderTarget extends EventDispatcher {
|
|
|
294
294
|
this.textures[ i ].image.width = width;
|
|
295
295
|
this.textures[ i ].image.height = height;
|
|
296
296
|
this.textures[ i ].image.depth = depth;
|
|
297
|
-
|
|
297
|
+
|
|
298
|
+
if ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693
|
|
299
|
+
|
|
300
|
+
// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.
|
|
301
|
+
// Maybe a method `isArrayTexture()` or just a getter could replace a flag since
|
|
302
|
+
// both are evaluated on each call?
|
|
303
|
+
|
|
304
|
+
this.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;
|
|
305
|
+
|
|
306
|
+
}
|
|
298
307
|
|
|
299
308
|
}
|
|
300
309
|
|
package/src/extras/Controls.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventDispatcher } from '../core/EventDispatcher.js';
|
|
2
|
+
import { warn } from '../utils.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Abstract base class for controls.
|
|
@@ -12,7 +13,7 @@ class Controls extends EventDispatcher {
|
|
|
12
13
|
* Constructs a new controls instance.
|
|
13
14
|
*
|
|
14
15
|
* @param {Object3D} object - The object that is managed by the controls.
|
|
15
|
-
* @param {?
|
|
16
|
+
* @param {?HTMLElement} domElement - The HTML element used for event listeners.
|
|
16
17
|
*/
|
|
17
18
|
constructor( object, domElement = null ) {
|
|
18
19
|
|
|
@@ -28,7 +29,7 @@ class Controls extends EventDispatcher {
|
|
|
28
29
|
/**
|
|
29
30
|
* The HTML element used for event listeners.
|
|
30
31
|
*
|
|
31
|
-
* @type {?
|
|
32
|
+
* @type {?HTMLElement}
|
|
32
33
|
* @default null
|
|
33
34
|
*/
|
|
34
35
|
this.domElement = domElement;
|
|
@@ -78,13 +79,13 @@ class Controls extends EventDispatcher {
|
|
|
78
79
|
* Connects the controls to the DOM. This method has so called "side effects" since
|
|
79
80
|
* it adds the module's event listeners to the DOM.
|
|
80
81
|
*
|
|
81
|
-
* @param {
|
|
82
|
+
* @param {HTMLElement} element - The DOM element to connect to.
|
|
82
83
|
*/
|
|
83
84
|
connect( element ) {
|
|
84
85
|
|
|
85
86
|
if ( element === undefined ) {
|
|
86
87
|
|
|
87
|
-
|
|
88
|
+
warn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185
|
|
88
89
|
return;
|
|
89
90
|
|
|
90
91
|
}
|
package/src/extras/DataUtils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { clamp } from '../math/MathUtils.js';
|
|
2
|
+
import { warn } from '../utils.js';
|
|
2
3
|
|
|
3
4
|
// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf
|
|
4
5
|
|
|
@@ -148,7 +149,7 @@ function _generateTables() {
|
|
|
148
149
|
*/
|
|
149
150
|
function toHalfFloat( val ) {
|
|
150
151
|
|
|
151
|
-
if ( Math.abs( val ) > 65504 )
|
|
152
|
+
if ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );
|
|
152
153
|
|
|
153
154
|
val = clamp( val, - 65504, 65504 );
|
|
154
155
|
|
package/src/extras/Earcut.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import earcut from './lib/earcut.js';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* An implementation of the earcut polygon triangulation algorithm.
|
|
5
|
+
* The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).
|
|
6
|
+
*
|
|
7
|
+
* @see https://github.com/mapbox/earcut
|
|
8
|
+
*/
|
|
3
9
|
class Earcut {
|
|
4
10
|
|
|
5
11
|
/**
|
package/src/extras/ImageUtils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createElementNS } from '../utils.js';
|
|
1
|
+
import { createElementNS, warn } from '../utils.js';
|
|
2
2
|
import { SRGBToLinear } from '../math/ColorManagement.js';
|
|
3
3
|
|
|
4
4
|
let _canvas;
|
|
@@ -125,7 +125,7 @@ class ImageUtils {
|
|
|
125
125
|
|
|
126
126
|
} else {
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
warn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );
|
|
129
129
|
return image;
|
|
130
130
|
|
|
131
131
|
}
|
|
@@ -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 );
|
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.
|