mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-06-03 00:58:13 -04:00
Improve parsing of Live2D Fade motions
This commit is contained in:
parent
60aef1b8ed
commit
823190abb7
@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using AssetStudio;
|
using AssetStudio;
|
||||||
|
|
||||||
@ -73,7 +72,7 @@ namespace CubismLive2DExtractor
|
|||||||
|
|
||||||
if (iAnim.TrackList.Count == 0 || iAnim.Events.Count == 0)
|
if (iAnim.TrackList.Count == 0 || iAnim.Events.Count == 0)
|
||||||
{
|
{
|
||||||
Logger.Warning($"[Motion Converter] {iAnim.Name} has {iAnim.TrackList.Count} tracks and {iAnim.Events.Count} event!.");
|
Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" has {iAnim.TrackList.Count} tracks and {iAnim.Events.Count} event!.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -84,7 +83,7 @@ namespace CubismLive2DExtractor
|
|||||||
GetLive2dPath(binding, out var target, out var boneName);
|
GetLive2dPath(binding, out var target, out var boneName);
|
||||||
if (string.IsNullOrEmpty(boneName))
|
if (string.IsNullOrEmpty(boneName))
|
||||||
{
|
{
|
||||||
Logger.Warning($"[Motion Converter] {iAnim.Name} read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}");
|
Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +98,7 @@ namespace CubismLive2DExtractor
|
|||||||
GetLive2dPath(binding, out var target, out var boneName);
|
GetLive2dPath(binding, out var target, out var boneName);
|
||||||
if (string.IsNullOrEmpty(boneName))
|
if (string.IsNullOrEmpty(boneName))
|
||||||
{
|
{
|
||||||
Logger.Warning($"[Motion Converter] {iAnim.Name} read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}");
|
Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ namespace CubismLive2DExtractor
|
|||||||
totalSegmentCount++;
|
totalSegmentCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CubismMotion3Json(CubismFadeMotion fadeMotion, bool forceBezier)
|
public CubismMotion3Json(CubismFadeMotion fadeMotion, HashSet<string> paramNames, HashSet<string> partNames, bool forceBezier)
|
||||||
{
|
{
|
||||||
Version = 3;
|
Version = 3;
|
||||||
Meta = new SerializableMeta
|
Meta = new SerializableMeta
|
||||||
@ -130,12 +130,37 @@ namespace CubismLive2DExtractor
|
|||||||
if (fadeMotion.ParameterCurves[i].m_Curve.Length == 0)
|
if (fadeMotion.ParameterCurves[i].m_Curve.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
string target;
|
||||||
|
string paramId = fadeMotion.ParameterIds[i];
|
||||||
|
switch (paramId)
|
||||||
|
{
|
||||||
|
case "Opacity":
|
||||||
|
case "EyeBlink":
|
||||||
|
case "LipSync":
|
||||||
|
target = "Model";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (paramNames.Contains(paramId))
|
||||||
|
{
|
||||||
|
target = "Parameter";
|
||||||
|
}
|
||||||
|
else if (partNames.Contains(paramId))
|
||||||
|
{
|
||||||
|
target = "PartOpacity";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
target = paramId.ToLower().Contains("part") ? "PartOpacity" : "Parameter";
|
||||||
|
AssetStudio.Logger.Warning($"[{fadeMotion.m_Name}] Binding error: Unable to find \"{paramId}\" among the model parts/parameters");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
Curves[actualCurveCount] = new SerializableCurve
|
Curves[actualCurveCount] = new SerializableCurve
|
||||||
{
|
{
|
||||||
// Target type.
|
// Target type.
|
||||||
Target = "Parameter",
|
Target = target,
|
||||||
// Identifier for mapping curve to target.
|
// Identifier for mapping curve to target.
|
||||||
Id = fadeMotion.ParameterIds[i],
|
Id = paramId,
|
||||||
// [Optional] Time of the Fade - In for easing in seconds.
|
// [Optional] Time of the Fade - In for easing in seconds.
|
||||||
FadeInTime = fadeMotion.ParameterFadeInTimes[i],
|
FadeInTime = fadeMotion.ParameterFadeInTimes[i],
|
||||||
// [Optional] Time of the Fade - Out for easing in seconds.
|
// [Optional] Time of the Fade - Out for easing in seconds.
|
||||||
|
@ -34,6 +34,8 @@ namespace CubismLive2DExtractor
|
|||||||
var textures = new SortedSet<string>();
|
var textures = new SortedSet<string>();
|
||||||
var eyeBlinkParameters = new HashSet<string>();
|
var eyeBlinkParameters = new HashSet<string>();
|
||||||
var lipSyncParameters = new HashSet<string>();
|
var lipSyncParameters = new HashSet<string>();
|
||||||
|
var parameterNames = new HashSet<string>();
|
||||||
|
var partNames = new HashSet<string>();
|
||||||
MonoBehaviour physics = null;
|
MonoBehaviour physics = null;
|
||||||
|
|
||||||
foreach (var asset in assets)
|
foreach (var asset in assets)
|
||||||
@ -69,6 +71,18 @@ namespace CubismLive2DExtractor
|
|||||||
lipSyncParameters.Add(mouthGameObject.m_Name);
|
lipSyncParameters.Add(mouthGameObject.m_Name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "CubismParameter":
|
||||||
|
if (m_MonoBehaviour.m_GameObject.TryGet(out var paramGameObject))
|
||||||
|
{
|
||||||
|
parameterNames.Add(paramGameObject.m_Name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "CubismPart":
|
||||||
|
if (m_MonoBehaviour.m_GameObject.TryGet(out var partGameObject))
|
||||||
|
{
|
||||||
|
partNames.Add(partGameObject.m_Name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -116,6 +130,7 @@ namespace CubismLive2DExtractor
|
|||||||
|
|
||||||
if (motionMode == Live2DMotionMode.MonoBehaviour && fadeMotionList.Count > 0) //motion from MonoBehaviour
|
if (motionMode == Live2DMotionMode.MonoBehaviour && fadeMotionList.Count > 0) //motion from MonoBehaviour
|
||||||
{
|
{
|
||||||
|
Logger.Debug("Motion export method: MonoBehaviour (Fade motion)");
|
||||||
Directory.CreateDirectory(destMotionPath);
|
Directory.CreateDirectory(destMotionPath);
|
||||||
foreach (var fadeMotionMono in fadeMotionList)
|
foreach (var fadeMotionMono in fadeMotionList)
|
||||||
{
|
{
|
||||||
@ -134,7 +149,7 @@ namespace CubismLive2DExtractor
|
|||||||
if (fadeMotion.ParameterIds.Length == 0)
|
if (fadeMotion.ParameterIds.Length == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var motionJson = new CubismMotion3Json(fadeMotion, forceBezier);
|
var motionJson = new CubismMotion3Json(fadeMotion, parameterNames, partNames, forceBezier);
|
||||||
|
|
||||||
var animName = Path.GetFileNameWithoutExtension(fadeMotion.m_Name);
|
var animName = Path.GetFileNameWithoutExtension(fadeMotion.m_Name);
|
||||||
if (motions.ContainsKey(animName))
|
if (motions.ContainsKey(animName))
|
||||||
@ -151,6 +166,10 @@ namespace CubismLive2DExtractor
|
|||||||
}
|
}
|
||||||
else if (gameObjects.Count > 0) //motion from AnimationClip
|
else if (gameObjects.Count > 0) //motion from AnimationClip
|
||||||
{
|
{
|
||||||
|
var exportMethod = motionMode == Live2DMotionMode.AnimationClip
|
||||||
|
? "AnimationClip"
|
||||||
|
: "AnimationClip (no Fade motions found)";
|
||||||
|
Logger.Debug($"Motion export method: {exportMethod}");
|
||||||
var rootTransform = gameObjects[0].m_Transform;
|
var rootTransform = gameObjects[0].m_Transform;
|
||||||
while (rootTransform.m_Father.TryGet(out var m_Father))
|
while (rootTransform.m_Father.TryGet(out var m_Father))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user