super-three 0.181.0 → 0.184.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 +13152 -11354
- package/build/three.core.js +12319 -11539
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +1808 -781
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +27 -13
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +10523 -6263
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +10484 -6262
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/jsm/Addons.js +11 -3
- package/examples/jsm/animation/CCDIKSolver.js +7 -3
- package/examples/jsm/controls/ArcballControls.js +7 -4
- package/examples/jsm/controls/DragControls.js +2 -2
- package/examples/jsm/controls/FirstPersonControls.js +58 -54
- package/examples/jsm/controls/FlyControls.js +4 -0
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +111 -8
- package/examples/jsm/controls/TrackballControls.js +8 -8
- package/examples/jsm/controls/TransformControls.js +34 -2
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- 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 +152 -9
- package/examples/jsm/exporters/USDZExporter.js +22 -3
- package/examples/jsm/geometries/DecalGeometry.js +1 -1
- package/examples/jsm/geometries/TextGeometry.js +18 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -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/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +203 -88
- package/examples/jsm/inspector/RendererInspector.js +14 -4
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +41 -7
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +51 -3
- package/examples/jsm/inspector/tabs/Performance.js +4 -4
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +107 -5
- package/examples/jsm/inspector/ui/Graph.js +2 -2
- package/examples/jsm/inspector/ui/List.js +1 -1
- package/examples/jsm/inspector/ui/Profiler.js +1936 -34
- package/examples/jsm/inspector/ui/Style.js +1044 -31
- package/examples/jsm/inspector/ui/Tab.js +222 -3
- package/examples/jsm/inspector/ui/Values.js +55 -2
- package/examples/jsm/inspector/ui/utils.js +13 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- package/examples/jsm/lines/LineMaterial.js +7 -1
- 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 +687 -48
- package/examples/jsm/loaders/FBXLoader.js +235 -37
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +146 -178
- package/examples/jsm/loaders/HDRLoader.js +1 -2
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +27 -5
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- 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 +2 -2
- 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 +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/usd/USDAParser.js +450 -363
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4594 -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/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/Volume.js +0 -1
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -25
- package/examples/jsm/objects/Sky.js +90 -6
- package/examples/jsm/objects/SkyMesh.js +150 -16
- 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 +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +174 -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 +63 -6
- 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/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +16 -6
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
- 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/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +6 -4
- package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
- package/examples/jsm/tsl/display/GodraysNode.js +615 -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 +69 -19
- 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 -24
- 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/SharpenNode.js +283 -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/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +315 -126
- 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/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
- package/examples/jsm/utils/ColorUtils.js +76 -0
- 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/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
- package/package.json +24 -30
- package/src/Three.Core.js +3 -1
- package/src/Three.TSL.js +25 -11
- package/src/Three.WebGPU.Nodes.js +5 -0
- package/src/Three.WebGPU.js +9 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- 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/AudioContext.js +2 -2
- 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/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +14 -2
- package/src/core/Clock.js +7 -0
- package/src/core/Object3D.js +52 -4
- package/src/core/Raycaster.js +2 -2
- package/src/core/RenderTarget.js +4 -4
- package/src/extras/PMREMGenerator.js +7 -18
- package/src/extras/TextureUtils.js +5 -1
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- 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/AudioLoader.js +11 -1
- package/src/loaders/Cache.js +28 -0
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +2 -3
- package/src/loaders/ImageBitmapLoader.js +12 -9
- package/src/loaders/Loader.js +6 -0
- package/src/loaders/MaterialLoader.js +3 -2
- package/src/loaders/ObjectLoader.js +46 -6
- package/src/loaders/nodes/NodeLoader.js +2 -2
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +2 -0
- package/src/materials/MeshLambertMaterial.js +9 -0
- package/src/materials/MeshPhongMaterial.js +9 -0
- package/src/materials/MeshToonMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +20 -1
- package/src/materials/nodes/Line2NodeMaterial.js +34 -7
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +45 -25
- package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +10 -10
- package/src/math/Matrix2.js +13 -9
- package/src/math/Matrix3.js +13 -9
- package/src/math/Matrix4.js +87 -74
- package/src/math/Plane.js +4 -3
- package/src/math/Quaternion.js +3 -29
- package/src/math/Sphere.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +11 -7
- package/src/math/Vector3.js +15 -13
- package/src/math/Vector4.js +13 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +86 -68
- package/src/nodes/TSL.js +7 -7
- 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 +107 -15
- 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 +27 -2
- package/src/nodes/accessors/InstanceNode.js +148 -43
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- 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/Object3DNode.js +1 -1
- package/src/nodes/accessors/Position.js +34 -2
- package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
- package/src/nodes/accessors/ReferenceNode.js +8 -8
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +14 -25
- package/src/nodes/accessors/StorageTextureNode.js +40 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +32 -35
- package/src/nodes/accessors/TextureNode.js +67 -23
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +1 -1
- package/src/nodes/code/FunctionNode.js +2 -3
- package/src/nodes/core/ArrayNode.js +21 -2
- package/src/nodes/core/AssignNode.js +3 -3
- package/src/nodes/core/AttributeNode.js +3 -3
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +104 -5
- package/src/nodes/core/IndexNode.js +2 -1
- package/src/nodes/core/InputNode.js +1 -1
- package/src/nodes/core/InspectorNode.js +1 -1
- package/src/nodes/core/IsolateNode.js +1 -1
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +112 -15
- package/src/nodes/core/NodeBuilder.js +284 -66
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +12 -4
- package/src/nodes/core/NodeUtils.js +11 -9
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +4 -4
- package/src/nodes/core/PropertyNode.js +19 -3
- package/src/nodes/core/StackNode.js +66 -17
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +17 -3
- package/src/nodes/core/StructTypeNode.js +12 -18
- package/src/nodes/core/SubBuildNode.js +2 -2
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +21 -5
- package/src/nodes/core/VarNode.js +48 -23
- package/src/nodes/core/VaryingNode.js +2 -19
- 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 +125 -16
- package/src/nodes/display/RenderOutputNode.js +7 -7
- package/src/nodes/display/ScreenNode.js +4 -2
- 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/ViewportDepthTextureNode.js +11 -15
- package/src/nodes/display/ViewportTextureNode.js +39 -11
- 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 +2 -2
- package/src/nodes/functions/PhysicalLightingModel.js +126 -45
- package/src/nodes/geometry/RangeNode.js +5 -3
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
- package/src/nodes/gpgpu/ComputeNode.js +74 -48
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
- 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 +7 -28
- package/src/nodes/lighting/PointShadowNode.js +162 -149
- package/src/nodes/lighting/ShadowFilterNode.js +53 -65
- package/src/nodes/lighting/ShadowNode.js +120 -42
- package/src/nodes/math/BitcastNode.js +1 -1
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +3 -3
- package/src/nodes/math/MathNode.js +76 -41
- package/src/nodes/math/OperatorNode.js +3 -2
- 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/TSLBase.js +1 -1
- package/src/nodes/tsl/TSLCore.js +38 -17
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +12 -12
- package/src/nodes/utils/EventNode.js +31 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
- package/src/nodes/utils/JoinNode.js +3 -3
- package/src/nodes/utils/LoopNode.js +1 -1
- package/src/nodes/utils/MemberNode.js +2 -2
- 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/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +1 -1
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +1 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +44 -16
- package/src/objects/InstancedMesh.js +30 -3
- 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/objects/SkinnedMesh.js +26 -9
- package/src/renderers/WebGLRenderer.js +329 -145
- package/src/renderers/common/Animation.js +3 -3
- package/src/renderers/common/Attributes.js +15 -1
- package/src/renderers/common/Backend.js +29 -8
- package/src/renderers/common/Background.js +26 -13
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +29 -14
- 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/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/Geometries.js +29 -3
- package/src/renderers/common/Info.js +333 -4
- package/src/renderers/common/InspectorBase.js +6 -1
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +40 -7
- package/src/renderers/common/PostProcessing.js +8 -206
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- 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 +17 -5
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +21 -5
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +481 -117
- package/src/renderers/common/Sampler.js +4 -4
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/Textures.js +89 -4
- package/src/renderers/common/TimestampQueryPool.js +5 -3
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +62 -1
- package/src/renderers/common/XRManager.js +37 -29
- package/src/renderers/common/extras/PMREMGenerator.js +25 -23
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
- 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_common_pars_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -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_pars_begin.glsl.js +2 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- 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 +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- 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 -6
- package/src/renderers/shaders/UniformsLib.js +7 -5
- package/src/renderers/shaders/UniformsUtils.js +27 -5
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +9 -4
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +270 -0
- package/src/renderers/webgl/WebGLProgram.js +49 -109
- package/src/renderers/webgl/WebGLPrograms.js +63 -51
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +188 -24
- package/src/renderers/webgl/WebGLState.js +75 -37
- package/src/renderers/webgl/WebGLTextures.js +215 -54
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
- package/src/renderers/webgl/WebGLUtils.js +6 -2
- package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
- package/src/renderers/webgpu/WebGPUBackend.js +260 -140
- package/src/renderers/webgpu/WebGPURenderer.js +2 -1
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -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 +156 -59
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
- package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +4 -2
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +2 -2
- package/src/textures/Texture.js +16 -5
- package/src/utils.js +280 -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/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -44,7 +44,7 @@ import {
|
|
|
44
44
|
VectorKeyframeTrack
|
|
45
45
|
} from 'three';
|
|
46
46
|
|
|
47
|
-
import
|
|
47
|
+
import { unzlibSync } from '../libs/fflate.module.js';
|
|
48
48
|
import { NURBSCurve } from '../curves/NURBSCurve.js';
|
|
49
49
|
|
|
50
50
|
let fbxTree;
|
|
@@ -601,7 +601,8 @@ class FBXTreeParser {
|
|
|
601
601
|
|
|
602
602
|
}
|
|
603
603
|
|
|
604
|
-
// the transparency handling is implemented based on Blender
|
|
604
|
+
// the transparency handling is implemented based on Blender's approach:
|
|
605
|
+
// https://github.com/blender/blender/blob/main/scripts/addons_core/io_scene_fbx/import_fbx.py
|
|
605
606
|
|
|
606
607
|
parameters.opacity = 1 - ( materialNode.TransparencyFactor ? parseFloat( materialNode.TransparencyFactor.value ) : 0 );
|
|
607
608
|
|
|
@@ -611,7 +612,10 @@ class FBXTreeParser {
|
|
|
611
612
|
|
|
612
613
|
if ( parameters.opacity === null ) {
|
|
613
614
|
|
|
614
|
-
|
|
615
|
+
// Default to opaque. Some exporters (e.g. 3ds Max) define TransparentColor
|
|
616
|
+
// as white (1,1,1) without intending transparency, which makes the Unity-style
|
|
617
|
+
// fallback of `1 - TransparentColor.r` produce incorrect zero opacity.
|
|
618
|
+
parameters.opacity = 1;
|
|
615
619
|
|
|
616
620
|
}
|
|
617
621
|
|
|
@@ -824,8 +828,6 @@ class FBXTreeParser {
|
|
|
824
828
|
indices: [],
|
|
825
829
|
weights: [],
|
|
826
830
|
transformLink: new Matrix4().fromArray( boneNode.TransformLink.a ),
|
|
827
|
-
// transform: new Matrix4().fromArray( boneNode.Transform.a ),
|
|
828
|
-
// linkMode: boneNode.Mode,
|
|
829
831
|
|
|
830
832
|
};
|
|
831
833
|
|
|
@@ -918,8 +920,6 @@ class FBXTreeParser {
|
|
|
918
920
|
|
|
919
921
|
} );
|
|
920
922
|
|
|
921
|
-
this.bindSkeleton( deformers.skeletons, geometryMap, modelMap );
|
|
922
|
-
|
|
923
923
|
this.addGlobalSceneSettings();
|
|
924
924
|
|
|
925
925
|
sceneGraph.traverse( function ( node ) {
|
|
@@ -942,6 +942,64 @@ class FBXTreeParser {
|
|
|
942
942
|
|
|
943
943
|
} );
|
|
944
944
|
|
|
945
|
+
// Like Blender's FBX importer, use the BindPose section to set the
|
|
946
|
+
// rest pose for bones that are not part of a skin cluster. The BindPose
|
|
947
|
+
// provides a more authoritative rest pose than the Lcl properties which
|
|
948
|
+
// may represent an animation frame rather than the true rest state.
|
|
949
|
+
// Bones WITH clusters will get their bind pose from TransformLink
|
|
950
|
+
// (set via bindSkeleton below), which takes priority.
|
|
951
|
+
const bindPoseMatrices = this.parsePoseNodes();
|
|
952
|
+
const clusterBoneIDs = new Set();
|
|
953
|
+
|
|
954
|
+
for ( const ID in deformers.skeletons ) {
|
|
955
|
+
|
|
956
|
+
deformers.skeletons[ ID ].rawBones.forEach( function ( _, i ) {
|
|
957
|
+
|
|
958
|
+
const bone = deformers.skeletons[ ID ].bones[ i ];
|
|
959
|
+
if ( bone ) clusterBoneIDs.add( bone.ID );
|
|
960
|
+
|
|
961
|
+
} );
|
|
962
|
+
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
const tempMatrix = new Matrix4();
|
|
966
|
+
|
|
967
|
+
sceneGraph.traverse( function ( node ) {
|
|
968
|
+
|
|
969
|
+
if ( node.isBone && node.ID !== undefined && ! clusterBoneIDs.has( node.ID ) ) {
|
|
970
|
+
|
|
971
|
+
const bindPose = bindPoseMatrices[ node.ID ];
|
|
972
|
+
|
|
973
|
+
if ( bindPose !== undefined ) {
|
|
974
|
+
|
|
975
|
+
if ( node.parent ) {
|
|
976
|
+
|
|
977
|
+
tempMatrix.copy( node.parent.matrixWorld ).invert();
|
|
978
|
+
tempMatrix.multiply( bindPose );
|
|
979
|
+
|
|
980
|
+
} else {
|
|
981
|
+
|
|
982
|
+
tempMatrix.copy( bindPose );
|
|
983
|
+
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
tempMatrix.decompose( node.position, node.quaternion, node.scale );
|
|
987
|
+
node.updateMatrix();
|
|
988
|
+
node.matrixWorld.copy( bindPose );
|
|
989
|
+
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
} );
|
|
995
|
+
|
|
996
|
+
// Bind skeletons after transforms are applied so that bind matrices
|
|
997
|
+
// are computed from the final scene state. This ensures the rest pose
|
|
998
|
+
// is correct even when the FBX file's Cluster TransformLink matrices
|
|
999
|
+
// differ from the reconstructed bone transforms (common in files
|
|
1000
|
+
// without a BindPose section).
|
|
1001
|
+
this.bindSkeleton( deformers.skeletons, geometryMap, modelMap );
|
|
1002
|
+
|
|
945
1003
|
const animations = new AnimationParser().parse();
|
|
946
1004
|
|
|
947
1005
|
// if all the models where already combined in a single group, just return that
|
|
@@ -954,6 +1012,24 @@ class FBXTreeParser {
|
|
|
954
1012
|
|
|
955
1013
|
sceneGraph.animations = animations;
|
|
956
1014
|
|
|
1015
|
+
// Apply coordinate system correction. FBX files can use different
|
|
1016
|
+
// up-axis conventions (Y-up or Z-up). Three.js uses Y-up, so rotate
|
|
1017
|
+
// the scene when the file uses Z-up (UpAxis === 2).
|
|
1018
|
+
|
|
1019
|
+
if ( 'GlobalSettings' in fbxTree && 'UpAxis' in fbxTree.GlobalSettings ) {
|
|
1020
|
+
|
|
1021
|
+
const upAxis = fbxTree.GlobalSettings.UpAxis.value;
|
|
1022
|
+
|
|
1023
|
+
if ( upAxis === 2 ) {
|
|
1024
|
+
|
|
1025
|
+
console.warn( 'THREE.FBXLoader: You are loading an asset with a Z-UP coordinate system. The loader just rotates the asset to transform it into Y-UP. The vertex data are not converted.' );
|
|
1026
|
+
|
|
1027
|
+
sceneGraph.rotation.set( - Math.PI / 2, 0, 0 );
|
|
1028
|
+
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
}
|
|
1032
|
+
|
|
957
1033
|
}
|
|
958
1034
|
|
|
959
1035
|
// parse nodes in FBXTree.Objects.Model
|
|
@@ -1236,21 +1312,24 @@ class FBXTreeParser {
|
|
|
1236
1312
|
|
|
1237
1313
|
case 2: // Spot
|
|
1238
1314
|
let angle = Math.PI / 3;
|
|
1315
|
+
let penumbra = 0;
|
|
1239
1316
|
|
|
1240
|
-
if ( lightAttribute.
|
|
1317
|
+
if ( lightAttribute.OuterAngle !== undefined ) {
|
|
1241
1318
|
|
|
1242
|
-
angle = MathUtils.degToRad( lightAttribute.
|
|
1319
|
+
angle = MathUtils.degToRad( lightAttribute.OuterAngle.value );
|
|
1243
1320
|
|
|
1244
|
-
|
|
1321
|
+
if ( lightAttribute.InnerAngle !== undefined ) {
|
|
1245
1322
|
|
|
1246
|
-
|
|
1247
|
-
|
|
1323
|
+
penumbra = 1 - ( lightAttribute.InnerAngle.value / lightAttribute.OuterAngle.value );
|
|
1324
|
+
penumbra = Math.max( 0, penumbra ); // penumbra must be in the range [0,1]
|
|
1325
|
+
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
} else if ( lightAttribute.InnerAngle !== undefined ) {
|
|
1248
1329
|
|
|
1249
|
-
//
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
penumbra = MathUtils.degToRad( lightAttribute.OuterAngle.value );
|
|
1253
|
-
penumbra = Math.max( penumbra, 1 );
|
|
1330
|
+
// fallback if only InnerAngle is defined
|
|
1331
|
+
|
|
1332
|
+
angle = MathUtils.degToRad( lightAttribute.InnerAngle.value );
|
|
1254
1333
|
|
|
1255
1334
|
}
|
|
1256
1335
|
|
|
@@ -1460,12 +1539,30 @@ class FBXTreeParser {
|
|
|
1460
1539
|
|
|
1461
1540
|
bindSkeleton( skeletons, geometryMap, modelMap ) {
|
|
1462
1541
|
|
|
1463
|
-
const bindMatrices = this.parsePoseNodes();
|
|
1464
|
-
|
|
1465
1542
|
for ( const ID in skeletons ) {
|
|
1466
1543
|
|
|
1467
1544
|
const skeleton = skeletons[ ID ];
|
|
1468
1545
|
|
|
1546
|
+
// Compute bone inverses from TransformLink rather than from the
|
|
1547
|
+
// bones' current matrixWorld. The TransformLink matrices represent
|
|
1548
|
+
// each bone's global transform at the time the skin weights were
|
|
1549
|
+
// painted, which may differ from the scene-reconstructed transforms.
|
|
1550
|
+
const boneInverses = [];
|
|
1551
|
+
|
|
1552
|
+
for ( let i = 0, l = skeleton.bones.length; i < l; i ++ ) {
|
|
1553
|
+
|
|
1554
|
+
const inverse = new Matrix4();
|
|
1555
|
+
|
|
1556
|
+
if ( skeleton.bones[ i ] && skeleton.rawBones[ i ] ) {
|
|
1557
|
+
|
|
1558
|
+
inverse.copy( skeleton.rawBones[ i ].transformLink ).invert();
|
|
1559
|
+
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
boneInverses.push( inverse );
|
|
1563
|
+
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1469
1566
|
const parents = connections.get( parseInt( skeleton.ID ) ).parents;
|
|
1470
1567
|
|
|
1471
1568
|
parents.forEach( function ( parent ) {
|
|
@@ -1481,7 +1578,16 @@ class FBXTreeParser {
|
|
|
1481
1578
|
|
|
1482
1579
|
const model = modelMap.get( geoConnParent.ID );
|
|
1483
1580
|
|
|
1484
|
-
|
|
1581
|
+
// Use the mesh's current matrixWorld as bind matrix.
|
|
1582
|
+
// The BindPose section is intentionally not used here
|
|
1583
|
+
// since it may contain scale/rotation from the model
|
|
1584
|
+
// hierarchy that is inconsistent with the TransformLink-
|
|
1585
|
+
// based bone inverses. Always provide a bind matrix to
|
|
1586
|
+
// prevent bind() from calling calculateInverses() which
|
|
1587
|
+
// would overwrite the bone inverses computed above.
|
|
1588
|
+
model.updateMatrixWorld( true );
|
|
1589
|
+
|
|
1590
|
+
model.bind( new Skeleton( skeleton.bones, boneInverses ), model.matrixWorld );
|
|
1485
1591
|
|
|
1486
1592
|
}
|
|
1487
1593
|
|
|
@@ -1495,6 +1601,7 @@ class FBXTreeParser {
|
|
|
1495
1601
|
|
|
1496
1602
|
}
|
|
1497
1603
|
|
|
1604
|
+
// Parse BindPose nodes and return a map of node ID to bind matrix.
|
|
1498
1605
|
parsePoseNodes() {
|
|
1499
1606
|
|
|
1500
1607
|
const bindMatrices = {};
|
|
@@ -1615,11 +1722,9 @@ class GeometryParser {
|
|
|
1615
1722
|
|
|
1616
1723
|
case 'Mesh':
|
|
1617
1724
|
return this.parseMeshGeometry( relationships, geoNode, deformers );
|
|
1618
|
-
break;
|
|
1619
1725
|
|
|
1620
1726
|
case 'NurbsCurve':
|
|
1621
1727
|
return this.parseNurbsGeometry( geoNode );
|
|
1622
|
-
break;
|
|
1623
1728
|
|
|
1624
1729
|
}
|
|
1625
1730
|
|
|
@@ -2259,6 +2364,13 @@ class GeometryParser {
|
|
|
2259
2364
|
parentGeo.morphAttributes.position = [];
|
|
2260
2365
|
// parentGeo.morphAttributes.normal = []; // not implemented
|
|
2261
2366
|
|
|
2367
|
+
// Morph attribute positions are stored as deltas (morphTargetsRelative = true), so the
|
|
2368
|
+
// translation component of the geometric transform must not be applied to them — only the
|
|
2369
|
+
// rotation/scale part. Otherwise every delta gets the geometric translation added, which
|
|
2370
|
+
// shifts morphed vertices away from their intended position by `weight * translation` as
|
|
2371
|
+
// the influence increases.
|
|
2372
|
+
const morphPreTransform = preTransform.clone().setPosition( 0, 0, 0 );
|
|
2373
|
+
|
|
2262
2374
|
const scope = this;
|
|
2263
2375
|
morphTargets.forEach( function ( morphTarget ) {
|
|
2264
2376
|
|
|
@@ -2268,7 +2380,7 @@ class GeometryParser {
|
|
|
2268
2380
|
|
|
2269
2381
|
if ( morphGeoNode !== undefined ) {
|
|
2270
2382
|
|
|
2271
|
-
scope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode,
|
|
2383
|
+
scope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, morphPreTransform, rawTarget.name );
|
|
2272
2384
|
|
|
2273
2385
|
}
|
|
2274
2386
|
|
|
@@ -2663,11 +2775,15 @@ class AnimationParser {
|
|
|
2663
2775
|
|
|
2664
2776
|
if ( layerCurveNodes[ i ] === undefined ) {
|
|
2665
2777
|
|
|
2666
|
-
const
|
|
2778
|
+
const filteredParents = connections.get( child.ID ).parents.filter( function ( parent ) {
|
|
2667
2779
|
|
|
2668
2780
|
return parent.relationship !== undefined;
|
|
2669
2781
|
|
|
2670
|
-
} )
|
|
2782
|
+
} );
|
|
2783
|
+
|
|
2784
|
+
if ( filteredParents.length === 0 ) return;
|
|
2785
|
+
|
|
2786
|
+
const modelID = filteredParents[ 0 ].ID;
|
|
2671
2787
|
|
|
2672
2788
|
if ( modelID !== undefined ) {
|
|
2673
2789
|
|
|
@@ -2696,7 +2812,13 @@ class AnimationParser {
|
|
|
2696
2812
|
|
|
2697
2813
|
node.transform = child.matrix;
|
|
2698
2814
|
|
|
2699
|
-
if ( child.userData.transformData )
|
|
2815
|
+
if ( child.userData.transformData ) {
|
|
2816
|
+
|
|
2817
|
+
node.eulerOrder = child.userData.transformData.eulerOrder;
|
|
2818
|
+
|
|
2819
|
+
if ( child.userData.transformData.rotation ) node.initialRotation = child.userData.transformData.rotation;
|
|
2820
|
+
|
|
2821
|
+
}
|
|
2700
2822
|
|
|
2701
2823
|
}
|
|
2702
2824
|
|
|
@@ -2721,11 +2843,15 @@ class AnimationParser {
|
|
|
2721
2843
|
|
|
2722
2844
|
if ( layerCurveNodes[ i ] === undefined ) {
|
|
2723
2845
|
|
|
2724
|
-
const
|
|
2846
|
+
const filteredParents = connections.get( child.ID ).parents.filter( function ( parent ) {
|
|
2725
2847
|
|
|
2726
2848
|
return parent.relationship !== undefined;
|
|
2727
2849
|
|
|
2728
|
-
} )
|
|
2850
|
+
} );
|
|
2851
|
+
|
|
2852
|
+
if ( filteredParents.length === 0 ) return;
|
|
2853
|
+
|
|
2854
|
+
const deformerID = filteredParents[ 0 ].ID;
|
|
2729
2855
|
|
|
2730
2856
|
const morpherID = connections.get( deformerID ).parents[ 0 ].ID;
|
|
2731
2857
|
const geoID = connections.get( morpherID ).parents[ 0 ].ID;
|
|
@@ -2836,7 +2962,7 @@ class AnimationParser {
|
|
|
2836
2962
|
|
|
2837
2963
|
if ( rawTracks.R !== undefined && Object.keys( rawTracks.R.curves ).length > 0 ) {
|
|
2838
2964
|
|
|
2839
|
-
const rotationTrack = this.generateRotationTrack( rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder );
|
|
2965
|
+
const rotationTrack = this.generateRotationTrack( rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder, rawTracks.initialRotation );
|
|
2840
2966
|
if ( rotationTrack !== undefined ) tracks.push( rotationTrack );
|
|
2841
2967
|
|
|
2842
2968
|
}
|
|
@@ -2868,17 +2994,33 @@ class AnimationParser {
|
|
|
2868
2994
|
|
|
2869
2995
|
}
|
|
2870
2996
|
|
|
2871
|
-
generateRotationTrack( modelName, curves, preRotation, postRotation, eulerOrder ) {
|
|
2997
|
+
generateRotationTrack( modelName, curves, preRotation, postRotation, eulerOrder, initialRotation ) {
|
|
2872
2998
|
|
|
2873
2999
|
let times;
|
|
2874
3000
|
let values;
|
|
2875
3001
|
|
|
2876
|
-
if ( curves.x !== undefined
|
|
3002
|
+
if ( curves.x !== undefined || curves.y !== undefined || curves.z !== undefined ) {
|
|
3003
|
+
|
|
3004
|
+
// Get merged, sorted, unique times from all available curves
|
|
3005
|
+
const mergedTimes = this.getTimesForAllAxes( curves );
|
|
3006
|
+
|
|
3007
|
+
if ( mergedTimes.length > 0 ) {
|
|
2877
3008
|
|
|
2878
|
-
|
|
3009
|
+
const initialRot = initialRotation || [ 0, 0, 0 ];
|
|
2879
3010
|
|
|
2880
|
-
|
|
2881
|
-
|
|
3011
|
+
// Synchronize all curves to the merged time array.
|
|
3012
|
+
// Missing axes are filled with constant values from the initial rotation (Lcl Rotation).
|
|
3013
|
+
// Existing curves at different times are linearly interpolated.
|
|
3014
|
+
const syncX = this.synchronizeCurve( curves.x, mergedTimes, initialRot[ 0 ] );
|
|
3015
|
+
const syncY = this.synchronizeCurve( curves.y, mergedTimes, initialRot[ 1 ] );
|
|
3016
|
+
const syncZ = this.synchronizeCurve( curves.z, mergedTimes, initialRot[ 2 ] );
|
|
3017
|
+
|
|
3018
|
+
const result = this.interpolateRotations( syncX, syncY, syncZ, eulerOrder );
|
|
3019
|
+
|
|
3020
|
+
times = result[ 0 ];
|
|
3021
|
+
values = result[ 1 ];
|
|
3022
|
+
|
|
3023
|
+
}
|
|
2882
3024
|
|
|
2883
3025
|
}
|
|
2884
3026
|
|
|
@@ -2910,7 +3052,7 @@ class AnimationParser {
|
|
|
2910
3052
|
|
|
2911
3053
|
const quaternionValues = [];
|
|
2912
3054
|
|
|
2913
|
-
if ( ! values || ! times ) return
|
|
3055
|
+
if ( ! values || ! times ) return undefined;
|
|
2914
3056
|
|
|
2915
3057
|
for ( let i = 0; i < values.length; i += 3 ) {
|
|
2916
3058
|
|
|
@@ -3063,6 +3205,62 @@ class AnimationParser {
|
|
|
3063
3205
|
|
|
3064
3206
|
}
|
|
3065
3207
|
|
|
3208
|
+
// Synchronize a curve to a target time array using linear interpolation.
|
|
3209
|
+
// If the curve is undefined (axis not animated), returns constant values from initialValue.
|
|
3210
|
+
synchronizeCurve( curve, targetTimes, initialValue ) {
|
|
3211
|
+
|
|
3212
|
+
if ( curve === undefined ) {
|
|
3213
|
+
|
|
3214
|
+
return { times: targetTimes, values: targetTimes.map( () => initialValue ) };
|
|
3215
|
+
|
|
3216
|
+
}
|
|
3217
|
+
|
|
3218
|
+
// If the curve already has the same number of keyframes as the target, assume times match
|
|
3219
|
+
if ( curve.times.length === targetTimes.length ) return curve;
|
|
3220
|
+
|
|
3221
|
+
// Linearly interpolate curve values at each target time
|
|
3222
|
+
const values = [];
|
|
3223
|
+
|
|
3224
|
+
for ( let i = 0; i < targetTimes.length; i ++ ) {
|
|
3225
|
+
|
|
3226
|
+
values.push( this.sampleCurveValue( curve, targetTimes[ i ], initialValue ) );
|
|
3227
|
+
|
|
3228
|
+
}
|
|
3229
|
+
|
|
3230
|
+
return { times: targetTimes, values: values };
|
|
3231
|
+
|
|
3232
|
+
}
|
|
3233
|
+
|
|
3234
|
+
// Sample a single value from a curve at a given time using linear interpolation
|
|
3235
|
+
sampleCurveValue( curve, time, initialValue ) {
|
|
3236
|
+
|
|
3237
|
+
const times = curve.times;
|
|
3238
|
+
const values = curve.values;
|
|
3239
|
+
|
|
3240
|
+
// Before first keyframe
|
|
3241
|
+
if ( time <= times[ 0 ] ) return values[ 0 ];
|
|
3242
|
+
|
|
3243
|
+
// After last keyframe
|
|
3244
|
+
if ( time >= times[ times.length - 1 ] ) return values[ values.length - 1 ];
|
|
3245
|
+
|
|
3246
|
+
// Find surrounding keyframes and linearly interpolate
|
|
3247
|
+
for ( let i = 0; i < times.length - 1; i ++ ) {
|
|
3248
|
+
|
|
3249
|
+
if ( time >= times[ i ] && time <= times[ i + 1 ] ) {
|
|
3250
|
+
|
|
3251
|
+
if ( times[ i ] === time ) return values[ i ];
|
|
3252
|
+
|
|
3253
|
+
const alpha = ( time - times[ i ] ) / ( times[ i + 1 ] - times[ i ] );
|
|
3254
|
+
return values[ i ] * ( 1 - alpha ) + values[ i + 1 ] * alpha;
|
|
3255
|
+
|
|
3256
|
+
}
|
|
3257
|
+
|
|
3258
|
+
}
|
|
3259
|
+
|
|
3260
|
+
return initialValue;
|
|
3261
|
+
|
|
3262
|
+
}
|
|
3263
|
+
|
|
3066
3264
|
// Rotations are defined as Euler angles which can have values of any size
|
|
3067
3265
|
// These will be converted to quaternions which don't support values greater than
|
|
3068
3266
|
// PI, so we'll interpolate large rotations
|
|
@@ -3132,7 +3330,7 @@ class AnimationParser {
|
|
|
3132
3330
|
const Q2 = new Quaternion().setFromEuler( E2 );
|
|
3133
3331
|
|
|
3134
3332
|
// Check unroll
|
|
3135
|
-
if ( Q1.dot( Q2 ) ) {
|
|
3333
|
+
if ( Q1.dot( Q2 ) < 0 ) {
|
|
3136
3334
|
|
|
3137
3335
|
Q2.set( - Q2.x, - Q2.y, - Q2.z, - Q2.w );
|
|
3138
3336
|
|
|
@@ -3799,7 +3997,7 @@ class BinaryParser {
|
|
|
3799
3997
|
|
|
3800
3998
|
}
|
|
3801
3999
|
|
|
3802
|
-
const data =
|
|
4000
|
+
const data = unzlibSync( new Uint8Array( reader.getArrayBuffer( compressedLength ) ) );
|
|
3803
4001
|
const reader2 = new BinaryReader( data.buffer );
|
|
3804
4002
|
|
|
3805
4003
|
switch ( type ) {
|
|
@@ -94,7 +94,7 @@ class GCodeLoader extends Loader {
|
|
|
94
94
|
*/
|
|
95
95
|
parse( data ) {
|
|
96
96
|
|
|
97
|
-
let state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false };
|
|
97
|
+
let state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false, extrusionOverride: false, extrusionRelative: false };
|
|
98
98
|
const layers = [];
|
|
99
99
|
|
|
100
100
|
let currentLayer = undefined;
|
|
@@ -147,6 +147,14 @@ class GCodeLoader extends Loader {
|
|
|
147
147
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
function absoluteExtrusion( v1, v2 ) {
|
|
151
|
+
|
|
152
|
+
const relative = state.extrusionOverride ? state.extrusionRelative : state.relative;
|
|
153
|
+
|
|
154
|
+
return relative ? v1 + v2 : v2;
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
|
|
150
158
|
const lines = data.replace( /;.+/g, '' ).split( '\n' );
|
|
151
159
|
|
|
152
160
|
for ( let i = 0; i < lines.length; i ++ ) {
|
|
@@ -172,13 +180,13 @@ class GCodeLoader extends Loader {
|
|
|
172
180
|
//G0/G1 – Linear Movement
|
|
173
181
|
if ( cmd === 'G0' || cmd === 'G1' ) {
|
|
174
182
|
|
|
175
|
-
const line = {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
183
|
+
const line = Object.assign( {}, state ); // clone state
|
|
184
|
+
|
|
185
|
+
if ( args.x !== undefined ) line.x = absolute( state.x, args.x );
|
|
186
|
+
if ( args.y !== undefined ) line.y = absolute( state.y, args.y );
|
|
187
|
+
if ( args.z !== undefined ) line.z = absolute( state.z, args.z );
|
|
188
|
+
if ( args.e !== undefined ) line.e = absoluteExtrusion( state.e, args.e );
|
|
189
|
+
if ( args.f !== undefined ) line.f = absolute( state.f, args.f );
|
|
182
190
|
|
|
183
191
|
//Layer change detection is or made by watching Z, it's made by watching when we extrude at a new Z position
|
|
184
192
|
if ( delta( state.e, line.e ) > 0 ) {
|
|
@@ -206,11 +214,29 @@ class GCodeLoader extends Loader {
|
|
|
206
214
|
//G90: Set to Absolute Positioning
|
|
207
215
|
state.relative = false;
|
|
208
216
|
|
|
217
|
+
// reset M82/M83 extrusion override
|
|
218
|
+
state.extrusionOverride = false;
|
|
219
|
+
|
|
209
220
|
} else if ( cmd === 'G91' ) {
|
|
210
221
|
|
|
211
222
|
//G91: Set to state.relative Positioning
|
|
212
223
|
state.relative = true;
|
|
213
224
|
|
|
225
|
+
// reset M82/M83 extrusion override
|
|
226
|
+
state.extrusionOverride = false;
|
|
227
|
+
|
|
228
|
+
} else if ( cmd === 'M82' ) {
|
|
229
|
+
|
|
230
|
+
//M82: Override G91 and put the E axis into absolute mode independent of the other axes
|
|
231
|
+
state.extrusionOverride = true;
|
|
232
|
+
state.extrusionRelative = false;
|
|
233
|
+
|
|
234
|
+
} else if ( cmd === 'M83' ) {
|
|
235
|
+
|
|
236
|
+
//M83: Overrides G90 and put the E axis into relative mode independent of the other axes
|
|
237
|
+
state.extrusionOverride = true;
|
|
238
|
+
state.extrusionRelative = true;
|
|
239
|
+
|
|
214
240
|
} else if ( cmd === 'G92' ) {
|
|
215
241
|
|
|
216
242
|
//G92: Set Position
|