VaDiM
2026-06-19 20:58:31 +03:00
parent 4260bfc7e6
commit 071afb5e7e
2 changed files with 30 additions and 2 deletions
+4 -2
View File
@@ -13,6 +13,7 @@ namespace AssetStudio
public bool m_MipMap;
public int m_MipCount;
public GLTextureSettings m_TextureSettings;
public int m_LightmapFormat;
public int m_ImageCount;
public byte[] m_PlatformBlob;
[JsonPropertyName("image data")]
@@ -70,6 +71,7 @@ namespace AssetStudio
m_MipCount = parsedTex2d.m_MipCount;
m_ImageCount = parsedTex2d.m_ImageCount;
m_TextureSettings = parsedTex2d.m_TextureSettings;
m_LightmapFormat = parsedTex2d.m_LightmapFormat;
m_StreamData = parsedTex2d.m_StreamData;
m_PlatformBlob = parsedTex2d.m_PlatformBlob ?? Array.Empty<byte>();
@@ -137,7 +139,7 @@ namespace AssetStudio
var m_IgnoreMasterTextureLimit = reader.ReadBoolean();
}
}
if (version.IsInRange(3, (5, 5))) //3.0.0 - 5.4
if (version.IsInRange(3, (5, 5))) //3.0.0 - 5.5 down
{
var m_ReadAllowed = reader.ReadBoolean();
}
@@ -162,7 +164,7 @@ namespace AssetStudio
m_TextureSettings = new GLTextureSettings(reader);
if (version >= 3) //3.0 and up
{
var m_LightmapFormat = reader.ReadInt32();
m_LightmapFormat = reader.ReadInt32();
}
if (version >= (3, 5)) //3.5.0 and up
{
+26
View File
@@ -120,6 +120,7 @@ namespace AssetStudio
{
image.Mutate(x => x.Flip(FlipMode.Vertical));
}
return true;
}
finally
@@ -334,6 +335,13 @@ namespace AssetStudio
BigArrayPool<byte>.Shared.Return(buff, clearArray: true);
}
//src: https://github.com/AssetRipper/AssetRipper/blob/master/Source/AssetRipper.Export.Modules.Textures/TextureConverter.cs
// despite the name, this packing works for different formats
if (m_Texture2D.m_LightmapFormat == 3) //NormalmapDXT5nm
{
UnpackNormal(destSpan);
}
return flag;
}
@@ -844,5 +852,23 @@ namespace AssetStudio
}
return !result.IsEmpty;
}
private void UnpackNormal(Span<byte> bgraImageData)
{
for (var i = 0; i < outputDataSize; i += 4)
{
(bgraImageData[i + 2], bgraImageData[i + 3]) = (bgraImageData[i + 3], bgraImageData[i + 2]); //Alpha and red are swapped
var g = bgraImageData[i + 1];
var r = bgraImageData[i + 2];
//Blue needs calculated
const double magnitudeSqr = 255 * 255;
var vr = r * 2.0 - 255.0;
var vg = g * 2.0 - 255.0;
var hypotenuseSqr = Math.Min(vr * vr + vg * vg, magnitudeSqr);
var b = (Math.Sqrt(magnitudeSqr - hypotenuseSqr) + 255.0) / 2.0;
bgraImageData[i] = (byte)b;
}
}
}
}