- new streamlined and modular code for exporting assets

- improved export status messages
- support for DXTn Crunched textures (extract only)
This commit is contained in:
Radu
2015-11-23 22:33:42 +02:00
parent 17bfc966c8
commit 00966b2bce
7 changed files with 465 additions and 618 deletions

View File

@ -31,8 +31,6 @@ namespace Unity_Studio
public long m_Offset;
public long m_Size;
public byte[] m_AudioData;
public string extension = "";
public AudioClip(AssetPreloadData preloadData, bool readSwitch)
{
@ -94,58 +92,7 @@ namespace Unity_Studio
m_Size = a_Stream.ReadInt64();
m_CompressionFormat = a_Stream.ReadInt32();
}
#region Info Text & extension
preloadData.InfoText = "Compression format: ";
switch (m_Type)
{
case 2:
extension = ".aif";
preloadData.InfoText += "AIFF";
break;
case 13:
extension = ".mp3";
preloadData.InfoText += "MP3";
break;
case 14:
extension = ".ogg";
preloadData.InfoText += "Ogg Vorbis";
break;
case 20:
extension = ".wav";
preloadData.InfoText += "WAV";
break;
case 22: //xbox encoding
extension = ".wav";
preloadData.InfoText += "Xbox360 WAV";
break;
}
switch (m_CompressionFormat)
{
case 0:
extension = ".fsb";
preloadData.InfoText += "PCM";
break;
case 1:
extension = ".fsb";
preloadData.InfoText += "Vorbis";
break;
case 2:
extension = ".fsb";
preloadData.InfoText += "ADPCM";
break;
case 3:
extension = ".fsb";
preloadData.InfoText += "MP3";//not sure
break;
}
if (extension == "") { preloadData.InfoText += "Unknown"; }
preloadData.InfoText += "\n3D: " + m_3D.ToString();
#endregion
if (readSwitch)
{
m_AudioData = new byte[m_Size];
@ -164,6 +111,66 @@ namespace Unity_Studio
}
}
}
else
{
preloadData.InfoText = "Compression format: ";
switch (m_Type)
{
case 2:
preloadData.extension = ".aif";
preloadData.InfoText += "AIFF";
break;
case 13:
preloadData.extension = ".mp3";
preloadData.InfoText += "MP3";
break;
case 14:
preloadData.extension = ".ogg";
preloadData.InfoText += "Ogg Vorbis";
break;
case 20:
preloadData.extension = ".wav";
preloadData.InfoText += "WAV";
break;
case 22: //xbox encoding
preloadData.extension = ".wav";
preloadData.InfoText += "Xbox360 WAV";
break;
}
switch (m_CompressionFormat)
{
case 0:
preloadData.extension = ".fsb";
preloadData.InfoText += "PCM";
break;
case 1:
preloadData.extension = ".fsb";
preloadData.InfoText += "Vorbis";
break;
case 2:
preloadData.extension = ".fsb";
preloadData.InfoText += "ADPCM";
break;
case 3:
preloadData.extension = ".fsb";
preloadData.InfoText += "MP3";//not sure
break;
}
if (preloadData.extension == "")
{
preloadData.extension = ".AudioClip";
preloadData.InfoText += "Unknown";
}
preloadData.InfoText += "\n3D: " + m_3D.ToString();
if (m_Name != "") { preloadData.Text = m_Name; }
else { preloadData.Text = preloadData.TypeString + " #" + preloadData.uniqueID; }
preloadData.exportSize = (int)m_Size;
preloadData.SubItems.AddRange(new string[] { preloadData.TypeString, m_Size.ToString() });
}
}
}
}

View File

@ -9,9 +9,8 @@ namespace Unity_Studio
{
public string m_Name;
public byte[] m_FontData;
public string extension;
public unityFont(AssetPreloadData preloadData)
public unityFont(AssetPreloadData preloadData, bool readSwitch)
{
var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream;
@ -26,106 +25,115 @@ namespace Unity_Studio
m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
int m_AsciiStartOffset = a_Stream.ReadInt32();
if (sourceFile.version[0] <= 3)
if (readSwitch)
{
int m_FontCountX = a_Stream.ReadInt32();
int m_FontCountY = a_Stream.ReadInt32();
}
int m_AsciiStartOffset = a_Stream.ReadInt32();
float m_Kerning = a_Stream.ReadSingle();
float m_LineSpacing = a_Stream.ReadSingle();
if (sourceFile.version[0] <= 3)
{
int m_PerCharacterKerning_size = a_Stream.ReadInt32();
for (int i = 0; i < m_PerCharacterKerning_size; i++)
if (sourceFile.version[0] <= 3)
{
int first = a_Stream.ReadInt32();
int m_FontCountX = a_Stream.ReadInt32();
int m_FontCountY = a_Stream.ReadInt32();
}
float m_Kerning = a_Stream.ReadSingle();
float m_LineSpacing = a_Stream.ReadSingle();
if (sourceFile.version[0] <= 3)
{
int m_PerCharacterKerning_size = a_Stream.ReadInt32();
for (int i = 0; i < m_PerCharacterKerning_size; i++)
{
int first = a_Stream.ReadInt32();
float second = a_Stream.ReadSingle();
}
}
else
{
int m_CharacterSpacing = a_Stream.ReadInt32();
int m_CharacterPadding = a_Stream.ReadInt32();
}
int m_ConvertCase = a_Stream.ReadInt32();
PPtr m_DefaultMaterial = sourceFile.ReadPPtr();
int m_CharacterRects_size = a_Stream.ReadInt32();
for (int i = 0; i < m_CharacterRects_size; i++)
{
int index = a_Stream.ReadInt32();
//Rectf uv
float uvx = a_Stream.ReadSingle();
float uvy = a_Stream.ReadSingle();
float uvwidth = a_Stream.ReadSingle();
float uvheight = a_Stream.ReadSingle();
//Rectf vert
float vertx = a_Stream.ReadSingle();
float verty = a_Stream.ReadSingle();
float vertwidth = a_Stream.ReadSingle();
float vertheight = a_Stream.ReadSingle();
float width = a_Stream.ReadSingle();
if (sourceFile.version[0] >= 4)
{
bool flipped = a_Stream.ReadBoolean();
a_Stream.Position += 3;
}
}
PPtr m_Texture = sourceFile.ReadPPtr();
int m_KerningValues_size = a_Stream.ReadInt32();
for (int i = 0; i < m_KerningValues_size; i++)
{
int pairfirst = a_Stream.ReadInt16();
int pairsecond = a_Stream.ReadInt16();
float second = a_Stream.ReadSingle();
}
if (sourceFile.version[0] <= 3)
{
bool m_GridFont = a_Stream.ReadBoolean();
a_Stream.Position += 3; //4 byte alignment
}
else { float m_PixelScale = a_Stream.ReadSingle(); }
int m_FontData_size = a_Stream.ReadInt32();
if (m_FontData_size > 0)
{
m_FontData = new byte[m_FontData_size];
a_Stream.Read(m_FontData, 0, m_FontData_size);
if (m_FontData[0] == 79 && m_FontData[1] == 84 && m_FontData[2] == 84 && m_FontData[3] == 79)
{ preloadData.extension = ".otf"; }
else { preloadData.extension = ".ttf"; }
}
float m_FontSize = a_Stream.ReadSingle();//problem here in minifootball
float m_Ascent = a_Stream.ReadSingle();
uint m_DefaultStyle = a_Stream.ReadUInt32();
int m_FontNames = a_Stream.ReadInt32();
for (int i = 0; i < m_FontNames; i++)
{
string m_FontName = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
}
if (sourceFile.version[0] >= 4)
{
int m_FallbackFonts = a_Stream.ReadInt32();
for (int i = 0; i < m_FallbackFonts; i++)
{
PPtr m_FallbackFont = sourceFile.ReadPPtr();
}
int m_FontRenderingMode = a_Stream.ReadInt32();
}
}
else
{
int m_CharacterSpacing = a_Stream.ReadInt32();
int m_CharacterPadding = a_Stream.ReadInt32();
}
int m_ConvertCase = a_Stream.ReadInt32();
PPtr m_DefaultMaterial = sourceFile.ReadPPtr();
int m_CharacterRects_size = a_Stream.ReadInt32();
for (int i = 0; i < m_CharacterRects_size; i++)
{
int index = a_Stream.ReadInt32();
//Rectf uv
float uvx = a_Stream.ReadSingle();
float uvy = a_Stream.ReadSingle();
float uvwidth = a_Stream.ReadSingle();
float uvheight = a_Stream.ReadSingle();
//Rectf vert
float vertx = a_Stream.ReadSingle();
float verty = a_Stream.ReadSingle();
float vertwidth = a_Stream.ReadSingle();
float vertheight = a_Stream.ReadSingle();
float width = a_Stream.ReadSingle();
if (sourceFile.version[0] >= 4)
{
bool flipped = a_Stream.ReadBoolean();
a_Stream.Position += 3;
}
}
PPtr m_Texture = sourceFile.ReadPPtr();
int m_KerningValues_size = a_Stream.ReadInt32();
for (int i = 0; i < m_KerningValues_size; i++)
{
int pairfirst = a_Stream.ReadInt16();
int pairsecond = a_Stream.ReadInt16();
float second = a_Stream.ReadSingle();
}
if (sourceFile.version[0] <= 3)
{
bool m_GridFont = a_Stream.ReadBoolean();
a_Stream.Position += 3; //4 byte alignment
}
else { float m_PixelScale = a_Stream.ReadSingle(); }
int m_FontData_size = a_Stream.ReadInt32();
if (m_FontData_size > 0)
{
m_FontData = new byte[m_FontData_size];
a_Stream.Read(m_FontData, 0, m_FontData_size);
if (m_FontData[0] == 79 && m_FontData[1] == 84 && m_FontData[2] == 84 && m_FontData[3] == 79)
{ extension = ".otf"; }
else { extension = ".ttf"; }
}
float m_FontSize = a_Stream.ReadSingle();//problem here in minifootball
float m_Ascent = a_Stream.ReadSingle();
uint m_DefaultStyle = a_Stream.ReadUInt32();
int m_FontNames = a_Stream.ReadInt32();
for (int i = 0; i < m_FontNames; i++)
{
string m_FontName = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
}
if (sourceFile.version[0] >= 4)
{
int m_FallbackFonts = a_Stream.ReadInt32();
for (int i = 0; i < m_FallbackFonts; i++)
{
PPtr m_FallbackFont = sourceFile.ReadPPtr();
}
int m_FontRenderingMode = a_Stream.ReadInt32();
if (m_Name != "") { preloadData.Text = m_Name; }
else { preloadData.Text = preloadData.TypeString + " #" + preloadData.uniqueID; }
preloadData.SubItems.AddRange(new string[] { preloadData.TypeString, preloadData.exportSize.ToString() });
}
}
}

View File

@ -11,14 +11,12 @@ namespace Unity_Studio
public byte[] m_Script;
public string m_PathName;
public int exportSize;
public string extension = ".txt";
public TextAsset(AssetPreloadData preloadData, bool readSwitch)
{
var sourceFile = preloadData.sourceFile;
var a_Stream = preloadData.sourceFile.a_Stream;
a_Stream.Position = preloadData.Offset;
preloadData.extension = ".txt";
if (sourceFile.platform == -2)
{
@ -37,7 +35,7 @@ namespace Unity_Studio
a_Stream.Read(m_Script, 0, m_Script_size);
if (m_Script[0] == 93) { m_Script = SevenZip.Compression.LZMA.SevenZipHelper.Decompress(m_Script); }
if (m_Script[0] == 60 || (m_Script[0] == 239 && m_Script[1] == 187 && m_Script[2] == 191 && m_Script[3] == 60)) { extension = ".xml"; }
if (m_Script[0] == 60 || (m_Script[0] == 239 && m_Script[1] == 187 && m_Script[2] == 191 && m_Script[3] == 60)) { preloadData.extension = ".xml"; }
}
else
{
@ -45,12 +43,16 @@ namespace Unity_Studio
if (lzmaTest == 93)
{
a_Stream.Position += 4;
exportSize = a_Stream.ReadInt32(); //actualy int64
preloadData.exportSize = a_Stream.ReadInt32(); //actualy int64
a_Stream.Position -= 8;
}
else { exportSize = m_Script_size; }
else { preloadData.exportSize = m_Script_size; }
a_Stream.Position += m_Script_size - 1;
if (m_Name != "") { preloadData.Text = m_Name; }
else { preloadData.Text = preloadData.TypeString + " #" + preloadData.uniqueID; }
preloadData.SubItems.AddRange(new string[] { preloadData.TypeString, preloadData.exportSize.ToString() });
}
a_Stream.AlignStream(4);

View File

@ -26,6 +26,7 @@ namespace Unity_Studio
public int m_ColorSpace;
public byte[] image_data;
public int dwFlags = 0x1 + 0x2 + 0x4 + 0x1000;
//public int dwHeight;
//public int dwWidth;
@ -56,7 +57,6 @@ namespace Unity_Studio
public int pvrMetaDataSize = 0x0;
public int image_data_size;
string extension;
public Texture2D(AssetPreloadData preloadData, bool readSwitch)
{
@ -77,10 +77,6 @@ namespace Unity_Studio
m_CompleteImageSize = a_Stream.ReadInt32();
m_TextureFormat = a_Stream.ReadInt32();
if (m_TextureFormat < 30) { extension = ".dds"; }
else if (m_TextureFormat < 35) { extension = ".pvr"; }
else { extension = "_" + m_Width.ToString() + "x" + m_Height.ToString() + "." + m_TextureFormat.ToString() + ".tex"; }
if (sourceFile.version[0] < 5 || (sourceFile.version[0] == 5 && sourceFile.version[1] < 2))
{ m_MipMap = a_Stream.ReadBoolean(); }
else
@ -235,7 +231,7 @@ namespace Unity_Studio
image_data[i * 2 + 1] = b0;
}
}
dwFlags2 = 0x40;
dwRGBBitCount = 0x10;
dwRBitMask = 0xF800;
@ -305,6 +301,9 @@ namespace Unity_Studio
dwABitMask = 0xF000;
break;
}
case 28: //DXT1 Crunched
case 29: //DXT1 Crunched
break;
case 30: //PVRTC_RGB2
{
pvrPixelFormat = 0x0;
@ -332,6 +331,52 @@ namespace Unity_Studio
}
}
}
else
{
preloadData.InfoText = "Width: " + m_Width.ToString() + "\nHeight: " + m_Height.ToString() + "\nFormat: ";
preloadData.exportSize = image_data_size;
switch (m_TextureFormat)
{
case 1: preloadData.InfoText += "Alpha8"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 2: preloadData.InfoText += "ARGB 4.4.4.4"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 3: preloadData.InfoText += "BGR 8.8.8"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 4: preloadData.InfoText += "GRAB 8.8.8.8"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 5: preloadData.InfoText += "BGRA 8.8.8.8"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 7: preloadData.InfoText += "RGB 5.6.5"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 10: preloadData.InfoText += "DXT1"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 12: preloadData.InfoText += "DXT5"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 13: preloadData.InfoText += "RGBA 4.4.4.4"; preloadData.extension = ".dds"; preloadData.exportSize += 128; break;
case 28: preloadData.InfoText += "DXT1 Crunched"; preloadData.extension = ".crn"; break;
case 29: preloadData.InfoText += "DXT5 Crunched"; preloadData.extension = ".crn"; break;
case 30: preloadData.InfoText += "PVRTC_RGB2"; preloadData.extension = ".pvr"; preloadData.exportSize += 52; break;
case 31: preloadData.InfoText += "PVRTC_RGBA2"; preloadData.extension = ".pvr"; preloadData.exportSize += 52; break;
case 32: preloadData.InfoText += "PVRTC_RGB4"; preloadData.extension = ".pvr"; preloadData.exportSize += 52; break;
case 33: preloadData.InfoText += "PVRTC_RGBA4"; preloadData.extension = ".pvr"; preloadData.exportSize += 52; break;
case 34: preloadData.InfoText += "ETC_RGB4"; preloadData.extension = ".pvr"; preloadData.exportSize += 52; break;
default: preloadData.InfoText += "unknown"; preloadData.extension = ".tex"; break;
}
switch (m_FilterMode)
{
case 0: preloadData.InfoText += "\nFilter Mode: Point "; break;
case 1: preloadData.InfoText += "\nFilter Mode: Bilinear "; break;
case 2: preloadData.InfoText += "\nFilter Mode: Trilinear "; break;
}
preloadData.InfoText += "\nAnisotropic level: " + m_Aniso.ToString() + "\nMip map bias: " + m_MipBias.ToString();
switch (m_WrapMode)
{
case 0: preloadData.InfoText += "\nWrap mode: Repeat"; break;
case 1: preloadData.InfoText += "\nWrap mode: Clamp"; break;
}
if (m_Name != "") { preloadData.Text = m_Name; }
else { preloadData.Text = preloadData.TypeString + " #" + preloadData.uniqueID; }
preloadData.SubItems.AddRange(new string[] { preloadData.TypeString, preloadData.exportSize.ToString() });
}
}
}
}