diff --git a/AssetStudio.PInvoke/AssetStudio.PInvoke.csproj b/AssetStudio.PInvoke/AssetStudio.PInvoke.csproj
index 8fc7047..fc533b6 100644
--- a/AssetStudio.PInvoke/AssetStudio.PInvoke.csproj
+++ b/AssetStudio.PInvoke/AssetStudio.PInvoke.csproj
@@ -3,7 +3,7 @@
net472;net6.0;net6.0-windows;net7.0;net7.0-windows
true
- 0.17.1.0
+ 0.17.2.0
Copyright © Perfare 2020-2022; Copyright © hozuki 2020
embedded
diff --git a/AssetStudio/AssetStudio.csproj b/AssetStudio/AssetStudio.csproj
index 7295276..90b4762 100644
--- a/AssetStudio/AssetStudio.csproj
+++ b/AssetStudio/AssetStudio.csproj
@@ -2,13 +2,13 @@
net472;net6.0;net6.0-windows;net7.0;net7.0-windows
- 0.17.1.0
- Copyright © Perfare 2018-2022
+ 0.17.2.0
+ Copyright © Perfare 2018-2022; Copyright © aelurum 2023
embedded
-
+
diff --git a/AssetStudioCLI/AssetStudioCLI.csproj b/AssetStudioCLI/AssetStudioCLI.csproj
index cd4c737..326ad44 100644
--- a/AssetStudioCLI/AssetStudioCLI.csproj
+++ b/AssetStudioCLI/AssetStudioCLI.csproj
@@ -5,7 +5,7 @@
net472;net6.0;net7.0
AssetStudioMod by aelurum
AssetStudioModCLI
- 0.17.1.0
+ 0.17.2.0
Copyright © Perfare; Copyright © aelurum 2023
AnyCPU
embedded
diff --git a/AssetStudioCLI/CLILogger.cs b/AssetStudioCLI/CLILogger.cs
index e74f29d..9aeac57 100644
--- a/AssetStudioCLI/CLILogger.cs
+++ b/AssetStudioCLI/CLILogger.cs
@@ -25,11 +25,12 @@ namespace AssetStudioCLI
{
logOutput = CLIOptions.o_logOutput.Value;
logMinLevel = CLIOptions.o_logLevel.Value;
- LogName = $"AssetStudioCLI_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.log";
+ var appAssembly = typeof(Program).Assembly.GetName();
+ LogName = $"{appAssembly.Name}_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.log";
LogPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, LogName);
+ var arch = Environment.Is64BitProcess ? "x64" : "x32";
- var ver = typeof(Program).Assembly.GetName().Version;
- LogToFile(LoggerEvent.Verbose, $"---AssetStudioCLI v{ver} | Logger launched---\n" +
+ LogToFile(LoggerEvent.Verbose, $"---{appAssembly.Name} v{appAssembly.Version} [{arch}] | Logger launched---\n" +
$"CMD Args: {string.Join(" ", CLIOptions.cliArgs)}");
}
diff --git a/AssetStudioCLI/Exporter.cs b/AssetStudioCLI/Exporter.cs
index 4c6b0cb..ba09615 100644
--- a/AssetStudioCLI/Exporter.cs
+++ b/AssetStudioCLI/Exporter.cs
@@ -21,6 +21,30 @@ namespace AssetStudioCLI
var type = CLIOptions.o_imageFormat.Value;
if (!TryExportFile(exportPath, item, "." + type.ToString().ToLower(), out var exportFullPath))
return false;
+
+ if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
+ {
+ var sb = new StringBuilder();
+ sb.AppendLine($"Converting \"{m_Texture2D.m_Name}\" to {type}..");
+ sb.AppendLine($"Width: {m_Texture2D.m_Width}");
+ sb.AppendLine($"Height: {m_Texture2D.m_Height}");
+ sb.AppendLine($"Format: {m_Texture2D.m_TextureFormat}");
+ switch (m_Texture2D.m_TextureSettings.m_FilterMode)
+ {
+ case 0: sb.AppendLine("Filter Mode: Point "); break;
+ case 1: sb.AppendLine("Filter Mode: Bilinear "); break;
+ case 2: sb.AppendLine("Filter Mode: Trilinear "); break;
+ }
+ sb.AppendLine($"Anisotropic level: {m_Texture2D.m_TextureSettings.m_Aniso}");
+ sb.AppendLine($"Mip map bias: {m_Texture2D.m_TextureSettings.m_MipBias}");
+ switch (m_Texture2D.m_TextureSettings.m_WrapMode)
+ {
+ case 0: sb.AppendLine($"Wrap mode: Repeat"); break;
+ case 1: sb.AppendLine($"Wrap mode: Clamp"); break;
+ }
+ Logger.Debug(sb.ToString());
+ }
+
var image = m_Texture2D.ConvertToImage(flip: true);
if (image == null)
{
@@ -33,7 +57,7 @@ namespace AssetStudioCLI
{
image.WriteToStream(file, type);
}
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
}
@@ -42,7 +66,7 @@ namespace AssetStudioCLI
if (!TryExportFile(exportPath, item, ".tex", out var exportFullPath))
return false;
File.WriteAllBytes(exportFullPath, m_Texture2D.image_data.GetData());
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
}
@@ -63,13 +87,16 @@ namespace AssetStudioCLI
if (!TryExportFile(exportPath, item, ".wav", out exportFullPath))
return false;
- var sb = new StringBuilder();
- sb.AppendLine($"Converting \"{m_AudioClip.m_Name}\" to wav..");
- sb.AppendLine(m_AudioClip.version[0] < 5 ? $"AudioClip type: {m_AudioClip.m_Type}" : $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}");
- sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
- sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
- sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}");
- Logger.Debug(sb.ToString());
+ if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
+ {
+ var sb = new StringBuilder();
+ sb.AppendLine($"Converting \"{m_AudioClip.m_Name}\" to wav..");
+ sb.AppendLine(m_AudioClip.version[0] < 5 ? $"AudioClip type: {m_AudioClip.m_Type}" : $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}");
+ sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
+ sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
+ sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}");
+ Logger.Debug(sb.ToString());
+ }
var buffer = converter.ConvertToWav(m_AudioData);
if (buffer == null)
@@ -86,7 +113,7 @@ namespace AssetStudioCLI
File.WriteAllBytes(exportFullPath, m_AudioData);
}
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
@@ -98,16 +125,19 @@ namespace AssetStudioCLI
if (!TryExportFile(exportPath, item, Path.GetExtension(m_VideoClip.m_OriginalPath), out var exportFullPath))
return false;
- var sb = new StringBuilder();
- sb.AppendLine($"VideoClip format: {m_VideoClip.m_Format}");
- sb.AppendLine($"VideoClip width: {m_VideoClip.Width}");
- sb.AppendLine($"VideoClip height: {m_VideoClip.Height}");
- sb.AppendLine($"VideoClip frame rate: {m_VideoClip.m_FrameRate}");
- sb.AppendLine($"VideoClip split alpha: {m_VideoClip.m_HasSplitAlpha}");
- Logger.Debug(sb.ToString());
+ if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
+ {
+ var sb = new StringBuilder();
+ sb.AppendLine($"VideoClip format: {m_VideoClip.m_Format}");
+ sb.AppendLine($"VideoClip width: {m_VideoClip.Width}");
+ sb.AppendLine($"VideoClip height: {m_VideoClip.Height}");
+ sb.AppendLine($"VideoClip frame rate: {m_VideoClip.m_FrameRate:.0##}");
+ sb.AppendLine($"VideoClip split alpha: {m_VideoClip.m_HasSplitAlpha}");
+ Logger.Debug(sb.ToString());
+ }
m_VideoClip.m_VideoData.WriteData(exportFullPath);
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
return false;
@@ -120,7 +150,7 @@ namespace AssetStudioCLI
return false;
File.WriteAllBytes(exportFullPath, m_MovieTexture.m_MovieData);
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
@@ -132,7 +162,7 @@ namespace AssetStudioCLI
var str = m_Shader.Convert();
File.WriteAllText(exportFullPath, str);
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
@@ -160,7 +190,7 @@ namespace AssetStudioCLI
return false;
File.WriteAllBytes(exportFullPath, m_TextAsset.m_Script);
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
@@ -180,7 +210,7 @@ namespace AssetStudioCLI
var str = JsonConvert.SerializeObject(type, Formatting.Indented);
File.WriteAllText(exportFullPath, str);
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
return false;
@@ -200,7 +230,7 @@ namespace AssetStudioCLI
return false;
File.WriteAllBytes(exportFullPath, m_Font.m_FontData);
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
return false;
@@ -290,7 +320,7 @@ namespace AssetStudioCLI
{
image.WriteToStream(file, type);
}
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
}
@@ -308,7 +338,7 @@ namespace AssetStudioCLI
return false;
File.WriteAllBytes(exportFullPath, item.Asset.GetRawData());
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
@@ -330,7 +360,7 @@ namespace AssetStudioCLI
if (str != null)
{
File.WriteAllText(exportFullPath, str);
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" saved to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" saved to \"{exportFullPath}\"");
return true;
}
return false;
@@ -448,7 +478,7 @@ namespace AssetStudioCLI
sb.Replace("NaN", "0");
File.WriteAllText(exportFullPath, sb.ToString());
- Logger.Debug($"{item.TypeString}: \"{item.Text}\" exported to \"{exportFullPath}\"");
+ Logger.Debug($"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\"");
return true;
}
diff --git a/AssetStudioCLI/Options/CLIOptions.cs b/AssetStudioCLI/Options/CLIOptions.cs
index aad1ebd..28d127b 100644
--- a/AssetStudioCLI/Options/CLIOptions.cs
+++ b/AssetStudioCLI/Options/CLIOptions.cs
@@ -909,7 +909,8 @@ namespace AssetStudioCLI.Options
}
else
{
- Console.WriteLine($"# {appAssembly.Name}\n# Based on AssetStudioMod v{appAssembly.Version}\n");
+ var arch = Environment.Is64BitProcess ? "x64" : "x32";
+ Console.WriteLine($"# {appAssembly.Name} [{arch}]\n# Based on AssetStudioMod v{appAssembly.Version}\n");
Console.WriteLine($"{usage}\n\n{helpMessage}");
}
}
diff --git a/AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj b/AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj
index aea9128..816445e 100644
--- a/AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj
+++ b/AssetStudioFBXWrapper/AssetStudioFBXWrapper.csproj
@@ -3,7 +3,7 @@
net472;net6.0;net6.0-windows;net7.0;net7.0-windows
true
- 0.17.1.0
+ 0.17.2.0
Copyright © Perfare 2018-2022; Copyright © hozuki 2020
embedded
diff --git a/AssetStudioGUI/AboutForm.cs b/AssetStudioGUI/AboutForm.cs
index baee692..307a60e 100644
--- a/AssetStudioGUI/AboutForm.cs
+++ b/AssetStudioGUI/AboutForm.cs
@@ -1,14 +1,6 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
using System.Diagnostics;
-using System.Drawing;
using System.IO;
-using System.Linq;
-using System.Reflection.Emit;
-using System.Text;
-using System.Threading.Tasks;
using System.Windows.Forms;
namespace AssetStudioGUI
diff --git a/AssetStudioGUI/AssetStudioGUI.csproj b/AssetStudioGUI/AssetStudioGUI.csproj
index 7fa43df..9ea2e5d 100644
--- a/AssetStudioGUI/AssetStudioGUI.csproj
+++ b/AssetStudioGUI/AssetStudioGUI.csproj
@@ -7,7 +7,7 @@
Resources\as.ico
AssetStudioMod by aelurum
AssetStudioModGUI
- 0.17.1.0
+ 0.17.2.0
Copyright © Perfare 2018-2022; Copyright © aelurum 2021-2023
embedded
@@ -53,8 +53,15 @@
+
+
+
+
+
+
-
+
+
Libraries\OpenTK.WinForms.dll
@@ -65,12 +72,6 @@
-
-
-
-
-
-
diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs
index d9753ae..5f97f0f 100644
--- a/AssetStudioGUI/AssetStudioGUIForm.cs
+++ b/AssetStudioGUI/AssetStudioGUIForm.cs
@@ -1,7 +1,6 @@
using Arknights;
using AssetStudio;
using Newtonsoft.Json;
-using OpenTK;
using OpenTK.Graphics.OpenGL;
using System;
using System.Collections.Generic;
@@ -24,6 +23,7 @@ using SharpImage = SixLabors.ImageSharp;
using SharpImageFormat = SixLabors.ImageSharp.PixelFormats;
using Microsoft.WindowsAPICodePack.Taskbar;
#if NET472
+using OpenTK;
using Vector3 = OpenTK.Vector3;
using Vector4 = OpenTK.Vector4;
#else
@@ -1046,7 +1046,7 @@ namespace AssetStudioGUI
var sb = new StringBuilder();
sb.AppendLine($"Width: {m_VideoClip.Width}");
sb.AppendLine($"Height: {m_VideoClip.Height}");
- sb.AppendLine($"Frame rate: {m_VideoClip.m_FrameRate}");
+ sb.AppendLine($"Frame rate: {m_VideoClip.m_FrameRate:.0##}");
sb.AppendLine($"Split alpha: {m_VideoClip.m_HasSplitAlpha}");
assetItem.InfoText = sb.ToString();
diff --git a/AssetStudioUtility/AssetStudioUtility.csproj b/AssetStudioUtility/AssetStudioUtility.csproj
index 9797dbe..5fc9266 100644
--- a/AssetStudioUtility/AssetStudioUtility.csproj
+++ b/AssetStudioUtility/AssetStudioUtility.csproj
@@ -2,15 +2,14 @@
net472;net6.0;net6.0-windows;net7.0;net7.0-windows
- 0.17.1.0
- Copyright © Perfare 2018-2022
+ 0.17.2.0
+ Copyright © Perfare 2018-2022; Copyright © aelurum 2023
embedded
-
@@ -23,6 +22,11 @@
0.17.0
+
+
+
+
+
diff --git a/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs b/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs
index d8b0a6f..c312fb6 100644
--- a/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs
+++ b/AssetStudioUtility/CubismLive2DExtractor/Live2DExtractor.cs
@@ -99,7 +99,7 @@ namespace CubismLive2DExtractor
}
//motion
- var motions = new JArray();
+ var motions = new SortedDictionary();
if (gameObjects.Count > 0)
{
@@ -205,11 +205,8 @@ namespace CubismLive2DExtractor
}
json.Meta.TotalUserDataSize = totalUserDataSize;
- motions.Add(new JObject
- {
- { "Name", animation.Name },
- { "File", $"motions/{animation.Name}.motion3.json" }
- });
+ var motionPath = new JObject(new JProperty("File", $"motions/{animation.Name}.motion3.json"));
+ motions.Add(animation.Name, new JArray(motionPath));
File.WriteAllText($"{destMotionPath}{animation.Name}.motion3.json", JsonConvert.SerializeObject(json, Formatting.Indented, new MyJsonConverter()));
}
}
@@ -307,7 +304,7 @@ namespace CubismLive2DExtractor
{
Moc = $"{modelName}.moc3",
Textures = textures.ToArray(),
- Motions = new JObject { { "", motions } },
+ Motions = JObject.FromObject(motions),
Expressions = expressions,
},
Groups = groups.ToArray()
diff --git a/AssetStudioUtility/SpriteHelper.cs b/AssetStudioUtility/SpriteHelper.cs
index d82b638..df3f108 100644
--- a/AssetStudioUtility/SpriteHelper.cs
+++ b/AssetStudioUtility/SpriteHelper.cs
@@ -34,7 +34,11 @@ namespace AssetStudio
{
if (m_Sprite.m_RD.texture.TryGet(out var m_Texture2D) && m_Sprite.m_RD.alphaTexture.TryGet(out var m_AlphaTexture2D) && spriteMaskMode != SpriteMaskMode.Off && !m_Sprite.akSplitAlpha)
{
- var tex = CutImage(m_Sprite, m_Texture2D, m_Sprite.m_RD.textureRect, m_Sprite.m_RD.textureRectOffset, m_Sprite.m_RD.downscaleMultiplier, m_Sprite.m_RD.settingsRaw);
+ Image tex = null;
+ if (spriteMaskMode != SpriteMaskMode.MaskOnly)
+ {
+ tex = CutImage(m_Sprite, m_Texture2D, m_Sprite.m_RD.textureRect, m_Sprite.m_RD.textureRectOffset, m_Sprite.m_RD.downscaleMultiplier, m_Sprite.m_RD.settingsRaw);
+ }
var alphaTex = CutImage(m_Sprite, m_AlphaTexture2D, m_Sprite.m_RD.textureRect, m_Sprite.m_RD.textureRectOffset, m_Sprite.m_RD.downscaleMultiplier, m_Sprite.m_RD.settingsRaw);
switch (spriteMaskMode)
@@ -46,7 +50,6 @@ namespace AssetStudio
tex.ApplyRGBMask(alphaTex);
return tex;
case SpriteMaskMode.MaskOnly:
- tex.Dispose();
return alphaTex;
}
}
@@ -89,92 +92,90 @@ namespace AssetStudio
var originalImage = m_Texture2D.ConvertToImage(false);
if (originalImage != null)
{
- using (originalImage)
+ if (downscaleMultiplier > 0f && downscaleMultiplier != 1f)
{
- if (downscaleMultiplier > 0f && downscaleMultiplier != 1f)
- {
- var width = (int)(m_Texture2D.m_Width / downscaleMultiplier);
- var height = (int)(m_Texture2D.m_Height / downscaleMultiplier);
- originalImage.Mutate(x => x.Resize(width, height));
- }
- var rectX = (int)Math.Floor(textureRect.x);
- var rectY = (int)Math.Floor(textureRect.y);
- var rectRight = (int)Math.Ceiling(textureRect.x + textureRect.width);
- var rectBottom = (int)Math.Ceiling(textureRect.y + textureRect.height);
- rectRight = Math.Min(rectRight, originalImage.Width);
- rectBottom = Math.Min(rectBottom, originalImage.Height);
- var rect = new Rectangle(rectX, rectY, rectRight - rectX, rectBottom - rectY);
- var spriteImage = originalImage.Clone(x => x.Crop(rect));
- if (settingsRaw.packed == 1)
- {
- //RotateAndFlip
- switch (settingsRaw.packingRotation)
- {
- case SpritePackingRotation.FlipHorizontal:
- spriteImage.Mutate(x => x.Flip(FlipMode.Horizontal));
- break;
- case SpritePackingRotation.FlipVertical:
- spriteImage.Mutate(x => x.Flip(FlipMode.Vertical));
- break;
- case SpritePackingRotation.Rotate180:
- spriteImage.Mutate(x => x.Rotate(180));
- break;
- case SpritePackingRotation.Rotate90:
- spriteImage.Mutate(x => x.Rotate(270));
- break;
- }
- }
-
- //Tight
- if (settingsRaw.packingMode == SpritePackingMode.Tight)
- {
- try
- {
- var matrix = Matrix3x2.CreateScale(m_Sprite.m_PixelsToUnits);
- matrix *= Matrix3x2.CreateTranslation(m_Sprite.m_Rect.width * m_Sprite.m_Pivot.X - textureRectOffset.X, m_Sprite.m_Rect.height * m_Sprite.m_Pivot.Y - textureRectOffset.Y);
- var triangles = GetTriangles(m_Sprite.m_RD);
- var points = triangles.Select(x => x.Select(y => new PointF(y.X, y.Y)).ToArray());
- var pathBuilder = new PathBuilder(matrix);
- foreach (var p in points)
- {
- pathBuilder.AddLines(p);
- pathBuilder.CloseFigure();
- }
- var path = pathBuilder.Build();
- var options = new DrawingOptions
- {
- GraphicsOptions = new GraphicsOptions
- {
- Antialias = false,
- AlphaCompositionMode = PixelAlphaCompositionMode.DestOut
- }
- };
- if (triangles.Length < 1024)
- {
- var rectP = new RectangularPolygon(0, 0, rect.Width, rect.Height);
- spriteImage.Mutate(x => x.Fill(options, SixLabors.ImageSharp.Color.Red, rectP.Clip(path)));
- spriteImage.Mutate(x => x.Flip(FlipMode.Vertical));
- return spriteImage;
- }
- using (var mask = new Image(rect.Width, rect.Height, SixLabors.ImageSharp.Color.Black))
- {
- mask.Mutate(x => x.Fill(options, SixLabors.ImageSharp.Color.Red, path));
- var brush = new ImageBrush(mask);
- spriteImage.Mutate(x => x.Fill(options, brush));
- spriteImage.Mutate(x => x.Flip(FlipMode.Vertical));
- return spriteImage;
- }
- }
- catch
- {
- // ignored
- }
- }
-
- //Rectangle
- spriteImage.Mutate(x => x.Flip(FlipMode.Vertical));
- return spriteImage;
+ var width = (int)(m_Texture2D.m_Width / downscaleMultiplier);
+ var height = (int)(m_Texture2D.m_Height / downscaleMultiplier);
+ originalImage.Mutate(x => x.Resize(width, height));
}
+ var rectX = (int)Math.Floor(textureRect.x);
+ var rectY = (int)Math.Floor(textureRect.y);
+ var rectRight = (int)Math.Ceiling(textureRect.x + textureRect.width);
+ var rectBottom = (int)Math.Ceiling(textureRect.y + textureRect.height);
+ rectRight = Math.Min(rectRight, originalImage.Width);
+ rectBottom = Math.Min(rectBottom, originalImage.Height);
+ var rect = new Rectangle(rectX, rectY, rectRight - rectX, rectBottom - rectY);
+ var spriteImage = originalImage.Clone(x => x.Crop(rect));
+ originalImage.Dispose();
+ if (settingsRaw.packed == 1)
+ {
+ //RotateAndFlip
+ switch (settingsRaw.packingRotation)
+ {
+ case SpritePackingRotation.FlipHorizontal:
+ spriteImage.Mutate(x => x.Flip(FlipMode.Horizontal));
+ break;
+ case SpritePackingRotation.FlipVertical:
+ spriteImage.Mutate(x => x.Flip(FlipMode.Vertical));
+ break;
+ case SpritePackingRotation.Rotate180:
+ spriteImage.Mutate(x => x.Rotate(180));
+ break;
+ case SpritePackingRotation.Rotate90:
+ spriteImage.Mutate(x => x.Rotate(270));
+ break;
+ }
+ }
+
+ //Tight
+ if (settingsRaw.packingMode == SpritePackingMode.Tight)
+ {
+ try
+ {
+ var matrix = Matrix3x2.CreateScale(m_Sprite.m_PixelsToUnits);
+ matrix *= Matrix3x2.CreateTranslation(m_Sprite.m_Rect.width * m_Sprite.m_Pivot.X - textureRectOffset.X, m_Sprite.m_Rect.height * m_Sprite.m_Pivot.Y - textureRectOffset.Y);
+ var triangles = GetTriangles(m_Sprite.m_RD);
+ var points = triangles.Select(x => x.Select(y => new PointF(y.X, y.Y)).ToArray());
+ var pathBuilder = new PathBuilder(matrix);
+ foreach (var p in points)
+ {
+ pathBuilder.AddLines(p);
+ pathBuilder.CloseFigure();
+ }
+ var path = pathBuilder.Build();
+ var options = new DrawingOptions
+ {
+ GraphicsOptions = new GraphicsOptions
+ {
+ Antialias = false,
+ AlphaCompositionMode = PixelAlphaCompositionMode.DestOut
+ }
+ };
+ if (triangles.Length < 1024)
+ {
+ var rectP = new RectangularPolygon(0, 0, rect.Width, rect.Height);
+ spriteImage.Mutate(x => x.Fill(options, SixLabors.ImageSharp.Color.Red, rectP.Clip(path)));
+ spriteImage.Mutate(x => x.Flip(FlipMode.Vertical));
+ return spriteImage;
+ }
+ using (var mask = new Image(rect.Width, rect.Height, SixLabors.ImageSharp.Color.Black))
+ {
+ mask.Mutate(x => x.Fill(options, SixLabors.ImageSharp.Color.Red, path));
+ var brush = new ImageBrush(mask);
+ spriteImage.Mutate(x => x.Fill(options, brush));
+ spriteImage.Mutate(x => x.Flip(FlipMode.Vertical));
+ return spriteImage;
+ }
+ }
+ catch
+ {
+ // ignored
+ }
+ }
+
+ //Rectangle
+ spriteImage.Mutate(x => x.Flip(FlipMode.Vertical));
+ return spriteImage;
}
return null;
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a125331..d280287 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,19 @@
# Changelog
+## v0.17.2.0 [27-08-2023]
+- [GUI] Improved Scene Hierarchy tab
+ - Added "Related assets" item to the context menu (https://github.com/aelurum/AssetStudio/issues/7)
+- [GUI] Added app.manifest for net472 build
+ - Added long paths support (win10 v1607+)
+ - Fixed blurring at high DPI with scaling
+- [CLI] Fixed sprite export in sprite only mode
+- Made some changes to motion list for live2d models
+ - Motion list is now sorted
+ - Motions divided into groups (each motion is a separate group)
+ - Motion names are used as group names
+- Updated dependencies
+- Made some other minor fixes and improvements
+
## v0.17.1.0 [12-07-2023]
#### Breaking Changes
- With the drag&drop fix (https://github.com/aelurum/AssetStudio/commit/2f8f57c1a63893c0b0d2a55349d6cb6d8f8a5a3b), functions `LoadFiles` and `LoadFolder` in AssetsManager have been replaced with one universal function `LoadFilesAndFolders`
diff --git a/Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj b/Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj
index 920f182..fba7713 100644
--- a/Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj
+++ b/Texture2DDecoderWrapper/Texture2DDecoderWrapper.csproj
@@ -3,7 +3,7 @@
net472
true
- 0.17.1.0
+ 0.17.2.0
Copyright © Perfare 2020-2022; Copyright © hozuki 2020
embedded