@plastic-software/three 0.181.3 → 0.183.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +11330 -10017
- package/build/three.core.js +10011 -9493
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1414 -631
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +21 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +8007 -5427
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +8005 -5426
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +0 -3
- package/examples/jsm/animation/CCDIKSolver.js +2 -2
- package/examples/jsm/controls/ArcballControls.js +3 -3
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +109 -6
- package/examples/jsm/controls/TrackballControls.js +6 -6
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/EXRExporter.js +1 -1
- package/examples/jsm/exporters/GLTFExporter.js +131 -4
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +67 -8
- package/examples/jsm/inspector/Inspector.js +74 -14
- package/examples/jsm/inspector/RendererInspector.js +12 -2
- package/examples/jsm/inspector/tabs/Console.js +41 -7
- package/examples/jsm/inspector/tabs/Parameters.js +18 -2
- package/examples/jsm/inspector/tabs/Performance.js +2 -2
- package/examples/jsm/inspector/tabs/Viewer.js +4 -4
- package/examples/jsm/inspector/ui/Profiler.js +1836 -31
- package/examples/jsm/inspector/ui/Style.js +973 -14
- package/examples/jsm/inspector/ui/Tab.js +188 -1
- package/examples/jsm/inspector/ui/Values.js +17 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
- package/examples/jsm/lines/LineMaterial.js +6 -0
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +2 -2
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +24 -4026
- package/examples/jsm/loaders/DRACOLoader.js +5 -5
- package/examples/jsm/loaders/EXRLoader.js +5 -5
- package/examples/jsm/loaders/FBXLoader.js +2 -4
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +122 -171
- package/examples/jsm/loaders/HDRLoader.js +0 -1
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +19 -3
- package/examples/jsm/loaders/LDrawLoader.js +2 -3
- package/examples/jsm/loaders/LWOLoader.js +7 -39
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/SVGLoader.js +1 -1
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +37 -24
- package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
- package/examples/jsm/loaders/usd/USDAParser.js +447 -366
- package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/misc/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Sky.js +76 -4
- package/examples/jsm/objects/SkyMesh.js +127 -10
- package/examples/jsm/objects/Water.js +4 -3
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +5 -7
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
- package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
- package/examples/jsm/renderers/Projector.js +268 -30
- package/examples/jsm/renderers/SVGRenderer.js +193 -60
- package/examples/jsm/shaders/GTAOShader.js +19 -6
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +6 -5
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +46 -3
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +5 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
- package/examples/jsm/tsl/display/GodraysNode.js +624 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +3 -3
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +8 -20
- package/examples/jsm/tsl/display/SSRNode.js +8 -8
- package/examples/jsm/tsl/display/SSSNode.js +6 -4
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TRAANode.js +273 -125
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/math/Bayer.js +40 -1
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/package.json +20 -26
- package/src/Three.Core.js +2 -1
- package/src/Three.TSL.js +19 -11
- package/src/Three.WebGPU.Nodes.js +2 -0
- package/src/Three.WebGPU.js +3 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +1 -1
- package/src/animation/AnimationClip.js +1 -1
- package/src/animation/AnimationMixer.js +6 -0
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +47 -8
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +1 -1
- package/src/audio/AudioListener.js +5 -3
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/constants.js +90 -5
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +56 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +3 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- package/src/geometries/ExtrudeGeometry.js +2 -2
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/TorusGeometry.js +8 -3
- package/src/helpers/CameraHelper.js +3 -0
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/FileLoader.js +1 -1
- package/src/loaders/ImageBitmapLoader.js +8 -3
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +2 -1
- package/src/loaders/ObjectLoader.js +21 -2
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +7 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +72 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
- package/src/math/Line3.js +3 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix4.js +74 -65
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Vector3.js +3 -5
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +87 -68
- package/src/nodes/TSL.js +6 -6
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +98 -12
- package/src/nodes/accessors/BufferNode.js +29 -2
- package/src/nodes/accessors/Camera.js +149 -28
- package/src/nodes/accessors/ClippingNode.js +4 -4
- package/src/nodes/accessors/CubeTextureNode.js +20 -1
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +11 -11
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
- package/src/nodes/accessors/ReferenceNode.js +4 -4
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +53 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +4 -21
- package/src/nodes/accessors/StorageTextureNode.js +37 -1
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +58 -22
- package/src/nodes/accessors/UniformArrayNode.js +4 -2
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionNode.js +1 -2
- package/src/nodes/core/ArrayNode.js +20 -1
- package/src/nodes/core/AssignNode.js +2 -2
- package/src/nodes/core/AttributeNode.js +2 -2
- package/src/nodes/core/ContextNode.js +103 -4
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +29 -3
- package/src/nodes/core/NodeBuilder.js +170 -53
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +10 -8
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +3 -3
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +65 -16
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +16 -2
- package/src/nodes/core/StructTypeNode.js +11 -17
- package/src/nodes/core/SubBuildNode.js +1 -1
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +47 -22
- package/src/nodes/core/VaryingNode.js +1 -18
- package/src/nodes/display/BlendModes.js +0 -64
- package/src/nodes/display/ColorAdjustment.js +17 -0
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/NormalMapNode.js +39 -4
- package/src/nodes/display/PassNode.js +98 -9
- package/src/nodes/display/RenderOutputNode.js +3 -3
- package/src/nodes/display/ScreenNode.js +3 -1
- package/src/nodes/display/ToneMappingNode.js +1 -1
- package/src/nodes/display/ToonOutlinePassNode.js +2 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportTextureNode.js +21 -4
- package/src/nodes/fog/Fog.js +18 -35
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +4 -2
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
- package/src/nodes/gpgpu/ComputeNode.js +5 -4
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +28 -3
- package/src/nodes/lighting/LightsNode.js +2 -2
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +97 -41
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +2 -2
- package/src/nodes/math/MathNode.js +3 -40
- package/src/nodes/math/OperatorNode.js +2 -1
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +9 -15
- package/src/nodes/tsl/TSLCore.js +17 -14
- package/src/nodes/utils/ArrayElementNode.js +13 -0
- package/src/nodes/utils/DebugNode.js +11 -11
- package/src/nodes/utils/EventNode.js +1 -2
- package/src/nodes/utils/JoinNode.js +2 -2
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +1 -1
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +33 -1
- package/src/nodes/utils/RTTNode.js +1 -1
- package/src/nodes/utils/ReflectorNode.js +3 -4
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +27 -14
- package/src/objects/InstancedMesh.js +11 -0
- package/src/objects/Line.js +1 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +9 -0
- package/src/renderers/WebGLRenderer.js +178 -92
- package/src/renderers/common/Backend.js +29 -0
- package/src/renderers/common/Background.js +24 -11
- package/src/renderers/common/BindGroup.js +1 -9
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +27 -12
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/CubeRenderTarget.js +50 -6
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +4 -4
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/RenderBundles.js +2 -1
- package/src/renderers/common/RenderContext.js +16 -0
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +15 -3
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +18 -2
- package/src/renderers/common/RenderPipeline.js +203 -17
- package/src/renderers/common/Renderer.js +257 -72
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +17 -1
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +61 -0
- package/src/renderers/common/XRManager.js +3 -2
- package/src/renderers/common/extras/PMREMGenerator.js +2 -8
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +19 -34
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +3 -3
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -5
- package/src/renderers/shaders/UniformsLib.js +0 -3
- package/src/renderers/webgl/WebGLBackground.js +2 -2
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLCapabilities.js +3 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +12 -0
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +267 -0
- package/src/renderers/webgl/WebGLProgram.js +45 -109
- package/src/renderers/webgl/WebGLPrograms.js +45 -49
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +32 -37
- package/src/renderers/webgl/WebGLTextures.js +89 -28
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
- package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +119 -13
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
- package/src/renderers/webxr/WebXRManager.js +2 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/Source.js +1 -1
- package/src/textures/Texture.js +3 -3
- package/src/utils.js +258 -3
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -145
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -1852,12 +1852,12 @@ class GLTFWriter {
|
|
|
1852
1852
|
! ( array instanceof Uint8Array ) ) {
|
|
1853
1853
|
|
|
1854
1854
|
console.warn( 'GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.' );
|
|
1855
|
-
modifiedAttribute =
|
|
1855
|
+
modifiedAttribute = GLTFExporter.Utils.toTypedBufferAttribute( attribute, Uint16Array );
|
|
1856
1856
|
|
|
1857
1857
|
} else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) {
|
|
1858
1858
|
|
|
1859
1859
|
console.warn( `GLTFExporter: Attribute "${ attributeName }" converted to type FLOAT.` );
|
|
1860
|
-
modifiedAttribute = GLTFExporter.Utils.
|
|
1860
|
+
modifiedAttribute = GLTFExporter.Utils.toTypedBufferAttribute( attribute, Float32Array );
|
|
1861
1861
|
|
|
1862
1862
|
}
|
|
1863
1863
|
|
|
@@ -2355,6 +2355,13 @@ class GLTFWriter {
|
|
|
2355
2355
|
|
|
2356
2356
|
if ( ! json.nodes ) json.nodes = [];
|
|
2357
2357
|
|
|
2358
|
+
// Handle pivot by creating a container node
|
|
2359
|
+
if ( object.pivot !== null ) {
|
|
2360
|
+
|
|
2361
|
+
return await this._processNodeWithPivotAsync( object );
|
|
2362
|
+
|
|
2363
|
+
}
|
|
2364
|
+
|
|
2358
2365
|
const nodeDef = {};
|
|
2359
2366
|
|
|
2360
2367
|
if ( options.trs ) {
|
|
@@ -2451,6 +2458,126 @@ class GLTFWriter {
|
|
|
2451
2458
|
|
|
2452
2459
|
}
|
|
2453
2460
|
|
|
2461
|
+
/**
|
|
2462
|
+
* Process Object3D node with pivot using container approach
|
|
2463
|
+
* @param {THREE.Object3D} object Object3D with pivot
|
|
2464
|
+
* @return {Promise<number>} Index of the container node
|
|
2465
|
+
*/
|
|
2466
|
+
async _processNodeWithPivotAsync( object ) {
|
|
2467
|
+
|
|
2468
|
+
const json = this.json;
|
|
2469
|
+
const options = this.options;
|
|
2470
|
+
const nodeMap = this.nodeMap;
|
|
2471
|
+
|
|
2472
|
+
const pivot = object.pivot;
|
|
2473
|
+
|
|
2474
|
+
// Container node: holds position + pivot offset, rotation, scale
|
|
2475
|
+
// Animations will target this node
|
|
2476
|
+
const containerDef = {};
|
|
2477
|
+
|
|
2478
|
+
const rotation = object.quaternion.toArray();
|
|
2479
|
+
const position = [
|
|
2480
|
+
object.position.x + pivot.x,
|
|
2481
|
+
object.position.y + pivot.y,
|
|
2482
|
+
object.position.z + pivot.z
|
|
2483
|
+
];
|
|
2484
|
+
const scale = object.scale.toArray();
|
|
2485
|
+
|
|
2486
|
+
if ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {
|
|
2487
|
+
|
|
2488
|
+
containerDef.rotation = rotation;
|
|
2489
|
+
|
|
2490
|
+
}
|
|
2491
|
+
|
|
2492
|
+
if ( ! equalArray( position, [ 0, 0, 0 ] ) ) {
|
|
2493
|
+
|
|
2494
|
+
containerDef.translation = position;
|
|
2495
|
+
|
|
2496
|
+
}
|
|
2497
|
+
|
|
2498
|
+
if ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {
|
|
2499
|
+
|
|
2500
|
+
containerDef.scale = scale;
|
|
2501
|
+
|
|
2502
|
+
}
|
|
2503
|
+
|
|
2504
|
+
// Store pivot in extras for round-trip reconstruction
|
|
2505
|
+
containerDef.extras = { pivot: pivot.toArray() };
|
|
2506
|
+
|
|
2507
|
+
if ( object.name !== '' ) containerDef.name = String( object.name );
|
|
2508
|
+
|
|
2509
|
+
this.serializeUserData( object, containerDef );
|
|
2510
|
+
|
|
2511
|
+
const containerIndex = json.nodes.push( containerDef ) - 1;
|
|
2512
|
+
|
|
2513
|
+
// Map original object to container so animations target it
|
|
2514
|
+
nodeMap.set( object, containerIndex );
|
|
2515
|
+
|
|
2516
|
+
// Child node: holds mesh with -pivot offset
|
|
2517
|
+
const childDef = {};
|
|
2518
|
+
|
|
2519
|
+
const childPosition = [ - pivot.x, - pivot.y, - pivot.z ];
|
|
2520
|
+
|
|
2521
|
+
if ( ! equalArray( childPosition, [ 0, 0, 0 ] ) ) {
|
|
2522
|
+
|
|
2523
|
+
childDef.translation = childPosition;
|
|
2524
|
+
|
|
2525
|
+
}
|
|
2526
|
+
|
|
2527
|
+
if ( object.isMesh || object.isLine || object.isPoints ) {
|
|
2528
|
+
|
|
2529
|
+
const meshIndex = await this.processMeshAsync( object );
|
|
2530
|
+
|
|
2531
|
+
if ( meshIndex !== null ) childDef.mesh = meshIndex;
|
|
2532
|
+
|
|
2533
|
+
} else if ( object.isCamera ) {
|
|
2534
|
+
|
|
2535
|
+
childDef.camera = this.processCamera( object );
|
|
2536
|
+
|
|
2537
|
+
}
|
|
2538
|
+
|
|
2539
|
+
if ( object.isSkinnedMesh ) this.skins.push( object );
|
|
2540
|
+
|
|
2541
|
+
const childIndex = json.nodes.push( childDef ) - 1;
|
|
2542
|
+
|
|
2543
|
+
// Build children array for container
|
|
2544
|
+
const containerChildren = [ childIndex ];
|
|
2545
|
+
|
|
2546
|
+
// Process object's children as children of the child node
|
|
2547
|
+
if ( object.children.length > 0 ) {
|
|
2548
|
+
|
|
2549
|
+
const grandchildren = [];
|
|
2550
|
+
|
|
2551
|
+
for ( let i = 0, l = object.children.length; i < l; i ++ ) {
|
|
2552
|
+
|
|
2553
|
+
const child = object.children[ i ];
|
|
2554
|
+
|
|
2555
|
+
if ( child.visible || options.onlyVisible === false ) {
|
|
2556
|
+
|
|
2557
|
+
const childNodeIndex = await this.processNodeAsync( child );
|
|
2558
|
+
|
|
2559
|
+
if ( childNodeIndex !== null ) grandchildren.push( childNodeIndex );
|
|
2560
|
+
|
|
2561
|
+
}
|
|
2562
|
+
|
|
2563
|
+
}
|
|
2564
|
+
|
|
2565
|
+
if ( grandchildren.length > 0 ) childDef.children = grandchildren;
|
|
2566
|
+
|
|
2567
|
+
}
|
|
2568
|
+
|
|
2569
|
+
containerDef.children = containerChildren;
|
|
2570
|
+
|
|
2571
|
+
await this._invokeAllAsync( function ( ext ) {
|
|
2572
|
+
|
|
2573
|
+
ext.writeNode && ext.writeNode( object, containerDef );
|
|
2574
|
+
|
|
2575
|
+
} );
|
|
2576
|
+
|
|
2577
|
+
return containerIndex;
|
|
2578
|
+
|
|
2579
|
+
}
|
|
2580
|
+
|
|
2454
2581
|
/**
|
|
2455
2582
|
* Process Scene
|
|
2456
2583
|
* @param {Scene} scene Scene to process
|
|
@@ -3538,9 +3665,9 @@ GLTFExporter.Utils = {
|
|
|
3538
3665
|
|
|
3539
3666
|
},
|
|
3540
3667
|
|
|
3541
|
-
|
|
3668
|
+
toTypedBufferAttribute: function ( srcAttribute, TypedArray ) {
|
|
3542
3669
|
|
|
3543
|
-
const dstAttribute = new BufferAttribute( new
|
|
3670
|
+
const dstAttribute = new BufferAttribute( new TypedArray( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );
|
|
3544
3671
|
|
|
3545
3672
|
if ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) {
|
|
3546
3673
|
|
|
@@ -501,7 +501,6 @@ function buildHierarchy( object, parentNode, materials, usedNames, files, option
|
|
|
501
501
|
function buildXform( object, usedNames ) {
|
|
502
502
|
|
|
503
503
|
const name = getName( object, usedNames );
|
|
504
|
-
const transform = buildMatrix( object.matrix );
|
|
505
504
|
|
|
506
505
|
if ( object.matrix.determinant() < 0 ) {
|
|
507
506
|
|
|
@@ -514,8 +513,28 @@ function buildXform( object, usedNames ) {
|
|
|
514
513
|
|
|
515
514
|
const node = new USDNode( name, 'Xform' );
|
|
516
515
|
|
|
517
|
-
|
|
518
|
-
|
|
516
|
+
if ( object.pivot !== null ) {
|
|
517
|
+
|
|
518
|
+
// Export with pivot using separate transform ops
|
|
519
|
+
const p = object.position;
|
|
520
|
+
const q = object.quaternion;
|
|
521
|
+
const s = object.scale;
|
|
522
|
+
const piv = object.pivot;
|
|
523
|
+
|
|
524
|
+
node.addProperty( `float3 xformOp:translate = (${p.x.toPrecision( PRECISION )}, ${p.y.toPrecision( PRECISION )}, ${p.z.toPrecision( PRECISION )})` );
|
|
525
|
+
node.addProperty( `float3 xformOp:translate:pivot = (${piv.x.toPrecision( PRECISION )}, ${piv.y.toPrecision( PRECISION )}, ${piv.z.toPrecision( PRECISION )})` );
|
|
526
|
+
node.addProperty( `quatf xformOp:orient = (${q.w.toPrecision( PRECISION )}, ${q.x.toPrecision( PRECISION )}, ${q.y.toPrecision( PRECISION )}, ${q.z.toPrecision( PRECISION )})` );
|
|
527
|
+
node.addProperty( `float3 xformOp:scale = (${s.x.toPrecision( PRECISION )}, ${s.y.toPrecision( PRECISION )}, ${s.z.toPrecision( PRECISION )})` );
|
|
528
|
+
node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:translate:pivot", "xformOp:orient", "xformOp:scale", "!invert!xformOp:translate:pivot"]' );
|
|
529
|
+
|
|
530
|
+
} else {
|
|
531
|
+
|
|
532
|
+
// Export as single transform matrix
|
|
533
|
+
const transform = buildMatrix( object.matrix );
|
|
534
|
+
node.addProperty( `matrix4d xformOp:transform = ${transform}` );
|
|
535
|
+
node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
|
|
536
|
+
|
|
537
|
+
}
|
|
519
538
|
|
|
520
539
|
return node;
|
|
521
540
|
|
|
@@ -35,7 +35,7 @@ class DecalGeometry extends BufferGeometry {
|
|
|
35
35
|
* @param {Mesh} [mesh] - The base mesh the decal should be projected on.
|
|
36
36
|
* @param {Vector3} [position] - The position of the decal projector.
|
|
37
37
|
* @param {Euler} [orientation] - The orientation of the decal projector.
|
|
38
|
-
* @param {Vector3} [size] -
|
|
38
|
+
* @param {Vector3} [size] - The scale of the decal projector.
|
|
39
39
|
*/
|
|
40
40
|
constructor( mesh = new Mesh(), position = new Vector3(), orientation = new Euler(), size = new Vector3( 1, 1, 1 ) ) {
|
|
41
41
|
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BufferGeometry,
|
|
3
|
+
Float32BufferAttribute,
|
|
4
|
+
Line,
|
|
5
|
+
LineBasicMaterial,
|
|
6
|
+
Object3D,
|
|
7
|
+
Points,
|
|
8
|
+
PointsMaterial
|
|
9
|
+
} from 'three';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Visualizes the motion path of an animated object based on position keyframes
|
|
13
|
+
* from an AnimationClip.
|
|
14
|
+
*
|
|
15
|
+
* ```js
|
|
16
|
+
* const clip = model.animations[ 0 ];
|
|
17
|
+
* const helper = new AnimationPathHelper( model, clip, object );
|
|
18
|
+
* scene.add( helper );
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @augments Object3D
|
|
22
|
+
* @three_import import { AnimationPathHelper } from 'three/addons/helpers/AnimationPathHelper.js';
|
|
23
|
+
*/
|
|
24
|
+
class AnimationPathHelper extends Object3D {
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Constructs a new animation path helper.
|
|
28
|
+
*
|
|
29
|
+
* @param {Object3D} root - The root object containing the animation clips.
|
|
30
|
+
* @param {AnimationClip} clip - The animation clip containing position keyframes.
|
|
31
|
+
* @param {Object3D} object - The specific object to show the path for.
|
|
32
|
+
* @param {Object} [options={}] - Configuration options.
|
|
33
|
+
* @param {number|Color|string} [options.color=0x00ff00] - The path line color.
|
|
34
|
+
* @param {number|Color|string} [options.markerColor=0xff0000] - The keyframe marker color.
|
|
35
|
+
* @param {number} [options.divisions=100] - Number of samples for smooth path interpolation.
|
|
36
|
+
* @param {boolean} [options.showMarkers=true] - Whether to show markers at keyframe positions.
|
|
37
|
+
* @param {number} [options.markerSize=5] - Size of keyframe markers in pixels.
|
|
38
|
+
*/
|
|
39
|
+
constructor( root, clip, object, options = {} ) {
|
|
40
|
+
|
|
41
|
+
super();
|
|
42
|
+
|
|
43
|
+
const {
|
|
44
|
+
color = 0x00ff00,
|
|
45
|
+
markerColor = 0xff0000,
|
|
46
|
+
divisions = 100,
|
|
47
|
+
showMarkers = true,
|
|
48
|
+
markerSize = 5
|
|
49
|
+
} = options;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* This flag can be used for type testing.
|
|
53
|
+
*
|
|
54
|
+
* @type {boolean}
|
|
55
|
+
* @readonly
|
|
56
|
+
* @default true
|
|
57
|
+
*/
|
|
58
|
+
this.isAnimationPathHelper = true;
|
|
59
|
+
|
|
60
|
+
this.type = 'AnimationPathHelper';
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The root object containing the animation clips.
|
|
64
|
+
*
|
|
65
|
+
* @type {Object3D}
|
|
66
|
+
*/
|
|
67
|
+
this.root = root;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The animation clip containing position keyframes.
|
|
71
|
+
*
|
|
72
|
+
* @type {AnimationClip}
|
|
73
|
+
*/
|
|
74
|
+
this.clip = clip;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The object whose path is being visualized.
|
|
78
|
+
*
|
|
79
|
+
* @type {Object3D}
|
|
80
|
+
*/
|
|
81
|
+
this.object = object;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Number of samples for smooth path interpolation.
|
|
85
|
+
*
|
|
86
|
+
* @type {number}
|
|
87
|
+
* @default 100
|
|
88
|
+
*/
|
|
89
|
+
this.divisions = divisions;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The position track for the object.
|
|
93
|
+
*
|
|
94
|
+
* @type {KeyframeTrack|null}
|
|
95
|
+
* @private
|
|
96
|
+
*/
|
|
97
|
+
this._track = this._findTrackForObject( object );
|
|
98
|
+
|
|
99
|
+
if ( this._track === null ) {
|
|
100
|
+
|
|
101
|
+
console.warn( 'AnimationPathHelper: No position track found for object', object.name );
|
|
102
|
+
return;
|
|
103
|
+
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Create line for path
|
|
107
|
+
const lineGeometry = new BufferGeometry();
|
|
108
|
+
const lineMaterial = new LineBasicMaterial( {
|
|
109
|
+
color: color,
|
|
110
|
+
toneMapped: false
|
|
111
|
+
} );
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The line representing the animation path.
|
|
115
|
+
*
|
|
116
|
+
* @type {Line}
|
|
117
|
+
*/
|
|
118
|
+
this.line = new Line( lineGeometry, lineMaterial );
|
|
119
|
+
this.add( this.line );
|
|
120
|
+
|
|
121
|
+
// Create points for keyframe markers
|
|
122
|
+
if ( showMarkers ) {
|
|
123
|
+
|
|
124
|
+
const pointsGeometry = new BufferGeometry();
|
|
125
|
+
const pointsMaterial = new PointsMaterial( {
|
|
126
|
+
color: markerColor,
|
|
127
|
+
size: markerSize,
|
|
128
|
+
sizeAttenuation: false,
|
|
129
|
+
toneMapped: false
|
|
130
|
+
} );
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Points marking keyframe positions.
|
|
134
|
+
*
|
|
135
|
+
* @type {Points|null}
|
|
136
|
+
*/
|
|
137
|
+
this.points = new Points( pointsGeometry, pointsMaterial );
|
|
138
|
+
this.add( this.points );
|
|
139
|
+
|
|
140
|
+
} else {
|
|
141
|
+
|
|
142
|
+
this.points = null;
|
|
143
|
+
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Sync matrix with object's parent
|
|
147
|
+
this.matrixAutoUpdate = false;
|
|
148
|
+
|
|
149
|
+
this._updateGeometry();
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Finds the position track for the given object.
|
|
155
|
+
*
|
|
156
|
+
* @private
|
|
157
|
+
* @param {Object3D} object - The object to find the track for.
|
|
158
|
+
* @returns {KeyframeTrack|null} The position track, or null if not found.
|
|
159
|
+
*/
|
|
160
|
+
_findTrackForObject( object ) {
|
|
161
|
+
|
|
162
|
+
const targetName = object.uuid + '.position';
|
|
163
|
+
|
|
164
|
+
for ( const track of this.clip.tracks ) {
|
|
165
|
+
|
|
166
|
+
if ( track.name === targetName && track.getValueSize() === 3 ) {
|
|
167
|
+
|
|
168
|
+
return track;
|
|
169
|
+
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return null;
|
|
175
|
+
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Samples the track at regular intervals.
|
|
180
|
+
*
|
|
181
|
+
* @private
|
|
182
|
+
* @returns {Float32Array} Array of sampled positions.
|
|
183
|
+
*/
|
|
184
|
+
_sampleTrack() {
|
|
185
|
+
|
|
186
|
+
const track = this._track;
|
|
187
|
+
const interpolant = track.createInterpolant();
|
|
188
|
+
const duration = this.clip.duration;
|
|
189
|
+
const positions = [];
|
|
190
|
+
|
|
191
|
+
for ( let i = 0; i <= this.divisions; i ++ ) {
|
|
192
|
+
|
|
193
|
+
const t = ( i / this.divisions ) * duration;
|
|
194
|
+
const result = interpolant.evaluate( t );
|
|
195
|
+
positions.push( result[ 0 ], result[ 1 ], result[ 2 ] );
|
|
196
|
+
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return new Float32Array( positions );
|
|
200
|
+
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Updates the geometry with sampled path data.
|
|
205
|
+
*
|
|
206
|
+
* @private
|
|
207
|
+
*/
|
|
208
|
+
_updateGeometry() {
|
|
209
|
+
|
|
210
|
+
if ( this._track === null ) return;
|
|
211
|
+
|
|
212
|
+
// Update line geometry
|
|
213
|
+
const sampledPositions = this._sampleTrack();
|
|
214
|
+
this.line.geometry.setAttribute( 'position', new Float32BufferAttribute( sampledPositions, 3 ) );
|
|
215
|
+
this.line.geometry.computeBoundingSphere();
|
|
216
|
+
|
|
217
|
+
// Update keyframe markers
|
|
218
|
+
if ( this.points !== null ) {
|
|
219
|
+
|
|
220
|
+
this.points.geometry.setAttribute( 'position', new Float32BufferAttribute( new Float32Array( this._track.values ), 3 ) );
|
|
221
|
+
this.points.geometry.computeBoundingSphere();
|
|
222
|
+
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Updates the helper's transform to match the object's parent.
|
|
229
|
+
*
|
|
230
|
+
* @param {boolean} force - Force matrix update.
|
|
231
|
+
*/
|
|
232
|
+
updateMatrixWorld( force ) {
|
|
233
|
+
|
|
234
|
+
// Position the helper at the object's parent so the path appears in correct local space
|
|
235
|
+
if ( this.object && this.object.parent ) {
|
|
236
|
+
|
|
237
|
+
this.object.parent.updateWorldMatrix( true, false );
|
|
238
|
+
this.matrix.copy( this.object.parent.matrixWorld );
|
|
239
|
+
|
|
240
|
+
} else {
|
|
241
|
+
|
|
242
|
+
this.matrix.identity();
|
|
243
|
+
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
this.matrixWorld.copy( this.matrix );
|
|
247
|
+
|
|
248
|
+
// Update children
|
|
249
|
+
for ( let i = 0; i < this.children.length; i ++ ) {
|
|
250
|
+
|
|
251
|
+
this.children[ i ].updateMatrixWorld( force );
|
|
252
|
+
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Sets the path line color.
|
|
259
|
+
*
|
|
260
|
+
* @param {number|Color|string} color - The new color.
|
|
261
|
+
*/
|
|
262
|
+
setColor( color ) {
|
|
263
|
+
|
|
264
|
+
if ( this.line ) this.line.material.color.set( color );
|
|
265
|
+
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Sets the keyframe marker color.
|
|
270
|
+
*
|
|
271
|
+
* @param {number|Color|string} color - The new color.
|
|
272
|
+
*/
|
|
273
|
+
setMarkerColor( color ) {
|
|
274
|
+
|
|
275
|
+
if ( this.points ) this.points.material.color.set( color );
|
|
276
|
+
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Frees the GPU-related resources allocated by this instance.
|
|
281
|
+
*/
|
|
282
|
+
dispose() {
|
|
283
|
+
|
|
284
|
+
if ( this.line ) {
|
|
285
|
+
|
|
286
|
+
this.line.geometry.dispose();
|
|
287
|
+
this.line.material.dispose();
|
|
288
|
+
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if ( this.points ) {
|
|
292
|
+
|
|
293
|
+
this.points.geometry.dispose();
|
|
294
|
+
this.points.material.dispose();
|
|
295
|
+
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export { AnimationPathHelper };
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
PlaneGeometry,
|
|
7
7
|
DoubleSide,
|
|
8
8
|
Vector3,
|
|
9
|
-
} from 'three';
|
|
9
|
+
} from 'three/webgpu';
|
|
10
10
|
import { texture as textureNode, cubeTexture, texture3D, float, vec4, attribute } from 'three/tsl';
|
|
11
11
|
import { mergeGeometries } from '../utils/BufferGeometryUtils.js';
|
|
12
12
|
|
|
@@ -65,6 +65,20 @@ class ViewHelper extends Object3D {
|
|
|
65
65
|
*/
|
|
66
66
|
this.center = new Vector3();
|
|
67
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Controls the position of the helper in the viewport.
|
|
70
|
+
* Use `top`/`bottom` for vertical positioning and `left`/`right` for horizontal.
|
|
71
|
+
* If `left` is `null`, `right` is used. If `top` is `null`, `bottom` is used.
|
|
72
|
+
*
|
|
73
|
+
* @type {{top: number|null, right: number, bottom: number, left: number|null}}
|
|
74
|
+
*/
|
|
75
|
+
this.location = {
|
|
76
|
+
top: null,
|
|
77
|
+
right: 0,
|
|
78
|
+
bottom: 0,
|
|
79
|
+
left: null
|
|
80
|
+
};
|
|
81
|
+
|
|
68
82
|
const color1 = new Color( '#ff4466' );
|
|
69
83
|
const color2 = new Color( '#88ff44' );
|
|
70
84
|
const color3 = new Color( '#4488ff' );
|
|
@@ -142,8 +156,8 @@ class ViewHelper extends Object3D {
|
|
|
142
156
|
const turnRate = 2 * Math.PI; // turn rate in angles per second
|
|
143
157
|
|
|
144
158
|
/**
|
|
145
|
-
* Renders the helper in a separate view in the
|
|
146
|
-
*
|
|
159
|
+
* Renders the helper in a separate view in the viewport.
|
|
160
|
+
* Position is controlled by the `location` property.
|
|
147
161
|
*
|
|
148
162
|
* @param {WebGLRenderer|WebGPURenderer} renderer - The renderer.
|
|
149
163
|
*/
|
|
@@ -157,8 +171,31 @@ class ViewHelper extends Object3D {
|
|
|
157
171
|
|
|
158
172
|
//
|
|
159
173
|
|
|
160
|
-
const
|
|
161
|
-
|
|
174
|
+
const location = this.location;
|
|
175
|
+
|
|
176
|
+
let x, y;
|
|
177
|
+
|
|
178
|
+
if ( location.left !== null ) {
|
|
179
|
+
|
|
180
|
+
x = location.left;
|
|
181
|
+
|
|
182
|
+
} else {
|
|
183
|
+
|
|
184
|
+
x = domElement.offsetWidth - dim - location.right;
|
|
185
|
+
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if ( location.top !== null ) {
|
|
189
|
+
|
|
190
|
+
// Position from top
|
|
191
|
+
y = renderer.isWebGPURenderer ? location.top : domElement.offsetHeight - dim - location.top;
|
|
192
|
+
|
|
193
|
+
} else {
|
|
194
|
+
|
|
195
|
+
// Position from bottom
|
|
196
|
+
y = renderer.isWebGPURenderer ? domElement.offsetHeight - dim - location.bottom : location.bottom;
|
|
197
|
+
|
|
198
|
+
}
|
|
162
199
|
|
|
163
200
|
renderer.clearDepth();
|
|
164
201
|
|
|
@@ -191,10 +228,32 @@ class ViewHelper extends Object3D {
|
|
|
191
228
|
if ( this.animating === true ) return false;
|
|
192
229
|
|
|
193
230
|
const rect = domElement.getBoundingClientRect();
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
231
|
+
const location = this.location;
|
|
232
|
+
|
|
233
|
+
let offsetX, offsetY;
|
|
234
|
+
|
|
235
|
+
if ( location.left !== null ) {
|
|
236
|
+
|
|
237
|
+
offsetX = rect.left + location.left;
|
|
238
|
+
|
|
239
|
+
} else {
|
|
240
|
+
|
|
241
|
+
offsetX = rect.left + domElement.offsetWidth - dim - location.right;
|
|
242
|
+
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if ( location.top !== null ) {
|
|
246
|
+
|
|
247
|
+
offsetY = rect.top + location.top;
|
|
248
|
+
|
|
249
|
+
} else {
|
|
250
|
+
|
|
251
|
+
offsetY = rect.top + domElement.offsetHeight - dim - location.bottom;
|
|
252
|
+
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
mouse.x = ( ( event.clientX - offsetX ) / dim ) * 2 - 1;
|
|
256
|
+
mouse.y = - ( ( event.clientY - offsetY ) / dim ) * 2 + 1;
|
|
198
257
|
|
|
199
258
|
raycaster.setFromCamera( mouse, orthoCamera );
|
|
200
259
|
|