@needle-tools/three 0.145.2 → 0.146.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/three.cjs +3559 -6924
- package/build/three.js +3559 -6924
- package/build/three.min.js +1 -2
- package/build/three.module.js +732 -339
- package/examples/js/animation/AnimationClipCreator.js +0 -8
- package/examples/js/animation/CCDIKSolver.js +49 -66
- package/examples/js/animation/MMDAnimationHelper.js +66 -137
- package/examples/js/animation/MMDPhysics.js +70 -134
- package/examples/js/cameras/CinematicCamera.js +33 -22
- package/examples/js/controls/ArcballControls.js +138 -405
- package/examples/js/controls/DragControls.js +8 -33
- package/examples/js/controls/FirstPersonControls.js +32 -54
- package/examples/js/controls/FlyControls.js +29 -55
- package/examples/js/controls/OrbitControls.js +85 -95
- package/examples/js/controls/PointerLockControls.js +5 -14
- package/examples/js/controls/TrackballControls.js +33 -86
- package/examples/js/controls/TransformControls.js +84 -169
- package/examples/js/csm/CSM.js +4 -39
- package/examples/js/csm/CSMFrustum.js +3 -9
- package/examples/js/csm/CSMHelper.js +24 -4
- package/examples/js/csm/CSMShader.js +2 -6
- package/examples/js/curves/CurveExtras.js +27 -27
- package/examples/js/curves/NURBSCurve.js +4 -16
- package/examples/js/curves/NURBSSurface.js +3 -9
- package/examples/js/curves/NURBSUtils.js +8 -45
- package/examples/js/effects/AnaglyphEffect.js +4 -18
- package/examples/js/effects/AsciiEffect.js +32 -31
- package/examples/js/effects/OutlineEffect.js +26 -30
- package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
- package/examples/js/effects/PeppersGhostEffect.js +12 -39
- package/examples/js/effects/StereoEffect.js +0 -4
- package/examples/js/environments/RoomEnvironment.js +12 -10
- package/examples/js/exporters/ColladaExporter.js +48 -65
- package/examples/js/exporters/DRACOExporter.js +22 -22
- package/examples/js/exporters/EXRExporter.js +15 -18
- package/examples/js/exporters/GLTFExporter.js +143 -261
- package/examples/js/exporters/MMDExporter.js +5 -12
- package/examples/js/exporters/OBJExporter.js +42 -33
- package/examples/js/exporters/PLYExporter.js +38 -33
- package/examples/js/exporters/STLExporter.js +5 -7
- package/examples/js/exporters/USDZExporter.js +110 -25
- package/examples/js/geometries/BoxLineGeometry.js +0 -1
- package/examples/js/geometries/ConvexGeometry.js +11 -6
- package/examples/js/geometries/DecalGeometry.js +53 -20
- package/examples/js/geometries/LightningStrike.js +54 -67
- package/examples/js/geometries/ParametricGeometries.js +8 -7
- package/examples/js/geometries/ParametricGeometry.js +25 -12
- package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
- package/examples/js/geometries/TeapotGeometry.js +54 -50
- package/examples/js/geometries/TextGeometry.js +6 -4
- package/examples/js/helpers/LightProbeHelper.js +1 -2
- package/examples/js/helpers/OctreeHelper.js +22 -20
- package/examples/js/helpers/PositionalAudioHelper.js +8 -6
- package/examples/js/helpers/RectAreaLightHelper.js +6 -7
- package/examples/js/helpers/VertexNormalsHelper.js +15 -13
- package/examples/js/helpers/VertexTangentsHelper.js +15 -9
- package/examples/js/helpers/ViewHelper.js +31 -16
- package/examples/js/interactive/HTMLMesh.js +22 -33
- package/examples/js/interactive/InteractiveGroup.js +6 -12
- package/examples/js/interactive/SelectionBox.js +3 -70
- package/examples/js/interactive/SelectionHelper.js +0 -8
- package/examples/js/lights/LightProbeGenerator.js +32 -39
- package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
- package/examples/js/lines/LineGeometry.js +3 -5
- package/examples/js/lines/LineMaterial.js +4 -11
- package/examples/js/lines/LineSegments2.js +38 -89
- package/examples/js/lines/LineSegmentsGeometry.js +7 -28
- package/examples/js/lines/Wireframe.js +2 -7
- package/examples/js/lines/WireframeGeometry2.js +3 -1
- package/examples/js/loaders/3DMLoader.js +58 -155
- package/examples/js/loaders/3MFLoader.js +72 -106
- package/examples/js/loaders/AMFLoader.js +0 -25
- package/examples/js/loaders/BVHLoader.js +44 -43
- package/examples/js/loaders/BasisTextureLoader.js +16 -46
- package/examples/js/loaders/ColladaLoader.js +201 -359
- package/examples/js/loaders/DDSLoader.js +24 -25
- package/examples/js/loaders/DRACOLoader.js +29 -66
- package/examples/js/loaders/EXRLoader.js +67 -164
- package/examples/js/loaders/FBXLoader.js +286 -441
- package/examples/js/loaders/FontLoader.js +6 -15
- package/examples/js/loaders/GCodeLoader.js +15 -16
- package/examples/js/loaders/GLTFLoader.js +354 -405
- package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
- package/examples/js/loaders/KMZLoader.js +3 -7
- package/examples/js/loaders/KTXLoader.js +12 -30
- package/examples/js/loaders/LDrawLoader.js +178 -289
- package/examples/js/loaders/LUT3dlLoader.js +7 -11
- package/examples/js/loaders/LUTCubeLoader.js +0 -8
- package/examples/js/loaders/LWOLoader.js +59 -124
- package/examples/js/loaders/LogLuvLoader.js +27 -77
- package/examples/js/loaders/LottieLoader.js +4 -4
- package/examples/js/loaders/MD2Loader.js +26 -27
- package/examples/js/loaders/MDDLoader.js +6 -10
- package/examples/js/loaders/MMDLoader.js +180 -189
- package/examples/js/loaders/MTLLoader.js +18 -47
- package/examples/js/loaders/MaterialXLoader.js +392 -0
- package/examples/js/loaders/NRRDLoader.js +44 -84
- package/examples/js/loaders/OBJLoader.js +50 -65
- package/examples/js/loaders/PCDLoader.js +34 -29
- package/examples/js/loaders/PDBLoader.js +17 -13
- package/examples/js/loaders/PLYLoader.js +9 -39
- package/examples/js/loaders/PRWMLoader.js +11 -22
- package/examples/js/loaders/PVRLoader.js +7 -16
- package/examples/js/loaders/RGBELoader.js +36 -61
- package/examples/js/loaders/RGBMLoader.js +26 -87
- package/examples/js/loaders/STLLoader.js +20 -27
- package/examples/js/loaders/SVGLoader.js +361 -233
- package/examples/js/loaders/TDSLoader.js +81 -118
- package/examples/js/loaders/TGALoader.js +39 -41
- package/examples/js/loaders/TIFFLoader.js +0 -1
- package/examples/js/loaders/TTFLoader.js +0 -8
- package/examples/js/loaders/TiltLoader.js +14 -15
- package/examples/js/loaders/VOXLoader.js +8 -16
- package/examples/js/loaders/VRMLLoader.js +243 -340
- package/examples/js/loaders/VTKLoader.js +101 -118
- package/examples/js/loaders/XYZLoader.js +2 -4
- package/examples/js/loaders/lwo/IFFParser.js +55 -136
- package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
- package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
- package/examples/js/materials/MeshGouraudMaterial.js +15 -13
- package/examples/js/math/Capsule.js +0 -17
- package/examples/js/math/ColorConverter.js +3 -3
- package/examples/js/math/ConvexHull.js +183 -139
- package/examples/js/math/ImprovedNoise.js +1 -1
- package/examples/js/math/Lut.js +8 -15
- package/examples/js/math/MeshSurfaceSampler.js +6 -28
- package/examples/js/math/OBB.js +90 -49
- package/examples/js/math/Octree.js +2 -57
- package/examples/js/math/SimplexNoise.js +74 -88
- package/examples/js/misc/ConvexObjectBreaker.js +37 -48
- package/examples/js/misc/GPUComputationRenderer.js +14 -18
- package/examples/js/misc/Gyroscope.js +5 -9
- package/examples/js/misc/MD2Character.js +14 -23
- package/examples/js/misc/MD2CharacterComplex.js +73 -54
- package/examples/js/misc/MorphAnimMesh.js +0 -6
- package/examples/js/misc/MorphBlendMesh.js +3 -30
- package/examples/js/misc/ProgressiveLightMap.js +47 -43
- package/examples/js/misc/RollerCoaster.js +17 -24
- package/examples/js/misc/TubePainter.js +18 -12
- package/examples/js/misc/Volume.js +16 -45
- package/examples/js/misc/VolumeSlice.js +14 -24
- package/examples/js/modifiers/CurveModifier.js +19 -21
- package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
- package/examples/js/modifiers/SimplifyModifier.js +56 -59
- package/examples/js/modifiers/TessellateModifier.js +2 -9
- package/examples/js/objects/GroundProjectedEnv.js +2 -14
- package/examples/js/objects/Lensflare.js +47 -38
- package/examples/js/objects/LightningStorm.js +10 -13
- package/examples/js/objects/MarchingCubes.js +80 -59
- package/examples/js/objects/Reflector.js +22 -20
- package/examples/js/objects/ReflectorForSSRPass.js +19 -23
- package/examples/js/objects/Refractor.js +52 -30
- package/examples/js/objects/ShadowMesh.js +1 -2
- package/examples/js/objects/Sky.js +2 -7
- package/examples/js/objects/Water.js +23 -18
- package/examples/js/objects/Water2.js +20 -19
- package/examples/js/physics/AmmoPhysics.js +23 -20
- package/examples/js/physics/OimoPhysics.js +19 -17
- package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
- package/examples/js/postprocessing/AfterimagePass.js +19 -12
- package/examples/js/postprocessing/BloomPass.js +38 -17
- package/examples/js/postprocessing/BokehPass.js +29 -12
- package/examples/js/postprocessing/ClearPass.js +1 -6
- package/examples/js/postprocessing/CubeTexturePass.js +12 -9
- package/examples/js/postprocessing/DotScreenPass.js +7 -5
- package/examples/js/postprocessing/EffectComposer.js +25 -32
- package/examples/js/postprocessing/FilmPass.js +7 -5
- package/examples/js/postprocessing/GlitchPass.js +10 -11
- package/examples/js/postprocessing/HalftonePass.js +9 -9
- package/examples/js/postprocessing/LUTPass.js +2 -15
- package/examples/js/postprocessing/MaskPass.js +20 -17
- package/examples/js/postprocessing/OutlinePass.js +45 -36
- package/examples/js/postprocessing/Pass.js +11 -14
- package/examples/js/postprocessing/RenderPass.js +3 -7
- package/examples/js/postprocessing/SAOPass.js +40 -32
- package/examples/js/postprocessing/SMAAPass.js +34 -17
- package/examples/js/postprocessing/SSAARenderPass.js +14 -14
- package/examples/js/postprocessing/SSAOPass.js +56 -42
- package/examples/js/postprocessing/SSRPass.js +78 -61
- package/examples/js/postprocessing/SavePass.js +14 -6
- package/examples/js/postprocessing/ShaderPass.js +9 -8
- package/examples/js/postprocessing/TAARenderPass.js +11 -9
- package/examples/js/postprocessing/TexturePass.js +7 -4
- package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
- package/examples/js/renderers/CSS2DRenderer.js +2 -21
- package/examples/js/renderers/CSS3DRenderer.js +3 -24
- package/examples/js/renderers/Projector.js +29 -85
- package/examples/js/renderers/SVGRenderer.js +4 -50
- package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
- package/examples/js/shaders/AfterimageShader.js +3 -6
- package/examples/js/shaders/BasicShader.js +3 -6
- package/examples/js/shaders/BleachBypassShader.js +3 -6
- package/examples/js/shaders/BlendShader.js +3 -6
- package/examples/js/shaders/BokehShader.js +3 -6
- package/examples/js/shaders/BokehShader2.js +4 -13
- package/examples/js/shaders/BrightnessContrastShader.js +3 -6
- package/examples/js/shaders/ColorCorrectionShader.js +2 -6
- package/examples/js/shaders/ColorifyShader.js +2 -6
- package/examples/js/shaders/ConvolutionShader.js +5 -10
- package/examples/js/shaders/CopyShader.js +3 -6
- package/examples/js/shaders/DOFMipMapShader.js +3 -6
- package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
- package/examples/js/shaders/DigitalGlitch.js +3 -6
- package/examples/js/shaders/DotScreenShader.js +2 -6
- package/examples/js/shaders/FXAAShader.js +1 -3
- package/examples/js/shaders/FilmShader.js +3 -6
- package/examples/js/shaders/FocusShader.js +3 -6
- package/examples/js/shaders/FreiChenShader.js +2 -6
- package/examples/js/shaders/GammaCorrectionShader.js +3 -6
- package/examples/js/shaders/GodRaysShader.js +11 -24
- package/examples/js/shaders/HalftoneShader.js +3 -6
- package/examples/js/shaders/HorizontalBlurShader.js +3 -6
- package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
- package/examples/js/shaders/HueSaturationShader.js +3 -6
- package/examples/js/shaders/KaleidoShader.js +3 -6
- package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
- package/examples/js/shaders/LuminosityShader.js +3 -6
- package/examples/js/shaders/MMDToonShader.js +2 -6
- package/examples/js/shaders/MirrorShader.js +3 -6
- package/examples/js/shaders/NormalMapShader.js +2 -6
- package/examples/js/shaders/RGBShiftShader.js +3 -6
- package/examples/js/shaders/SAOShader.js +2 -6
- package/examples/js/shaders/SMAAShader.js +6 -18
- package/examples/js/shaders/SSAOShader.js +2 -6
- package/examples/js/shaders/SSRShader.js +6 -18
- package/examples/js/shaders/SepiaShader.js +3 -6
- package/examples/js/shaders/SobelOperatorShader.js +2 -6
- package/examples/js/shaders/TechnicolorShader.js +3 -6
- package/examples/js/shaders/ToneMapShader.js +3 -6
- package/examples/js/shaders/ToonShader.js +8 -24
- package/examples/js/shaders/TriangleBlurShader.js +2 -6
- package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
- package/examples/js/shaders/VelocityShader.js +126 -0
- package/examples/js/shaders/VerticalBlurShader.js +3 -6
- package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
- package/examples/js/shaders/VignetteShader.js +3 -6
- package/examples/js/shaders/VolumeShader.js +2 -6
- package/examples/js/shaders/WaterRefractionShader.js +2 -6
- package/examples/js/textures/FlakesTexture.js +0 -1
- package/examples/js/utils/BufferGeometryUtils.js +234 -168
- package/examples/js/utils/CameraUtils.js +5 -20
- package/examples/js/utils/GPUStatsPanel.js +3 -12
- package/examples/js/utils/GeometryCompressionUtils.js +19 -44
- package/examples/js/utils/GeometryUtils.js +13 -18
- package/examples/js/utils/LDrawUtils.js +8 -11
- package/examples/js/utils/PackedPhongMaterial.js +6 -4
- package/examples/js/utils/SceneUtils.js +117 -6
- package/examples/js/utils/ShadowMapViewer.js +17 -14
- package/examples/js/utils/SkeletonUtils.js +13 -27
- package/examples/js/utils/UVsDebug.js +20 -12
- package/examples/js/utils/WorkerPool.js +1 -11
- package/examples/jsm/animation/CCDIKSolver.js +1 -1
- package/examples/jsm/capabilities/WebGPU.js +3 -1
- package/examples/jsm/controls/OrbitControls.js +44 -4
- package/examples/jsm/exporters/GLTFExporter.js +17 -131
- package/examples/jsm/exporters/USDZExporter.js +94 -28
- package/examples/jsm/interactive/HTMLMesh.js +2 -0
- package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
- package/examples/jsm/loaders/3DMLoader.js +1 -2
- package/examples/jsm/loaders/ColladaLoader.js +28 -0
- package/examples/jsm/loaders/FBXLoader.js +16 -2
- package/examples/jsm/loaders/GLTFLoader.js +204 -377
- package/examples/jsm/loaders/KTX2Loader.js +68 -29
- package/examples/jsm/loaders/LDrawLoader.js +14 -13
- package/examples/jsm/loaders/LottieLoader.js +4 -2
- package/examples/jsm/loaders/MaterialXLoader.js +728 -0
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +68 -16
- package/examples/jsm/loaders/SVGLoader.js +227 -14
- package/examples/jsm/loaders/USDZLoader.js +31 -16
- package/examples/jsm/nodes/Nodes.js +14 -2
- package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +1 -1
- package/examples/jsm/nodes/core/NodeBuilder.js +36 -4
- package/examples/jsm/nodes/core/NodeFrame.js +2 -2
- package/examples/jsm/nodes/core/NodeVarying.js +7 -4
- package/examples/jsm/nodes/core/VaryingNode.js +6 -4
- package/examples/jsm/nodes/core/constants.js +13 -13
- package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
- package/examples/jsm/nodes/display/ViewportNode.js +106 -0
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
- package/examples/jsm/nodes/materials/Materials.js +9 -7
- package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +6 -2
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
- package/examples/jsm/nodes/math/MathNode.js +5 -0
- package/examples/jsm/nodes/math/OperatorNode.js +6 -1
- package/examples/jsm/nodes/shadernode/ShaderNode.js +26 -13
- package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +2 -0
- package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +18 -0
- package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
- package/examples/jsm/nodes/utils/JoinNode.js +8 -2
- package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
- package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
- package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
- package/examples/jsm/nodes/utils/TimerNode.js +1 -1
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
- package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
- package/examples/jsm/postprocessing/BloomPass.js +22 -3
- package/examples/jsm/postprocessing/BokehPass.js +18 -4
- package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
- package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
- package/examples/jsm/postprocessing/EffectComposer.js +9 -0
- package/examples/jsm/postprocessing/FilmPass.js +8 -0
- package/examples/jsm/postprocessing/GlitchPass.js +13 -1
- package/examples/jsm/postprocessing/HalftonePass.js +8 -0
- package/examples/jsm/postprocessing/OutlinePass.js +10 -0
- package/examples/jsm/postprocessing/Pass.js +2 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
- package/examples/jsm/postprocessing/SAOPass.js +20 -0
- package/examples/jsm/postprocessing/SMAAPass.js +16 -0
- package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
- package/examples/jsm/postprocessing/SavePass.js +17 -1
- package/examples/jsm/postprocessing/ShaderPass.js +8 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
- package/examples/jsm/postprocessing/TexturePass.js +8 -0
- package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
- package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +39 -16
- package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
- package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
- package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
- package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +35 -5
- package/examples/jsm/shaders/MMDToonShader.js +0 -2
- package/examples/jsm/shaders/VelocityShader.js +128 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +130 -6
- package/examples/jsm/utils/SceneUtils.js +129 -4
- package/examples/jsm/utils/TextureUtils.js +85 -0
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +6 -3
- package/package.json +11 -12
- package/src/Three.js +1 -0
- package/src/audio/AudioContext.js +5 -5
- package/src/cameras/CubeCamera.js +14 -14
- package/src/constants.js +1 -1
- package/src/core/InstancedBufferGeometry.js +1 -7
- package/src/extras/Earcut.js +67 -67
- package/src/helpers/DirectionalLightHelper.js +5 -1
- package/src/helpers/HemisphereLightHelper.js +4 -1
- package/src/helpers/PointLightHelper.js +2 -1
- package/src/helpers/SpotLightHelper.js +4 -2
- package/src/lights/PointLight.js +2 -2
- package/src/lights/SpotLight.js +2 -2
- package/src/loaders/FileLoader.js +4 -1
- package/src/loaders/ObjectLoader.js +5 -1
- package/src/materials/Material.js +1 -1
- package/src/math/Color.js +5 -5
- package/src/math/Matrix3.js +53 -18
- package/src/math/Ray.js +2 -5
- package/src/math/Sphere.js +19 -26
- package/src/objects/InstancedMesh.js +7 -0
- package/src/objects/LOD.js +25 -6
- package/src/renderers/WebGL3DRenderTarget.js +1 -1
- package/src/renderers/WebGLArrayRenderTarget.js +1 -1
- package/src/renderers/WebGLCubeRenderTarget.js +1 -1
- package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
- package/src/renderers/WebGLRenderTarget.js +1 -1
- package/src/renderers/WebGLRenderer.js +36 -62
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk.js +3 -0
- package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
- package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +20 -6
- package/src/renderers/shaders/UniformsLib.js +1 -1
- package/src/renderers/shaders/UniformsUtils.js +15 -0
- package/src/renderers/webgl/WebGLAttributes.js +2 -0
- package/src/renderers/webgl/WebGLBackground.js +15 -7
- package/src/renderers/webgl/WebGLCubeUVMaps.js +1 -1
- package/src/renderers/webgl/WebGLLights.js +0 -4
- package/src/renderers/webgl/WebGLMaterials.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +3 -1
- package/src/renderers/webgl/WebGLState.js +31 -1
- package/src/renderers/webgl/WebGLTextures.js +71 -18
- package/src/renderers/webgl/WebGLUniforms.js +116 -20
- package/src/renderers/webgl/WebGLUtils.js +1 -1
- package/src/renderers/webxr/WebXRController.js +46 -13
- package/src/renderers/webxr/WebXRManager.js +85 -3
- package/src/scenes/Scene.js +8 -0
- package/src/textures/CompressedArrayTexture.js +18 -0
- package/examples/js/libs/lottie_canvas.js +0 -12751
- package/examples/js/shaders/PixelShader.js +0 -51
- package/examples/jsm/shaders/PixelShader.js +0 -44
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
* TODO
|
|
13
13
|
* - more precise grant skinning support.
|
|
14
14
|
*/
|
|
15
|
-
|
|
16
15
|
class MMDAnimationHelper {
|
|
17
16
|
|
|
18
17
|
/**
|
|
@@ -43,16 +42,14 @@
|
|
|
43
42
|
physics: true,
|
|
44
43
|
cameraAnimation: true
|
|
45
44
|
};
|
|
45
|
+
this.onBeforePhysics = function /* mesh */ () {};
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
/* mesh */
|
|
49
|
-
() {}; // experimental
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
// experimental
|
|
52
48
|
this.sharedPhysics = false;
|
|
53
49
|
this.masterPhysics = null;
|
|
54
50
|
|
|
55
51
|
}
|
|
52
|
+
|
|
56
53
|
/**
|
|
57
54
|
* Adds an Three.js Object to helper and setups animation.
|
|
58
55
|
* The anmation durations of added objects are synched
|
|
@@ -69,8 +66,6 @@
|
|
|
69
66
|
* @param {Number} params.delayTime - Only for THREE.Audio. Default is 0.0.
|
|
70
67
|
* @return {MMDAnimationHelper}
|
|
71
68
|
*/
|
|
72
|
-
|
|
73
|
-
|
|
74
69
|
add( object, params = {} ) {
|
|
75
70
|
|
|
76
71
|
if ( object.isSkinnedMesh ) {
|
|
@@ -95,14 +90,13 @@
|
|
|
95
90
|
return this;
|
|
96
91
|
|
|
97
92
|
}
|
|
93
|
+
|
|
98
94
|
/**
|
|
99
95
|
* Removes an Three.js Object from helper.
|
|
100
96
|
*
|
|
101
97
|
* @param {THREE.SkinnedMesh|THREE.Camera|THREE.Audio} object
|
|
102
98
|
* @return {MMDAnimationHelper}
|
|
103
99
|
*/
|
|
104
|
-
|
|
105
|
-
|
|
106
100
|
remove( object ) {
|
|
107
101
|
|
|
108
102
|
if ( object.isSkinnedMesh ) {
|
|
@@ -127,18 +121,16 @@
|
|
|
127
121
|
return this;
|
|
128
122
|
|
|
129
123
|
}
|
|
124
|
+
|
|
130
125
|
/**
|
|
131
126
|
* Updates the animation.
|
|
132
127
|
*
|
|
133
128
|
* @param {Number} delta
|
|
134
129
|
* @return {MMDAnimationHelper}
|
|
135
130
|
*/
|
|
136
|
-
|
|
137
|
-
|
|
138
131
|
update( delta ) {
|
|
139
132
|
|
|
140
133
|
if ( this.audioManager !== null ) this.audioManager.control( delta );
|
|
141
|
-
|
|
142
134
|
for ( let i = 0; i < this.meshes.length; i ++ ) {
|
|
143
135
|
|
|
144
136
|
this._animateMesh( this.meshes[ i ], delta );
|
|
@@ -150,6 +142,7 @@
|
|
|
150
142
|
return this;
|
|
151
143
|
|
|
152
144
|
}
|
|
145
|
+
|
|
153
146
|
/**
|
|
154
147
|
* Changes the pose of SkinnedMesh as VPD specifies.
|
|
155
148
|
*
|
|
@@ -161,15 +154,12 @@
|
|
|
161
154
|
* @param {boolean} params.grant - Default is true.
|
|
162
155
|
* @return {MMDAnimationHelper}
|
|
163
156
|
*/
|
|
164
|
-
|
|
165
|
-
|
|
166
157
|
pose( mesh, vpd, params = {} ) {
|
|
167
158
|
|
|
168
159
|
if ( params.resetPose !== false ) mesh.pose();
|
|
169
160
|
const bones = mesh.skeleton.bones;
|
|
170
161
|
const boneParams = vpd.bones;
|
|
171
162
|
const boneNameDictionary = {};
|
|
172
|
-
|
|
173
163
|
for ( let i = 0, il = bones.length; i < il; i ++ ) {
|
|
174
164
|
|
|
175
165
|
boneNameDictionary[ bones[ i ].name ] = i;
|
|
@@ -178,7 +168,6 @@
|
|
|
178
168
|
|
|
179
169
|
const vector = new THREE.Vector3();
|
|
180
170
|
const quaternion = new THREE.Quaternion();
|
|
181
|
-
|
|
182
171
|
for ( let i = 0, il = boneParams.length; i < il; i ++ ) {
|
|
183
172
|
|
|
184
173
|
const boneParam = boneParams[ i ];
|
|
@@ -190,15 +179,14 @@
|
|
|
190
179
|
|
|
191
180
|
}
|
|
192
181
|
|
|
193
|
-
mesh.updateMatrixWorld( true );
|
|
182
|
+
mesh.updateMatrixWorld( true );
|
|
194
183
|
|
|
184
|
+
// PMX animation system special path
|
|
195
185
|
if ( this.configuration.pmxAnimation && mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx' ) {
|
|
196
186
|
|
|
197
187
|
const sortedBonesData = this._sortBoneDataArray( mesh.geometry.userData.MMD.bones.slice() );
|
|
198
|
-
|
|
199
188
|
const ikSolver = params.ik !== false ? this._createCCDIKSolver( mesh ) : null;
|
|
200
189
|
const grantSolver = params.grant !== false ? this.createGrantSolver( mesh ) : null;
|
|
201
|
-
|
|
202
190
|
this._animatePMXMesh( mesh, sortedBonesData, ikSolver, grantSolver );
|
|
203
191
|
|
|
204
192
|
} else {
|
|
@@ -220,6 +208,7 @@
|
|
|
220
208
|
return this;
|
|
221
209
|
|
|
222
210
|
}
|
|
211
|
+
|
|
223
212
|
/**
|
|
224
213
|
* Enabes/Disables an animation feature.
|
|
225
214
|
*
|
|
@@ -227,8 +216,6 @@
|
|
|
227
216
|
* @param {boolean} enabled
|
|
228
217
|
* @return {MMDAnimationHelper}
|
|
229
218
|
*/
|
|
230
|
-
|
|
231
|
-
|
|
232
219
|
enable( key, enabled ) {
|
|
233
220
|
|
|
234
221
|
if ( this.enabled[ key ] === undefined ) {
|
|
@@ -238,7 +225,6 @@
|
|
|
238
225
|
}
|
|
239
226
|
|
|
240
227
|
this.enabled[ key ] = enabled;
|
|
241
|
-
|
|
242
228
|
if ( key === 'physics' ) {
|
|
243
229
|
|
|
244
230
|
for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
|
|
@@ -252,20 +238,20 @@
|
|
|
252
238
|
return this;
|
|
253
239
|
|
|
254
240
|
}
|
|
241
|
+
|
|
255
242
|
/**
|
|
256
243
|
* Creates an GrantSolver instance.
|
|
257
244
|
*
|
|
258
245
|
* @param {THREE.SkinnedMesh} mesh
|
|
259
246
|
* @return {GrantSolver}
|
|
260
247
|
*/
|
|
261
|
-
|
|
262
|
-
|
|
263
248
|
createGrantSolver( mesh ) {
|
|
264
249
|
|
|
265
250
|
return new GrantSolver( mesh, mesh.geometry.userData.MMD.grants );
|
|
266
251
|
|
|
267
|
-
}
|
|
252
|
+
}
|
|
268
253
|
|
|
254
|
+
// private methods
|
|
269
255
|
|
|
270
256
|
_addMesh( mesh, params ) {
|
|
271
257
|
|
|
@@ -279,9 +265,7 @@
|
|
|
279
265
|
this.objects.set( mesh, {
|
|
280
266
|
looped: false
|
|
281
267
|
} );
|
|
282
|
-
|
|
283
268
|
this._setupMeshAnimation( mesh, params.animation );
|
|
284
|
-
|
|
285
269
|
if ( params.physics !== false ) {
|
|
286
270
|
|
|
287
271
|
this._setupMeshPhysics( mesh, params );
|
|
@@ -291,7 +275,6 @@
|
|
|
291
275
|
return this;
|
|
292
276
|
|
|
293
277
|
}
|
|
294
|
-
|
|
295
278
|
_setupCamera( camera, params ) {
|
|
296
279
|
|
|
297
280
|
if ( this.camera === camera ) {
|
|
@@ -304,7 +287,6 @@
|
|
|
304
287
|
this.camera = camera;
|
|
305
288
|
camera.add( this.cameraTarget );
|
|
306
289
|
this.objects.set( camera, {} );
|
|
307
|
-
|
|
308
290
|
if ( params.animation !== undefined ) {
|
|
309
291
|
|
|
310
292
|
this._setupCameraAnimation( camera, params.animation );
|
|
@@ -314,7 +296,6 @@
|
|
|
314
296
|
return this;
|
|
315
297
|
|
|
316
298
|
}
|
|
317
|
-
|
|
318
299
|
_setupAudio( audio, params ) {
|
|
319
300
|
|
|
320
301
|
if ( this.audio === audio ) {
|
|
@@ -332,12 +313,10 @@
|
|
|
332
313
|
return this;
|
|
333
314
|
|
|
334
315
|
}
|
|
335
|
-
|
|
336
316
|
_removeMesh( mesh ) {
|
|
337
317
|
|
|
338
318
|
let found = false;
|
|
339
319
|
let writeIndex = 0;
|
|
340
|
-
|
|
341
320
|
for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
|
|
342
321
|
|
|
343
322
|
if ( this.meshes[ i ] === mesh ) {
|
|
@@ -362,7 +341,6 @@
|
|
|
362
341
|
return this;
|
|
363
342
|
|
|
364
343
|
}
|
|
365
|
-
|
|
366
344
|
_clearCamera( camera ) {
|
|
367
345
|
|
|
368
346
|
if ( camera !== this.camera ) {
|
|
@@ -377,7 +355,6 @@
|
|
|
377
355
|
return this;
|
|
378
356
|
|
|
379
357
|
}
|
|
380
|
-
|
|
381
358
|
_clearAudio( audio ) {
|
|
382
359
|
|
|
383
360
|
if ( audio !== this.audio ) {
|
|
@@ -392,23 +369,20 @@
|
|
|
392
369
|
return this;
|
|
393
370
|
|
|
394
371
|
}
|
|
395
|
-
|
|
396
372
|
_setupMeshAnimation( mesh, animation ) {
|
|
397
373
|
|
|
398
374
|
const objects = this.objects.get( mesh );
|
|
399
|
-
|
|
400
375
|
if ( animation !== undefined ) {
|
|
401
376
|
|
|
402
377
|
const animations = Array.isArray( animation ) ? animation : [ animation ];
|
|
403
378
|
objects.mixer = new THREE.AnimationMixer( mesh );
|
|
404
|
-
|
|
405
379
|
for ( let i = 0, il = animations.length; i < il; i ++ ) {
|
|
406
380
|
|
|
407
381
|
objects.mixer.clipAction( animations[ i ] ).play();
|
|
408
382
|
|
|
409
|
-
}
|
|
410
|
-
|
|
383
|
+
}
|
|
411
384
|
|
|
385
|
+
// TODO: find a workaround not to access ._clip looking like a private property
|
|
412
386
|
objects.mixer.addEventListener( 'loop', function ( event ) {
|
|
413
387
|
|
|
414
388
|
const tracks = event.action._clip.tracks;
|
|
@@ -424,13 +398,11 @@
|
|
|
424
398
|
return this;
|
|
425
399
|
|
|
426
400
|
}
|
|
427
|
-
|
|
428
401
|
_setupCameraAnimation( camera, animation ) {
|
|
429
402
|
|
|
430
403
|
const animations = Array.isArray( animation ) ? animation : [ animation ];
|
|
431
404
|
const objects = this.objects.get( camera );
|
|
432
405
|
objects.mixer = new THREE.AnimationMixer( camera );
|
|
433
|
-
|
|
434
406
|
for ( let i = 0, il = animations.length; i < il; i ++ ) {
|
|
435
407
|
|
|
436
408
|
objects.mixer.clipAction( animations[ i ] ).play();
|
|
@@ -438,35 +410,31 @@
|
|
|
438
410
|
}
|
|
439
411
|
|
|
440
412
|
}
|
|
441
|
-
|
|
442
413
|
_setupMeshPhysics( mesh, params ) {
|
|
443
414
|
|
|
444
|
-
const objects = this.objects.get( mesh );
|
|
415
|
+
const objects = this.objects.get( mesh );
|
|
416
|
+
|
|
417
|
+
// shared physics is experimental
|
|
445
418
|
|
|
446
419
|
if ( params.world === undefined && this.sharedPhysics ) {
|
|
447
420
|
|
|
448
421
|
const masterPhysics = this._getMasterPhysics();
|
|
449
|
-
|
|
450
422
|
if ( masterPhysics !== null ) world = masterPhysics.world; // eslint-disable-line no-undef
|
|
451
423
|
|
|
452
424
|
}
|
|
453
425
|
|
|
454
426
|
objects.physics = this._createMMDPhysics( mesh, params );
|
|
455
|
-
|
|
456
427
|
if ( objects.mixer && params.animationWarmup !== false ) {
|
|
457
428
|
|
|
458
429
|
this._animateMesh( mesh, 0 );
|
|
459
|
-
|
|
460
430
|
objects.physics.reset();
|
|
461
431
|
|
|
462
432
|
}
|
|
463
433
|
|
|
464
434
|
objects.physics.warmup( params.warmup !== undefined ? params.warmup : 60 );
|
|
465
|
-
|
|
466
435
|
this._optimizeIK( mesh, true );
|
|
467
436
|
|
|
468
437
|
}
|
|
469
|
-
|
|
470
438
|
_animateMesh( mesh, delta ) {
|
|
471
439
|
|
|
472
440
|
const objects = this.objects.get( mesh );
|
|
@@ -475,23 +443,20 @@
|
|
|
475
443
|
const grantSolver = objects.grantSolver;
|
|
476
444
|
const physics = objects.physics;
|
|
477
445
|
const looped = objects.looped;
|
|
478
|
-
|
|
479
446
|
if ( mixer && this.enabled.animation ) {
|
|
480
447
|
|
|
481
448
|
// alternate solution to save/restore bones but less performant?
|
|
482
449
|
//mesh.pose();
|
|
483
450
|
//this._updatePropertyMixersBuffer( mesh );
|
|
484
|
-
this._restoreBones( mesh );
|
|
485
451
|
|
|
452
|
+
this._restoreBones( mesh );
|
|
486
453
|
mixer.update( delta );
|
|
454
|
+
this._saveBones( mesh );
|
|
487
455
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
456
|
+
// PMX animation system special path
|
|
491
457
|
if ( this.configuration.pmxAnimation && mesh.geometry.userData.MMD && mesh.geometry.userData.MMD.format === 'pmx' ) {
|
|
492
458
|
|
|
493
459
|
if ( ! objects.sortedBonesData ) objects.sortedBonesData = this._sortBoneDataArray( mesh.geometry.userData.MMD.bones.slice() );
|
|
494
|
-
|
|
495
460
|
this._animatePMXMesh( mesh, objects.sortedBonesData, ikSolver && this.enabled.ik ? ikSolver : null, grantSolver && this.enabled.grant ? grantSolver : null );
|
|
496
461
|
|
|
497
462
|
} else {
|
|
@@ -527,11 +492,11 @@
|
|
|
527
492
|
|
|
528
493
|
}
|
|
529
494
|
|
|
530
|
-
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// Sort bones in order by 1. transformationClass and 2. bone index.
|
|
531
498
|
// In PMX animation system, bone transformations should be processed
|
|
532
499
|
// in this order.
|
|
533
|
-
|
|
534
|
-
|
|
535
500
|
_sortBoneDataArray( boneDataArray ) {
|
|
536
501
|
|
|
537
502
|
return boneDataArray.sort( function ( a, b ) {
|
|
@@ -548,21 +513,19 @@
|
|
|
548
513
|
|
|
549
514
|
} );
|
|
550
515
|
|
|
551
|
-
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
// PMX Animation system is a bit too complex and doesn't great match to
|
|
552
519
|
// Three.js Animation system. This method attempts to simulate it as much as
|
|
553
520
|
// possible but doesn't perfectly simulate.
|
|
554
521
|
// This method is more costly than the regular one so
|
|
555
522
|
// you are recommended to set constructor parameter "pmxAnimation: true"
|
|
556
523
|
// only if your PMX model animation doesn't work well.
|
|
557
524
|
// If you need better method you would be required to write your own.
|
|
558
|
-
|
|
559
|
-
|
|
560
525
|
_animatePMXMesh( mesh, sortedBonesData, ikSolver, grantSolver ) {
|
|
561
526
|
|
|
562
527
|
_quaternionIndex = 0;
|
|
563
|
-
|
|
564
528
|
_grantResultMap.clear();
|
|
565
|
-
|
|
566
529
|
for ( let i = 0, il = sortedBonesData.length; i < il; i ++ ) {
|
|
567
530
|
|
|
568
531
|
updateOne( mesh, sortedBonesData[ i ].index, ikSolver, grantSolver );
|
|
@@ -573,11 +536,9 @@
|
|
|
573
536
|
return this;
|
|
574
537
|
|
|
575
538
|
}
|
|
576
|
-
|
|
577
539
|
_animateCamera( camera, delta ) {
|
|
578
540
|
|
|
579
541
|
const mixer = this.objects.get( camera ).mixer;
|
|
580
|
-
|
|
581
542
|
if ( mixer && this.enabled.cameraAnimation ) {
|
|
582
543
|
|
|
583
544
|
mixer.update( delta );
|
|
@@ -589,21 +550,17 @@
|
|
|
589
550
|
}
|
|
590
551
|
|
|
591
552
|
}
|
|
592
|
-
|
|
593
553
|
_optimizeIK( mesh, physicsEnabled ) {
|
|
594
554
|
|
|
595
555
|
const iks = mesh.geometry.userData.MMD.iks;
|
|
596
556
|
const bones = mesh.geometry.userData.MMD.bones;
|
|
597
|
-
|
|
598
557
|
for ( let i = 0, il = iks.length; i < il; i ++ ) {
|
|
599
558
|
|
|
600
559
|
const ik = iks[ i ];
|
|
601
560
|
const links = ik.links;
|
|
602
|
-
|
|
603
561
|
for ( let j = 0, jl = links.length; j < jl; j ++ ) {
|
|
604
562
|
|
|
605
563
|
const link = links[ j ];
|
|
606
|
-
|
|
607
564
|
if ( physicsEnabled === true ) {
|
|
608
565
|
|
|
609
566
|
// disable IK of the bone the corresponding rigidBody type of which is 1 or 2
|
|
@@ -621,7 +578,6 @@
|
|
|
621
578
|
}
|
|
622
579
|
|
|
623
580
|
}
|
|
624
|
-
|
|
625
581
|
_createCCDIKSolver( mesh ) {
|
|
626
582
|
|
|
627
583
|
if ( THREE.CCDIKSolver === undefined ) {
|
|
@@ -633,7 +589,6 @@
|
|
|
633
589
|
return new THREE.CCDIKSolver( mesh, mesh.geometry.userData.MMD.iks );
|
|
634
590
|
|
|
635
591
|
}
|
|
636
|
-
|
|
637
592
|
_createMMDPhysics( mesh, params ) {
|
|
638
593
|
|
|
639
594
|
if ( THREE.MMDPhysics === undefined ) {
|
|
@@ -645,29 +600,28 @@
|
|
|
645
600
|
return new THREE.MMDPhysics( mesh, mesh.geometry.userData.MMD.rigidBodies, mesh.geometry.userData.MMD.constraints, params );
|
|
646
601
|
|
|
647
602
|
}
|
|
603
|
+
|
|
648
604
|
/*
|
|
649
605
|
* Detects the longest duration and then sets it to them to sync.
|
|
650
606
|
* TODO: Not to access private properties ( ._actions and ._clip )
|
|
651
607
|
*/
|
|
652
|
-
|
|
653
|
-
|
|
654
608
|
_syncDuration() {
|
|
655
609
|
|
|
656
610
|
let max = 0.0;
|
|
657
611
|
const objects = this.objects;
|
|
658
612
|
const meshes = this.meshes;
|
|
659
613
|
const camera = this.camera;
|
|
660
|
-
const audioManager = this.audioManager;
|
|
614
|
+
const audioManager = this.audioManager;
|
|
615
|
+
|
|
616
|
+
// get the longest duration
|
|
661
617
|
|
|
662
618
|
for ( let i = 0, il = meshes.length; i < il; i ++ ) {
|
|
663
619
|
|
|
664
620
|
const mixer = this.objects.get( meshes[ i ] ).mixer;
|
|
665
621
|
if ( mixer === undefined ) continue;
|
|
666
|
-
|
|
667
622
|
for ( let j = 0; j < mixer._actions.length; j ++ ) {
|
|
668
623
|
|
|
669
624
|
const clip = mixer._actions[ j ]._clip;
|
|
670
|
-
|
|
671
625
|
if ( ! objects.has( clip ) ) {
|
|
672
626
|
|
|
673
627
|
objects.set( clip, {
|
|
@@ -685,13 +639,11 @@
|
|
|
685
639
|
if ( camera !== null ) {
|
|
686
640
|
|
|
687
641
|
const mixer = this.objects.get( camera ).mixer;
|
|
688
|
-
|
|
689
642
|
if ( mixer !== undefined ) {
|
|
690
643
|
|
|
691
644
|
for ( let i = 0, il = mixer._actions.length; i < il; i ++ ) {
|
|
692
645
|
|
|
693
646
|
const clip = mixer._actions[ i ]._clip;
|
|
694
|
-
|
|
695
647
|
if ( ! objects.has( clip ) ) {
|
|
696
648
|
|
|
697
649
|
objects.set( clip, {
|
|
@@ -714,13 +666,14 @@
|
|
|
714
666
|
|
|
715
667
|
}
|
|
716
668
|
|
|
717
|
-
max += this.configuration.afterglow;
|
|
669
|
+
max += this.configuration.afterglow;
|
|
670
|
+
|
|
671
|
+
// update the duration
|
|
718
672
|
|
|
719
673
|
for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
|
|
720
674
|
|
|
721
675
|
const mixer = this.objects.get( this.meshes[ i ] ).mixer;
|
|
722
676
|
if ( mixer === undefined ) continue;
|
|
723
|
-
|
|
724
677
|
for ( let j = 0, jl = mixer._actions.length; j < jl; j ++ ) {
|
|
725
678
|
|
|
726
679
|
mixer._actions[ j ]._clip.duration = max;
|
|
@@ -732,7 +685,6 @@
|
|
|
732
685
|
if ( camera !== null ) {
|
|
733
686
|
|
|
734
687
|
const mixer = this.objects.get( camera ).mixer;
|
|
735
|
-
|
|
736
688
|
if ( mixer !== undefined ) {
|
|
737
689
|
|
|
738
690
|
for ( let i = 0, il = mixer._actions.length; i < il; i ++ ) {
|
|
@@ -751,15 +703,15 @@
|
|
|
751
703
|
|
|
752
704
|
}
|
|
753
705
|
|
|
754
|
-
}
|
|
706
|
+
}
|
|
755
707
|
|
|
708
|
+
// workaround
|
|
756
709
|
|
|
757
710
|
_updatePropertyMixersBuffer( mesh ) {
|
|
758
711
|
|
|
759
712
|
const mixer = this.objects.get( mesh ).mixer;
|
|
760
713
|
const propertyMixers = mixer._bindings;
|
|
761
714
|
const accuIndex = mixer._accuIndex;
|
|
762
|
-
|
|
763
715
|
for ( let i = 0, il = propertyMixers.length; i < il; i ++ ) {
|
|
764
716
|
|
|
765
717
|
const propertyMixer = propertyMixers[ i ];
|
|
@@ -771,6 +723,7 @@
|
|
|
771
723
|
}
|
|
772
724
|
|
|
773
725
|
}
|
|
726
|
+
|
|
774
727
|
/*
|
|
775
728
|
* Avoiding these two issues by restore/save bones before/after mixer animation.
|
|
776
729
|
*
|
|
@@ -780,14 +733,11 @@
|
|
|
780
733
|
*
|
|
781
734
|
* 2. Applying Grant two or more times without reset the posing breaks model.
|
|
782
735
|
*/
|
|
783
|
-
|
|
784
|
-
|
|
785
736
|
_saveBones( mesh ) {
|
|
786
737
|
|
|
787
738
|
const objects = this.objects.get( mesh );
|
|
788
739
|
const bones = mesh.skeleton.bones;
|
|
789
740
|
let backupBones = objects.backupBones;
|
|
790
|
-
|
|
791
741
|
if ( backupBones === undefined ) {
|
|
792
742
|
|
|
793
743
|
backupBones = new Float32Array( bones.length * 7 );
|
|
@@ -804,14 +754,12 @@
|
|
|
804
754
|
}
|
|
805
755
|
|
|
806
756
|
}
|
|
807
|
-
|
|
808
757
|
_restoreBones( mesh ) {
|
|
809
758
|
|
|
810
759
|
const objects = this.objects.get( mesh );
|
|
811
760
|
const backupBones = objects.backupBones;
|
|
812
761
|
if ( backupBones === undefined ) return;
|
|
813
762
|
const bones = mesh.skeleton.bones;
|
|
814
|
-
|
|
815
763
|
for ( let i = 0, il = bones.length; i < il; i ++ ) {
|
|
816
764
|
|
|
817
765
|
const bone = bones[ i ];
|
|
@@ -820,17 +768,16 @@
|
|
|
820
768
|
|
|
821
769
|
}
|
|
822
770
|
|
|
823
|
-
}
|
|
771
|
+
}
|
|
824
772
|
|
|
773
|
+
// experimental
|
|
825
774
|
|
|
826
775
|
_getMasterPhysics() {
|
|
827
776
|
|
|
828
777
|
if ( this.masterPhysics !== null ) return this.masterPhysics;
|
|
829
|
-
|
|
830
778
|
for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
|
|
831
779
|
|
|
832
780
|
const physics = this.meshes[ i ].physics;
|
|
833
|
-
|
|
834
781
|
if ( physics !== undefined && physics !== null ) {
|
|
835
782
|
|
|
836
783
|
this.masterPhysics = physics;
|
|
@@ -843,19 +790,14 @@
|
|
|
843
790
|
return null;
|
|
844
791
|
|
|
845
792
|
}
|
|
846
|
-
|
|
847
793
|
_updateSharedPhysics( delta ) {
|
|
848
794
|
|
|
849
795
|
if ( this.meshes.length === 0 || ! this.enabled.physics || ! this.sharedPhysics ) return;
|
|
850
|
-
|
|
851
796
|
const physics = this._getMasterPhysics();
|
|
852
|
-
|
|
853
797
|
if ( physics === null ) return;
|
|
854
|
-
|
|
855
798
|
for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
|
|
856
799
|
|
|
857
800
|
const p = this.meshes[ i ].physics;
|
|
858
|
-
|
|
859
801
|
if ( p !== null && p !== undefined ) {
|
|
860
802
|
|
|
861
803
|
p.updateRigidBodies();
|
|
@@ -865,11 +807,9 @@
|
|
|
865
807
|
}
|
|
866
808
|
|
|
867
809
|
physics.stepSimulation( delta );
|
|
868
|
-
|
|
869
810
|
for ( let i = 0, il = this.meshes.length; i < il; i ++ ) {
|
|
870
811
|
|
|
871
812
|
const p = this.meshes[ i ].physics;
|
|
872
|
-
|
|
873
813
|
if ( p !== null && p !== undefined ) {
|
|
874
814
|
|
|
875
815
|
p.updateBones();
|
|
@@ -880,12 +820,11 @@
|
|
|
880
820
|
|
|
881
821
|
}
|
|
882
822
|
|
|
883
|
-
}
|
|
884
|
-
|
|
823
|
+
}
|
|
885
824
|
|
|
825
|
+
// Keep working quaternions for less GC
|
|
886
826
|
const _quaternions = [];
|
|
887
827
|
let _quaternionIndex = 0;
|
|
888
|
-
|
|
889
828
|
function getQuaternion() {
|
|
890
829
|
|
|
891
830
|
if ( _quaternionIndex >= _quaternions.length ) {
|
|
@@ -896,33 +835,33 @@
|
|
|
896
835
|
|
|
897
836
|
return _quaternions[ _quaternionIndex ++ ];
|
|
898
837
|
|
|
899
|
-
}
|
|
900
|
-
// used by grant children
|
|
901
|
-
|
|
838
|
+
}
|
|
902
839
|
|
|
840
|
+
// Save rotation whose grant and IK are already applied
|
|
841
|
+
// used by grant children
|
|
903
842
|
const _grantResultMap = new Map();
|
|
904
|
-
|
|
905
843
|
function updateOne( mesh, boneIndex, ikSolver, grantSolver ) {
|
|
906
844
|
|
|
907
845
|
const bones = mesh.skeleton.bones;
|
|
908
846
|
const bonesData = mesh.geometry.userData.MMD.bones;
|
|
909
847
|
const boneData = bonesData[ boneIndex ];
|
|
910
|
-
const bone = bones[ boneIndex ];
|
|
848
|
+
const bone = bones[ boneIndex ];
|
|
911
849
|
|
|
850
|
+
// Return if already updated by being referred as a grant parent.
|
|
912
851
|
if ( _grantResultMap.has( boneIndex ) ) return;
|
|
913
|
-
const quaternion = getQuaternion();
|
|
852
|
+
const quaternion = getQuaternion();
|
|
853
|
+
|
|
854
|
+
// Initialize grant result here to prevent infinite loop.
|
|
914
855
|
// If it's referred before updating with actual result later
|
|
915
856
|
// result without applyting IK or grant is gotten
|
|
916
857
|
// but better than composing of infinite loop.
|
|
858
|
+
_grantResultMap.set( boneIndex, quaternion.copy( bone.quaternion ) );
|
|
917
859
|
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
860
|
+
// @TODO: Support global grant and grant position
|
|
921
861
|
if ( grantSolver && boneData.grant && ! boneData.grant.isLocal && boneData.grant.affectRotation ) {
|
|
922
862
|
|
|
923
863
|
const parentIndex = boneData.grant.parentIndex;
|
|
924
864
|
const ratio = boneData.grant.ratio;
|
|
925
|
-
|
|
926
865
|
if ( ! _grantResultMap.has( parentIndex ) ) {
|
|
927
866
|
|
|
928
867
|
updateOne( mesh, parentIndex, ikSolver, grantSolver );
|
|
@@ -938,16 +877,15 @@
|
|
|
938
877
|
// @TODO: Updating world matrices every time solving an IK bone is
|
|
939
878
|
// costly. Optimize if possible.
|
|
940
879
|
mesh.updateMatrixWorld( true );
|
|
941
|
-
ikSolver.updateOne( boneData.ik );
|
|
880
|
+
ikSolver.updateOne( boneData.ik );
|
|
942
881
|
|
|
882
|
+
// No confident, but it seems the grant results with ik links should be updated?
|
|
943
883
|
const links = boneData.ik.links;
|
|
944
|
-
|
|
945
884
|
for ( let i = 0, il = links.length; i < il; i ++ ) {
|
|
946
885
|
|
|
947
886
|
const link = links[ i ];
|
|
948
887
|
if ( link.enabled === false ) continue;
|
|
949
888
|
const linkIndex = link.index;
|
|
950
|
-
|
|
951
889
|
if ( _grantResultMap.has( linkIndex ) ) {
|
|
952
890
|
|
|
953
891
|
_grantResultMap.set( linkIndex, _grantResultMap.get( linkIndex ).copy( bones[ linkIndex ].quaternion ) );
|
|
@@ -956,13 +894,14 @@
|
|
|
956
894
|
|
|
957
895
|
}
|
|
958
896
|
|
|
959
|
-
}
|
|
960
|
-
|
|
897
|
+
}
|
|
961
898
|
|
|
899
|
+
// Update with the actual result here
|
|
962
900
|
quaternion.copy( bone.quaternion );
|
|
963
901
|
|
|
964
|
-
}
|
|
902
|
+
}
|
|
965
903
|
|
|
904
|
+
//
|
|
966
905
|
|
|
967
906
|
class AudioManager {
|
|
968
907
|
|
|
@@ -981,12 +920,11 @@
|
|
|
981
920
|
this.duration = this.audioDuration + this.delayTime;
|
|
982
921
|
|
|
983
922
|
}
|
|
923
|
+
|
|
984
924
|
/**
|
|
985
925
|
* @param {Number} delta
|
|
986
926
|
* @return {AudioManager}
|
|
987
927
|
*/
|
|
988
|
-
|
|
989
|
-
|
|
990
928
|
control( delta ) {
|
|
991
929
|
|
|
992
930
|
this.elapsed += delta;
|
|
@@ -995,26 +933,26 @@
|
|
|
995
933
|
if ( this._shouldStartAudio() ) this.audio.play();
|
|
996
934
|
return this;
|
|
997
935
|
|
|
998
|
-
}
|
|
936
|
+
}
|
|
999
937
|
|
|
938
|
+
// private methods
|
|
1000
939
|
|
|
1001
940
|
_shouldStartAudio() {
|
|
1002
941
|
|
|
1003
942
|
if ( this.audio.isPlaying ) return false;
|
|
1004
|
-
|
|
1005
943
|
while ( this.currentTime >= this.duration ) {
|
|
1006
944
|
|
|
1007
945
|
this.currentTime -= this.duration;
|
|
1008
946
|
|
|
1009
947
|
}
|
|
1010
948
|
|
|
1011
|
-
if ( this.currentTime < this.delayTime ) return false;
|
|
949
|
+
if ( this.currentTime < this.delayTime ) return false;
|
|
1012
950
|
|
|
951
|
+
// 'duration' can be bigger than 'audioDuration + delayTime' because of sync configuration
|
|
1013
952
|
if ( this.currentTime - this.delayTime > this.audioDuration ) return false;
|
|
1014
953
|
return true;
|
|
1015
954
|
|
|
1016
955
|
}
|
|
1017
|
-
|
|
1018
956
|
_shouldStopAudio() {
|
|
1019
957
|
|
|
1020
958
|
return this.audio.isPlaying && this.currentTime >= this.duration;
|
|
@@ -1022,8 +960,8 @@
|
|
|
1022
960
|
}
|
|
1023
961
|
|
|
1024
962
|
}
|
|
1025
|
-
|
|
1026
963
|
const _q = new THREE.Quaternion();
|
|
964
|
+
|
|
1027
965
|
/**
|
|
1028
966
|
* Solver for Grant (Fuyo in Japanese. I just google translated because
|
|
1029
967
|
* Fuyo may be MMD specific term and may not be common word in 3D CG terms.)
|
|
@@ -1032,8 +970,6 @@
|
|
|
1032
970
|
* @param {THREE.SkinnedMesh} mesh
|
|
1033
971
|
* @param {Array<Object>} grants
|
|
1034
972
|
*/
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
973
|
class GrantSolver {
|
|
1038
974
|
|
|
1039
975
|
constructor( mesh, grants = [] ) {
|
|
@@ -1042,16 +978,14 @@
|
|
|
1042
978
|
this.grants = grants;
|
|
1043
979
|
|
|
1044
980
|
}
|
|
981
|
+
|
|
1045
982
|
/**
|
|
1046
983
|
* Solve all the grant bones
|
|
1047
984
|
* @return {GrantSolver}
|
|
1048
985
|
*/
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
986
|
update() {
|
|
1052
987
|
|
|
1053
988
|
const grants = this.grants;
|
|
1054
|
-
|
|
1055
989
|
for ( let i = 0, il = grants.length; i < il; i ++ ) {
|
|
1056
990
|
|
|
1057
991
|
this.updateOne( grants[ i ] );
|
|
@@ -1061,25 +995,23 @@
|
|
|
1061
995
|
return this;
|
|
1062
996
|
|
|
1063
997
|
}
|
|
998
|
+
|
|
1064
999
|
/**
|
|
1065
1000
|
* Solve a grant bone
|
|
1066
1001
|
* @param {Object} grant - grant parameter
|
|
1067
1002
|
* @return {GrantSolver}
|
|
1068
1003
|
*/
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
1004
|
updateOne( grant ) {
|
|
1072
1005
|
|
|
1073
1006
|
const bones = this.mesh.skeleton.bones;
|
|
1074
1007
|
const bone = bones[ grant.index ];
|
|
1075
1008
|
const parentBone = bones[ grant.parentIndex ];
|
|
1076
|
-
|
|
1077
1009
|
if ( grant.isLocal ) {
|
|
1078
1010
|
|
|
1079
1011
|
// TODO: implement
|
|
1080
|
-
if ( grant.affectPosition ) {}
|
|
1081
|
-
|
|
1012
|
+
if ( grant.affectPosition ) {}
|
|
1082
1013
|
|
|
1014
|
+
// TODO: implement
|
|
1083
1015
|
if ( grant.affectRotation ) {}
|
|
1084
1016
|
|
|
1085
1017
|
} else {
|
|
@@ -1098,13 +1030,10 @@
|
|
|
1098
1030
|
return this;
|
|
1099
1031
|
|
|
1100
1032
|
}
|
|
1101
|
-
|
|
1102
1033
|
addGrantRotation( bone, q, ratio ) {
|
|
1103
1034
|
|
|
1104
1035
|
_q.set( 0, 0, 0, 1 );
|
|
1105
|
-
|
|
1106
1036
|
_q.slerp( q, ratio );
|
|
1107
|
-
|
|
1108
1037
|
bone.quaternion.multiply( _q );
|
|
1109
1038
|
return this;
|
|
1110
1039
|
|