diff --git a/AssetStudio/IImported.cs b/AssetStudio/IImported.cs index ff1b51e..8dc51cf 100644 --- a/AssetStudio/IImported.cs +++ b/AssetStudio/IImported.cs @@ -231,9 +231,16 @@ namespace AssetStudio public float SampleRate { get; set; } public List TrackList { get; set; } - public ImportedAnimationKeyframedTrack FindTrack(string path) + public ImportedAnimationKeyframedTrack FindTrack(string path, string attribute = null) { - var track = TrackList.Find(x => x.Path == path); + var track = TrackList.Find(t => { + if (attribute == null) + { + return t.Path == path; + } else { + return t.Path == path && t.BlendShape?.ChannelName == attribute; + } + }); if (track == null) { track = new ImportedAnimationKeyframedTrack { Path = path }; diff --git a/AssetStudioUtility/ModelConverter.cs b/AssetStudioUtility/ModelConverter.cs index 31e7082..9796e80 100644 --- a/AssetStudioUtility/ModelConverter.cs +++ b/AssetStudioUtility/ModelConverter.cs @@ -519,6 +519,8 @@ namespace AssetStudio crc.Update(bytes, 0, (uint)bytes.Length); morphChannelNames[crc.GetDigest()] = blendShapeName; + morphChannelNames[shapeChannel.nameHash] = shapeChannel.name; + channel.Name = shapeChannel.name.Split('.').Last(); channel.KeyframeList = new List(shapeChannel.frameCount); var frameEnd = shapeChannel.frameIndex + shapeChannel.frameCount; @@ -870,14 +872,17 @@ namespace AssetStudio channelName = channelName.Substring(dotPos + 1); } - var path = FixBonePath(animationClip, m_FloatCurve.path); + var path = GetPathByChannelName(channelName); if (string.IsNullOrEmpty(path)) { - path = GetPathByChannelName(channelName); + path = FixBonePath(animationClip, m_FloatCurve.path); + } + var track = iAnim.FindTrack(path, channelName); + if (track.BlendShape == null) + { + track.BlendShape = new ImportedBlendShape(); + track.BlendShape.ChannelName = channelName; } - var track = iAnim.FindTrack(path); - track.BlendShape = new ImportedBlendShape(); - track.BlendShape.ChannelName = channelName; foreach (var m_Curve in m_FloatCurve.curve.m_Curve) { track.BlendShape.Keyframes.Add(new ImportedKeyframe(m_Curve.time, m_Curve.value)); @@ -984,15 +989,18 @@ namespace AssetStudio channelName = channelName.Substring(dotPos + 1); } - var bPath = FixBonePath(GetPathFromHash(binding.path)); - if (string.IsNullOrEmpty(bPath)) + var path = GetPathByChannelName(channelName); + if (string.IsNullOrEmpty(path)) { - bPath = GetPathByChannelName(channelName); + path = FixBonePath(GetPathFromHash(binding.path)); } - var bTrack = iAnim.FindTrack(bPath); - bTrack.BlendShape = new ImportedBlendShape(); - bTrack.BlendShape.ChannelName = channelName; - bTrack.BlendShape.Keyframes.Add(new ImportedKeyframe(time, data[curveIndex++ + offset])); + var track = iAnim.FindTrack(path, channelName); + if (track.BlendShape == null) + { + track.BlendShape = new ImportedBlendShape(); + track.BlendShape.ChannelName = channelName; + } + track.BlendShape.Keyframes.Add(new ImportedKeyframe(time, data[curveIndex++ + offset])); } else if (binding.typeID == ClassIDType.Transform) {