[AK][GUI] Add support for portrait sprites

This commit is contained in:
VaDiM
2023-08-22 06:06:40 +03:00
parent 3d7d51b54f
commit 572e3bf0d6
11 changed files with 293 additions and 69 deletions

View File

@ -360,7 +360,7 @@ namespace AssetStudioGUI
break;
}
}
else if (lastSelectedItem?.Type == ClassIDType.Sprite && !((Sprite)lastSelectedItem.Asset).m_RD.alphaTexture.IsNull)
else if ((lastSelectedItem?.Type == ClassIDType.Sprite && !((Sprite)lastSelectedItem.Asset).m_RD.alphaTexture.IsNull) || lastSelectedItem?.Type == ClassIDType.AkPortraitSprite)
{
switch (e.KeyCode)
{
@ -430,6 +430,7 @@ namespace AssetStudioGUI
switch (lastSelectedItem.Type)
{
case ClassIDType.Texture2D:
case ClassIDType.AkPortraitSprite:
case ClassIDType.Sprite:
{
if (enablePreview.Checked && imageTexture != null)
@ -798,42 +799,45 @@ namespace AssetStudioGUI
return;
try
{
switch (assetItem.Asset)
switch (assetItem.Type)
{
case Texture2D m_Texture2D:
PreviewTexture2D(assetItem, m_Texture2D);
case ClassIDType.Texture2D:
PreviewTexture2D(assetItem, assetItem.Asset as Texture2D);
break;
case AudioClip m_AudioClip:
PreviewAudioClip(assetItem, m_AudioClip);
case ClassIDType.AudioClip:
PreviewAudioClip(assetItem, assetItem.Asset as AudioClip);
break;
case Shader m_Shader:
PreviewShader(m_Shader);
case ClassIDType.Shader:
PreviewShader(assetItem.Asset as Shader);
break;
case TextAsset m_TextAsset:
PreviewTextAsset(m_TextAsset);
case ClassIDType.TextAsset:
PreviewTextAsset(assetItem.Asset as TextAsset);
break;
case MonoBehaviour m_MonoBehaviour:
PreviewMonoBehaviour(m_MonoBehaviour);
case ClassIDType.MonoBehaviour:
PreviewMonoBehaviour(assetItem.Asset as MonoBehaviour);
break;
case Font m_Font:
PreviewFont(m_Font);
case ClassIDType.Font:
PreviewFont(assetItem.Asset as Font);
break;
case Mesh m_Mesh:
PreviewMesh(m_Mesh);
case ClassIDType.Mesh:
PreviewMesh(assetItem.Asset as Mesh);
break;
case VideoClip m_VideoClip:
PreviewVideoClip(assetItem, m_VideoClip);
case ClassIDType.VideoClip:
PreviewVideoClip(assetItem, assetItem.Asset as VideoClip);
break;
case MovieTexture _:
case ClassIDType.MovieTexture:
StatusStripUpdate("Only supported export.");
break;
case Sprite m_Sprite:
PreviewSprite(assetItem, m_Sprite);
case ClassIDType.Sprite:
PreviewSprite(assetItem, assetItem.Asset as Sprite);
break;
case Animator _:
case ClassIDType.AkPortraitSprite:
PreviewAkPortraitSprite(assetItem);
break;
case ClassIDType.Animator:
StatusStripUpdate("Can be exported to FBX file.");
break;
case AnimationClip _:
case ClassIDType.AnimationClip:
StatusStripUpdate("Can be exported with Animator or Objects");
break;
default:
@ -1344,6 +1348,25 @@ namespace AssetStudioGUI
}
}
private void PreviewAkPortraitSprite(AssetItem assetItem)
{
var image = assetItem.AkPortraitSprite.AkGetImage(spriteMaskMode: spriteMaskVisibleMode);
if (image != null)
{
var bitmap = new DirectBitmap(image);
image.Dispose();
assetItem.InfoText = $"Width: {bitmap.Width}\nHeight: {bitmap.Height}\n";
assetItem.InfoText += $"Alpha mask: {spriteMaskVisibleMode}";
PreviewTexture(bitmap);
StatusStripUpdate("'Ctrl'+'A' - Enable/Disable alpha mask usage. 'Ctrl'+'M' - Show alpha mask only.");
}
else
{
StatusStripUpdate("Unsupported sprite for preview.");
}
}
private void PreviewTexture(DirectBitmap bitmap)
{
imageTexture?.Dispose();
@ -1449,19 +1472,20 @@ namespace AssetStudioGUI
var assetItem = (AssetItem)assetListView.Items[i];
if (assetItem.Type == ClassIDType.Sprite)
{
var sprite = (Sprite)assetItem.Asset;
var m_Sprite = (Sprite)assetItem.Asset;
if (akFixFaceSpriteNamesToolStripMenuItem.Checked)
{
if ((sprite.m_Name.Length < 3 && sprite.m_Name.All(char.IsDigit)) //not grouped ("spriteIndex")
|| (sprite.m_Name.Length < 5 && sprite.m_Name.Contains('$') && sprite.m_Name.Split('$')[0].All(char.IsDigit))) //grouped ("spriteIndex$groupIndex")
var groupedPattern = new Regex(@"^\d{1,2}\$\d{1,2}$"); // "spriteIndex$groupIndex"
var notGroupedPattern = new Regex(@"^\d{1,2}$"); // "spriteIndex"
if (groupedPattern.IsMatch(m_Sprite.m_Name) || notGroupedPattern.IsMatch(m_Sprite.m_Name))
{
var fullName = Path.GetFileNameWithoutExtension(assetItem.Container);
assetItem.Text = $"{fullName}#{sprite.m_Name}";
assetItem.Text = $"{fullName}#{m_Sprite.m_Name}";
}
}
else if (assetItem.Text != sprite.m_Name)
else if (assetItem.Text != m_Sprite.m_Name)
{
assetItem.Text = sprite.m_Name;
assetItem.Text = m_Sprite.m_Name;
}
}
}
@ -1968,7 +1992,7 @@ namespace AssetStudioGUI
Properties.Settings.Default.useExternalAlpha = akUseExternalAlphaToolStripMenuItem.Checked;
Properties.Settings.Default.Save();
if (lastSelectedItem?.Asset.type == ClassIDType.Sprite)
if (lastSelectedItem?.Type == ClassIDType.Sprite)
{
StatusStripUpdate("");
PreviewAsset(lastSelectedItem);