3 Commits

Author SHA1 Message Date
Radu
ac864c31f3 Update README.md 2015-11-20 22:18:23 +02:00
Radu
1f2635c877 - added code to handle vertex buffer streams for Unity 5
- new method of creatign unique numeric IDs for FBX objects
- added code to decompress Skin data; further research needed for data interpretation
2015-11-13 14:45:39 +02:00
Radu
235b74a9cd - export mesh deformers with dummies or bones
- FBX code re-arranged to get object count
- changed the way FBX ASCII lines are split at every ~2000 chars
- added option to export tangents
- fixed a problem with treeview continuous search
2015-11-11 19:59:28 +02:00
27 changed files with 1386 additions and 994 deletions

View File

@@ -1,6 +1,6 @@
**Unity Studio** is a tool meant for exploring, extracting and exporting assets from Unity games and apps. **Unity Studio** is a tool meant for exploring, extracting and exporting assets from Unity games and apps.
It was built upon a lot of research and reverse engineering, with more than 400 apps and games tested from every version and every platform. It was built on a few years of research and reverse engineering, with more than 400 apps and games tested from every version and every platform.
As such, it is compatible with Unity builds starting from 2.5.0 up until 5.2.2, the latest version to date, and platforms ranging from Web, PC, Linux, MacOS to Xbox360, PS3, Android and iOS. As such, it is compatible with Unity builds starting from 2.5.0 up until 5.2.2, the latest version to date, and platforms ranging from Web, PC, Linux, MacOS to Xbox360, PS3, Android and iOS.
#### Current features #### Current features

BIN
Unity Studio/7zip/7z.dll Normal file

Binary file not shown.

View File

@@ -53,20 +53,20 @@ namespace Unity_Studio
switch (fileGen) switch (fileGen)
{ {
case 6: case 6://2.5.0 - 2.6.1
{ {
a_Stream.Position = (dataEnd - tableSize); a_Stream.Position = (dataEnd - tableSize);
a_Stream.Position += 1; a_Stream.Position += 1;
break; break;
} }
case 7://Unity 3 beta case 7://3.0.0 beta
{ {
a_Stream.Position = (dataEnd - tableSize); a_Stream.Position = (dataEnd - tableSize);
a_Stream.Position += 1; a_Stream.Position += 1;
m_Version = a_Stream.ReadStringToNull(); m_Version = a_Stream.ReadStringToNull();
break; break;
} }
case 8: case 8://3.0.0 - 3.4.2
{ {
a_Stream.Position = (dataEnd - tableSize); a_Stream.Position = (dataEnd - tableSize);
a_Stream.Position += 1; a_Stream.Position += 1;
@@ -74,15 +74,15 @@ namespace Unity_Studio
platform = a_Stream.ReadInt32(); platform = a_Stream.ReadInt32();
break; break;
} }
case 9: case 9://3.5.0 - 4.6.x
{ {
a_Stream.Position += 4;//azero a_Stream.Position += 4;//azero
m_Version = a_Stream.ReadStringToNull(); m_Version = a_Stream.ReadStringToNull();
platform = a_Stream.ReadInt32(); platform = a_Stream.ReadInt32();
break; break;
} }
case 14: case 14://5.0.0 beta and final
case 15://not fully tested! case 15://5.0.1 and up
{ {
a_Stream.Position += 4;//azero a_Stream.Position += 4;//azero
m_Version = a_Stream.ReadStringToNull(); m_Version = a_Stream.ReadStringToNull();

View File

@@ -29,10 +29,11 @@
private void InitializeComponent() private void InitializeComponent()
{ {
this.includeBox = new System.Windows.Forms.GroupBox(); this.includeBox = new System.Windows.Forms.GroupBox();
this.convertDummies = new System.Windows.Forms.CheckBox();
this.embedBox = new System.Windows.Forms.CheckBox(); this.embedBox = new System.Windows.Forms.CheckBox();
this.lightsBox = new System.Windows.Forms.CheckBox(); this.lightsBox = new System.Windows.Forms.CheckBox();
this.camerasBox = new System.Windows.Forms.CheckBox(); this.camerasBox = new System.Windows.Forms.CheckBox();
this.animationBox = new System.Windows.Forms.CheckBox(); this.exportDeformers = new System.Windows.Forms.CheckBox();
this.geometryBox = new System.Windows.Forms.GroupBox(); this.geometryBox = new System.Windows.Forms.GroupBox();
this.exportColors = new System.Windows.Forms.CheckBox(); this.exportColors = new System.Windows.Forms.CheckBox();
this.exportUVs = new System.Windows.Forms.CheckBox(); this.exportUVs = new System.Windows.Forms.CheckBox();
@@ -56,23 +57,35 @@
// includeBox // includeBox
// //
this.includeBox.AutoSize = true; this.includeBox.AutoSize = true;
this.includeBox.Controls.Add(this.convertDummies);
this.includeBox.Controls.Add(this.embedBox); this.includeBox.Controls.Add(this.embedBox);
this.includeBox.Controls.Add(this.lightsBox); this.includeBox.Controls.Add(this.lightsBox);
this.includeBox.Controls.Add(this.camerasBox); this.includeBox.Controls.Add(this.camerasBox);
this.includeBox.Controls.Add(this.animationBox); this.includeBox.Controls.Add(this.exportDeformers);
this.includeBox.Controls.Add(this.geometryBox); this.includeBox.Controls.Add(this.geometryBox);
this.includeBox.Location = new System.Drawing.Point(13, 13); this.includeBox.Location = new System.Drawing.Point(12, 12);
this.includeBox.Name = "includeBox"; this.includeBox.Name = "includeBox";
this.includeBox.Size = new System.Drawing.Size(359, 262); this.includeBox.Size = new System.Drawing.Size(360, 285);
this.includeBox.TabIndex = 0; this.includeBox.TabIndex = 0;
this.includeBox.TabStop = false; this.includeBox.TabStop = false;
this.includeBox.Text = "Include"; this.includeBox.Text = "Include";
// //
// convertDummies
//
this.convertDummies.AutoSize = true;
this.convertDummies.Location = new System.Drawing.Point(14, 178);
this.convertDummies.Name = "convertDummies";
this.convertDummies.Size = new System.Drawing.Size(205, 17);
this.convertDummies.TabIndex = 5;
this.convertDummies.Text = "Convert Deforming Dummies to Bones";
this.convertDummies.UseVisualStyleBackColor = true;
this.convertDummies.CheckedChanged += new System.EventHandler(this.exportOpnions_CheckedChanged);
//
// embedBox // embedBox
// //
this.embedBox.AutoSize = true; this.embedBox.AutoSize = true;
this.embedBox.Enabled = false; this.embedBox.Enabled = false;
this.embedBox.Location = new System.Drawing.Point(14, 226); this.embedBox.Location = new System.Drawing.Point(14, 249);
this.embedBox.Name = "embedBox"; this.embedBox.Name = "embedBox";
this.embedBox.Size = new System.Drawing.Size(91, 17); this.embedBox.Size = new System.Drawing.Size(91, 17);
this.embedBox.TabIndex = 4; this.embedBox.TabIndex = 4;
@@ -83,7 +96,7 @@
// //
this.lightsBox.AutoSize = true; this.lightsBox.AutoSize = true;
this.lightsBox.Enabled = false; this.lightsBox.Enabled = false;
this.lightsBox.Location = new System.Drawing.Point(14, 202); this.lightsBox.Location = new System.Drawing.Point(14, 225);
this.lightsBox.Name = "lightsBox"; this.lightsBox.Name = "lightsBox";
this.lightsBox.Size = new System.Drawing.Size(54, 17); this.lightsBox.Size = new System.Drawing.Size(54, 17);
this.lightsBox.TabIndex = 3; this.lightsBox.TabIndex = 3;
@@ -94,23 +107,23 @@
// //
this.camerasBox.AutoSize = true; this.camerasBox.AutoSize = true;
this.camerasBox.Enabled = false; this.camerasBox.Enabled = false;
this.camerasBox.Location = new System.Drawing.Point(14, 178); this.camerasBox.Location = new System.Drawing.Point(14, 201);
this.camerasBox.Name = "camerasBox"; this.camerasBox.Name = "camerasBox";
this.camerasBox.Size = new System.Drawing.Size(67, 17); this.camerasBox.Size = new System.Drawing.Size(67, 17);
this.camerasBox.TabIndex = 2; this.camerasBox.TabIndex = 2;
this.camerasBox.Text = "Cameras"; this.camerasBox.Text = "Cameras";
this.camerasBox.UseVisualStyleBackColor = true; this.camerasBox.UseVisualStyleBackColor = true;
// //
// animationBox // exportDeformers
// //
this.animationBox.AutoSize = true; this.exportDeformers.AutoSize = true;
this.animationBox.Enabled = false; this.exportDeformers.Location = new System.Drawing.Point(14, 154);
this.animationBox.Location = new System.Drawing.Point(14, 154); this.exportDeformers.Name = "exportDeformers";
this.animationBox.Name = "animationBox"; this.exportDeformers.Size = new System.Drawing.Size(98, 17);
this.animationBox.Size = new System.Drawing.Size(72, 17); this.exportDeformers.TabIndex = 1;
this.animationBox.TabIndex = 1; this.exportDeformers.Text = "Skin Deformers";
this.animationBox.Text = "Animation"; this.exportDeformers.UseVisualStyleBackColor = true;
this.animationBox.UseVisualStyleBackColor = true; this.exportDeformers.CheckedChanged += new System.EventHandler(this.exportDeformers_CheckedChanged);
// //
// geometryBox // geometryBox
// //
@@ -155,7 +168,6 @@
// exportTangents // exportTangents
// //
this.exportTangents.AutoSize = true; this.exportTangents.AutoSize = true;
this.exportTangents.Enabled = false;
this.exportTangents.Location = new System.Drawing.Point(7, 44); this.exportTangents.Location = new System.Drawing.Point(7, 44);
this.exportTangents.Name = "exportTangents"; this.exportTangents.Name = "exportTangents";
this.exportTangents.Size = new System.Drawing.Size(71, 17); this.exportTangents.Size = new System.Drawing.Size(71, 17);
@@ -184,7 +196,7 @@
this.advancedBox.Controls.Add(this.upAxis); this.advancedBox.Controls.Add(this.upAxis);
this.advancedBox.Controls.Add(this.scaleFactor); this.advancedBox.Controls.Add(this.scaleFactor);
this.advancedBox.Controls.Add(this.scaleLabel); this.advancedBox.Controls.Add(this.scaleLabel);
this.advancedBox.Location = new System.Drawing.Point(12, 281); this.advancedBox.Location = new System.Drawing.Point(12, 303);
this.advancedBox.Name = "advancedBox"; this.advancedBox.Name = "advancedBox";
this.advancedBox.Size = new System.Drawing.Size(360, 80); this.advancedBox.Size = new System.Drawing.Size(360, 80);
this.advancedBox.TabIndex = 5; this.advancedBox.TabIndex = 5;
@@ -240,7 +252,7 @@
// //
// fbxOKbutton // fbxOKbutton
// //
this.fbxOKbutton.Location = new System.Drawing.Point(216, 367); this.fbxOKbutton.Location = new System.Drawing.Point(216, 389);
this.fbxOKbutton.Name = "fbxOKbutton"; this.fbxOKbutton.Name = "fbxOKbutton";
this.fbxOKbutton.Size = new System.Drawing.Size(75, 23); this.fbxOKbutton.Size = new System.Drawing.Size(75, 23);
this.fbxOKbutton.TabIndex = 6; this.fbxOKbutton.TabIndex = 6;
@@ -251,7 +263,7 @@
// fbxCancel // fbxCancel
// //
this.fbxCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; this.fbxCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.fbxCancel.Location = new System.Drawing.Point(297, 367); this.fbxCancel.Location = new System.Drawing.Point(297, 389);
this.fbxCancel.Name = "fbxCancel"; this.fbxCancel.Name = "fbxCancel";
this.fbxCancel.Size = new System.Drawing.Size(75, 23); this.fbxCancel.Size = new System.Drawing.Size(75, 23);
this.fbxCancel.TabIndex = 7; this.fbxCancel.TabIndex = 7;
@@ -267,11 +279,11 @@
// showExpOpt // showExpOpt
// //
this.showExpOpt.AutoSize = true; this.showExpOpt.AutoSize = true;
this.showExpOpt.Location = new System.Drawing.Point(12, 371); this.showExpOpt.Location = new System.Drawing.Point(12, 393);
this.showExpOpt.Name = "showExpOpt"; this.showExpOpt.Name = "showExpOpt";
this.showExpOpt.Size = new System.Drawing.Size(127, 17); this.showExpOpt.Size = new System.Drawing.Size(179, 17);
this.showExpOpt.TabIndex = 8; this.showExpOpt.TabIndex = 8;
this.showExpOpt.Text = "Show for each export"; this.showExpOpt.Text = "Show this dialog for every export";
this.showExpOpt.UseVisualStyleBackColor = true; this.showExpOpt.UseVisualStyleBackColor = true;
// //
// ExportOptions // ExportOptions
@@ -280,7 +292,7 @@
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.fbxCancel; this.CancelButton = this.fbxCancel;
this.ClientSize = new System.Drawing.Size(384, 401); this.ClientSize = new System.Drawing.Size(384, 421);
this.Controls.Add(this.showExpOpt); this.Controls.Add(this.showExpOpt);
this.Controls.Add(this.fbxCancel); this.Controls.Add(this.fbxCancel);
this.Controls.Add(this.fbxOKbutton); this.Controls.Add(this.fbxOKbutton);
@@ -315,7 +327,7 @@
private System.Windows.Forms.CheckBox embedBox; private System.Windows.Forms.CheckBox embedBox;
private System.Windows.Forms.CheckBox lightsBox; private System.Windows.Forms.CheckBox lightsBox;
private System.Windows.Forms.CheckBox camerasBox; private System.Windows.Forms.CheckBox camerasBox;
private System.Windows.Forms.CheckBox animationBox; private System.Windows.Forms.CheckBox exportDeformers;
private System.Windows.Forms.GroupBox geometryBox; private System.Windows.Forms.GroupBox geometryBox;
private System.Windows.Forms.CheckBox exportColors; private System.Windows.Forms.CheckBox exportColors;
private System.Windows.Forms.CheckBox exportUVs; private System.Windows.Forms.CheckBox exportUVs;
@@ -327,5 +339,6 @@
private System.Windows.Forms.Button fbxCancel; private System.Windows.Forms.Button fbxCancel;
private System.Windows.Forms.SaveFileDialog saveFileDialog1; private System.Windows.Forms.SaveFileDialog saveFileDialog1;
private System.Windows.Forms.CheckBox showExpOpt; private System.Windows.Forms.CheckBox showExpOpt;
private System.Windows.Forms.CheckBox convertDummies;
} }
} }

View File

@@ -21,6 +21,9 @@ namespace Unity_Studio
exportTangents.Checked = (bool)Properties.Settings.Default["exportTangents"]; exportTangents.Checked = (bool)Properties.Settings.Default["exportTangents"];
exportUVs.Checked = (bool)Properties.Settings.Default["exportUVs"]; exportUVs.Checked = (bool)Properties.Settings.Default["exportUVs"];
exportColors.Checked = (bool)Properties.Settings.Default["exportColors"]; exportColors.Checked = (bool)Properties.Settings.Default["exportColors"];
exportDeformers.Checked = (bool)Properties.Settings.Default["exportDeformers"];
convertDummies.Checked = (bool)Properties.Settings.Default["convertDummies"];
convertDummies.Enabled = (bool)Properties.Settings.Default["exportDeformers"];
scaleFactor.Value = (decimal)Properties.Settings.Default["scaleFactor"]; scaleFactor.Value = (decimal)Properties.Settings.Default["scaleFactor"];
upAxis.SelectedIndex = (int)Properties.Settings.Default["upAxis"]; upAxis.SelectedIndex = (int)Properties.Settings.Default["upAxis"];
showExpOpt.Checked = (bool)Properties.Settings.Default["showExpOpt"]; showExpOpt.Checked = (bool)Properties.Settings.Default["showExpOpt"];
@@ -38,6 +41,7 @@ namespace Unity_Studio
Properties.Settings.Default["exportTangents"] = exportTangents.Checked; Properties.Settings.Default["exportTangents"] = exportTangents.Checked;
Properties.Settings.Default["exportUVs"] = exportUVs.Checked; Properties.Settings.Default["exportUVs"] = exportUVs.Checked;
Properties.Settings.Default["exportColors"] = exportColors.Checked; Properties.Settings.Default["exportColors"] = exportColors.Checked;
Properties.Settings.Default["exportDeformers"] = exportDeformers.Checked;
Properties.Settings.Default["scaleFactor"] = scaleFactor.Value; Properties.Settings.Default["scaleFactor"] = scaleFactor.Value;
Properties.Settings.Default["upAxis"] = upAxis.SelectedIndex; Properties.Settings.Default["upAxis"] = upAxis.SelectedIndex;
this.DialogResult = DialogResult.OK; this.DialogResult = DialogResult.OK;
@@ -49,5 +53,11 @@ namespace Unity_Studio
this.DialogResult = DialogResult.Cancel; this.DialogResult = DialogResult.Cancel;
this.Close(); this.Close();
} }
private void exportDeformers_CheckedChanged(object sender, EventArgs e)
{
exportOpnions_CheckedChanged(sender, e);
convertDummies.Enabled = exportDeformers.Checked;
}
} }
} }

Binary file not shown.

View File

@@ -166,5 +166,29 @@ namespace Unity_Studio.Properties {
this["showExpOpt"] = value; this["showExpOpt"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool exportDeformers {
get {
return ((bool)(this["exportDeformers"]));
}
set {
this["exportDeformers"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool convertDummies {
get {
return ((bool)(this["convertDummies"]));
}
set {
this["convertDummies"] = value;
}
}
} }
} }

View File

@@ -38,5 +38,11 @@
<Setting Name="showExpOpt" Type="System.Boolean" Scope="User"> <Setting Name="showExpOpt" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value> <Value Profile="(Default)">False</Value>
</Setting> </Setting>
<Setting Name="exportDeformers" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="convertDummies" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -9,8 +9,8 @@ namespace Unity_Studio
class AudioClip class AudioClip
{ {
public string m_Name; public string m_Name;
public int m_Format = 0; public int m_Format;
public int m_Type; public int m_Type = -1;
public bool m_3D; public bool m_3D;
public bool m_UseHardware; public bool m_UseHardware;
@@ -25,14 +25,14 @@ namespace Unity_Studio
public bool m_PreloadAudioData; public bool m_PreloadAudioData;
public bool m_LoadInBackground; public bool m_LoadInBackground;
public bool m_Legacy3D; public bool m_Legacy3D;
public int m_CompressionFormat; public int m_CompressionFormat = -1;
public string m_Source; public string m_Source;
public long m_Offset; public long m_Offset;
public long m_Size; public long m_Size;
public byte[] m_AudioData; public byte[] m_AudioData;
public string extension; public string extension = "";
public AudioClip(AssetPreloadData preloadData, bool readSwitch) public AudioClip(AssetPreloadData preloadData, bool readSwitch)
{ {
@@ -73,8 +73,7 @@ namespace Unity_Studio
} }
else else
{ {
m_LoadType = a_Stream.ReadInt32(); m_LoadType = a_Stream.ReadInt32();//Decompress on load, Compressed in memory, Streaming
m_Type = m_LoadType;
m_Channels = a_Stream.ReadInt32(); m_Channels = a_Stream.ReadInt32();
m_Frequency = a_Stream.ReadInt32(); m_Frequency = a_Stream.ReadInt32();
m_BitsPerSample = a_Stream.ReadInt32(); m_BitsPerSample = a_Stream.ReadInt32();
@@ -97,17 +96,13 @@ namespace Unity_Studio
} }
#region Info Text & extension #region Info Text & extension
preloadData.InfoText = "Format: " + m_Format + "\nType: "; preloadData.InfoText = "Compression format: ";
switch (m_Type) switch (m_Type)
{ {
case 1:
extension = ".fsb";
preloadData.InfoText += "FSB with substreams";
break;
case 2: case 2:
extension = ".fsb"; extension = ".aif";
preloadData.InfoText += "FSB"; preloadData.InfoText += "AIFF";
break; break;
case 13: case 13:
extension = ".mp3"; extension = ".mp3";
@@ -125,11 +120,29 @@ namespace Unity_Studio
extension = ".wav"; extension = ".wav";
preloadData.InfoText += "Xbox360 WAV"; preloadData.InfoText += "Xbox360 WAV";
break; break;
default: }
preloadData.InfoText += "Unknown type " + m_Type;
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; break;
} }
if (extension == "") { preloadData.InfoText += "Unknown"; }
preloadData.InfoText += "\n3D: " + m_3D.ToString(); preloadData.InfoText += "\n3D: " + m_3D.ToString();
#endregion #endregion

View File

@@ -93,7 +93,7 @@ But since the -90 rotation from Unity is a regular type, it will show up in the
Also, re-importing this FBX in Unity will now produce a (-90)+(-90)=-180 rotation. Also, re-importing this FBX in Unity will now produce a (-90)+(-90)=-180 rotation.
This is an unfortunate eyesore, but nothing more, the orientation will be fine. This is an unfortunate eyesore, but nothing more, the orientation will be fine.
In theory, one could add +90 degrees rotation to GameObjects that link to Mesh assets (but not other types) and use a different conversion for vertex components. In theory, one could add +90 degrees rotation to GameObjects that link to Mesh assets (but not other types) to cancel out the Unity rotation.
The problem is you can never know where the Unity mesh originated from. If it came from a left-handed format such as OBJ, there wouldn't have been any conversion and it wouldn't have that -90 degree adjustment. The problem is you can never know where the Unity mesh originated from. If it came from a left-handed format such as OBJ, there wouldn't have been any conversion and it wouldn't have that -90 degree adjustment.
So it would "fix" meshes that were originally sourced form FBX, but would still have the "extra" rotation in mehses sourced from left-handed formats. So it would "fix" meshes that were originally sourced form FBX, but would still have the "extra" rotation in mehses sourced from left-handed formats.
*/ */
@@ -107,10 +107,13 @@ namespace Unity_Studio
public List<SubMesh> m_SubMeshes = new List<SubMesh>(); public List<SubMesh> m_SubMeshes = new List<SubMesh>();
public List<uint> m_Indices = new List<uint>(); //use a list because I don't always know the facecount for triangle strips public List<uint> m_Indices = new List<uint>(); //use a list because I don't always know the facecount for triangle strips
public List<int> m_materialIDs = new List<int>(); public List<int> m_materialIDs = new List<int>();
public uint m_VertexCount; private uint[] m_IndexBuffer;
private ChannelInfo[] m_Channels; private ChannelInfo[] m_Channels;
private StreamInfo[] m_Streams; private StreamInfo[] m_Streams;
private uint[] m_IndexBuffer; public List<BoneInfluence>[] m_Skin;
//public Dictionary<int, float>[] m_Skin;
public float[][,] m_BindPose;
public int m_VertexCount;
public float[] m_Vertices; public float[] m_Vertices;
public float[] m_Normals; public float[] m_Normals;
public float[] m_Colors; public float[] m_Colors;
@@ -130,6 +133,12 @@ namespace Unity_Studio
public uint vertexCount; public uint vertexCount;
} }
public class BoneInfluence
{
public float weight;
public int boneIndex;
}
public class ChannelInfo public class ChannelInfo
{ {
public byte stream; public byte stream;
@@ -150,7 +159,7 @@ namespace Unity_Studio
public class PackedBitVector public class PackedBitVector
{ {
public uint m_NumItems; public int m_NumItems;
public float m_Range = 1.0f; public float m_Range = 1.0f;
public float m_Start = 0.0f; public float m_Start = 0.0f;
public byte[] m_Data; public byte[] m_Data;
@@ -362,6 +371,7 @@ namespace Unity_Studio
} }
#endregion #endregion
#region subMeshes
int m_SubMeshes_size = a_Stream.ReadInt32(); int m_SubMeshes_size = a_Stream.ReadInt32();
for (int s = 0; s < m_SubMeshes_size; s++) for (int s = 0; s < m_SubMeshes_size; s++)
{ {
@@ -380,52 +390,64 @@ namespace Unity_Studio
a_Stream.Position += 24; //Axis-Aligned Bounding Box a_Stream.Position += 24; //Axis-Aligned Bounding Box
} }
} }
#endregion
#region m_Shapes for 4.1.0 and later, excluding 4.1.0 alpha
if (version [0] >= 5 || (version[0] == 4 && (version[1] > 1 || (version[1] == 1 && MeshPD.sourceFile.buildType[0] != "a")))) #region BlendShapeData for 4.1.0 to 4.2.x, excluding 4.1.0 alpha
if (version[0] == 4 && ((version[1] == 1 && MeshPD.sourceFile.buildType[0] != "a") ||
(version[1] > 1 && version[1] <= 2)))
{ {
if (version[0] == 4 && version[1] <= 2) //4.1.0f4 - 4.2.2f1 int m_Shapes_size = a_Stream.ReadInt32();
if (m_Shapes_size > 0)
{ {
int m_Shapes_size = a_Stream.ReadInt32(); bool stop = true;
if (m_Shapes_size > 0)
{
bool stop = true;
}
for (int s = 0; s < m_Shapes_size; s++) //untested
{
string shape_name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
a_Stream.Position += 36; //uint firstVertex, vertexCount; Vector3f aabbMinDelta, aabbMaxDelta; bool hasNormals, hasTangents
}
int m_ShapeVertices_size = a_Stream.ReadInt32();
a_Stream.Position += m_ShapeVertices_size * 40; //vertex positions, normals, tangents & uint index
} }
else //4.3.0 and later for (int s = 0; s < m_Shapes_size; s++) //untested
{ {
int m_ShapeVertices_size = a_Stream.ReadInt32(); string shape_name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
a_Stream.Position += m_ShapeVertices_size * 40; //vertex positions, normals, tangents & uint index a_Stream.Position += 36; //uint firstVertex, vertexCount; Vector3f aabbMinDelta, aabbMaxDelta; bool hasNormals, hasTangents
int shapes_size = a_Stream.ReadInt32();
a_Stream.Position += shapes_size * 12; //uint firstVertex, vertexCount; bool hasNormals, hasTangents
int channels_size = a_Stream.ReadInt32();
for (int c = 0; c < channels_size; c++)
{
string channel_name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
a_Stream.Position += 12; //uint nameHash; int frameIndex, frameCount
}
int fullWeights_size = a_Stream.ReadInt32();
a_Stream.Position += fullWeights_size * 4; //floats
int m_BindPose_size = a_Stream.ReadInt32();
a_Stream.Position += m_BindPose_size * 16 * 4; //matrix 4x4
int m_BoneNameHashes_size = a_Stream.ReadInt32();
a_Stream.Position += m_BoneNameHashes_size * 4; //uints
uint m_RootBoneNameHash = a_Stream.ReadUInt32();
} }
int m_ShapeVertices_size = a_Stream.ReadInt32();
a_Stream.Position += m_ShapeVertices_size * 40; //vertex positions, normals, tangents & uint index
}
#endregion
#region BlendShapeData and BindPose for 4.3.0 and later
else if (version[0] >= 5 || (version[0] == 4 && version[1] >= 3))
{
int m_ShapeVertices_size = a_Stream.ReadInt32();
if (m_ShapeVertices_size > 0)
{
bool stop = true;
}
a_Stream.Position += m_ShapeVertices_size * 40; //vertex positions, normals, tangents & uint index
int shapes_size = a_Stream.ReadInt32();
a_Stream.Position += shapes_size * 12; //uint firstVertex, vertexCount; bool hasNormals, hasTangents
int channels_size = a_Stream.ReadInt32();
for (int c = 0; c < channels_size; c++)
{
string channel_name = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
a_Stream.Position += 12; //uint nameHash; int frameIndex, frameCount
}
int fullWeights_size = a_Stream.ReadInt32();
a_Stream.Position += fullWeights_size * 4; //floats
m_BindPose = new float[a_Stream.ReadInt32()][,];
for (int i = 0; i < m_BindPose.Length; i++)
{
m_BindPose[i] = new float[4,4] {
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() } };
}
int m_BoneNameHashes_size = a_Stream.ReadInt32();
a_Stream.Position += m_BoneNameHashes_size * 4; //uints
uint m_RootBoneNameHash = a_Stream.ReadUInt32();
} }
#endregion #endregion
@@ -454,7 +476,7 @@ namespace Unity_Studio
{ {
m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; m_IndexBuffer = new uint[m_IndexBuffer_size / 4];
for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt32(); } for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt32(); }
//align?? a_Stream.AlignStream(4);//untested
} }
} }
#endregion #endregion
@@ -462,15 +484,36 @@ namespace Unity_Studio
#region Vertex Buffer for 3.4.2 and earlier #region Vertex Buffer for 3.4.2 and earlier
if (version[0] < 3 || (version[0] == 3 && version[1] < 5)) if (version[0] < 3 || (version[0] == 3 && version[1] < 5))
{ {
m_VertexCount = a_Stream.ReadUInt32(); m_VertexCount = a_Stream.ReadInt32();
m_Vertices = new float[m_VertexCount * 3]; m_Vertices = new float[m_VertexCount * 3];
for (int v = 0; v < m_VertexCount * 3; v++) { m_Vertices[v] = a_Stream.ReadSingle(); } for (int v = 0; v < m_VertexCount * 3; v++) { m_Vertices[v] = a_Stream.ReadSingle(); }
int m_Skin_size = a_Stream.ReadInt32(); m_Skin = new List<BoneInfluence>[a_Stream.ReadInt32()];
a_Stream.Position += m_Skin_size * 32; //4x float weights & 4x int boneIndices //m_Skin = new Dictionary<int, float>[a_Stream.ReadInt32()];
for (int s = 0; s < m_Skin.Length; s++)
{
m_Skin[s] = new List<BoneInfluence>();
for (int i = 0; i < 4; i++) { m_Skin[s].Add(new BoneInfluence() { weight = a_Stream.ReadSingle() }); }
for (int i = 0; i < 4; i++) { m_Skin[s][i].boneIndex = a_Stream.ReadInt32(); }
int m_BindPose_size = a_Stream.ReadInt32(); /*m_Skin[s] = new Dictionary<int, float>();
a_Stream.Position += m_BindPose_size * 16 * 4; //matrix 4x4 float[] weights = new float[4] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() };
for (int i = 0; i < 4; i++)
{
int boneIndex = a_Stream.ReadInt32();
m_Skin[s][boneIndex] = weights[i];
}*/
}
m_BindPose = new float[a_Stream.ReadInt32()][,];
for (int i = 0; i < m_BindPose.Length; i++)
{
m_BindPose[i] = new float[4, 4] {
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() } };
}
int m_UV1_size = a_Stream.ReadInt32(); int m_UV1_size = a_Stream.ReadInt32();
m_UV1 = new float[m_UV1_size * 2]; m_UV1 = new float[m_UV1_size * 2];
@@ -507,19 +550,41 @@ namespace Unity_Studio
else else
{ {
#region read vertex stream #region read vertex stream
int m_Skin_size = a_Stream.ReadInt32(); m_Skin = new List<BoneInfluence>[a_Stream.ReadInt32()];
a_Stream.Position += m_Skin_size * 32; //4x float weights & 4x int boneIndices //m_Skin = new Dictionary<int, float>[a_Stream.ReadInt32()];
for (int s = 0; s < m_Skin.Length; s++)
if (version[0] <= 3 || (version[0] == 4 && version[1] <= 2))
{ {
int m_BindPose_size = a_Stream.ReadInt32(); m_Skin[s] = new List<BoneInfluence>();
a_Stream.Position += m_BindPose_size * 16 * 4; //matrix 4x4 for (int i = 0; i < 4; i++) { m_Skin[s].Add(new BoneInfluence() { weight = a_Stream.ReadSingle() }); }
for (int i = 0; i < 4; i++) { m_Skin[s][i].boneIndex = a_Stream.ReadInt32(); }
/*m_Skin[s] = new Dictionary<int, float>();
float[] weights = new float[4] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() };
for (int i = 0; i < 4; i++)
{
int boneIndex = a_Stream.ReadInt32();
m_Skin[s][boneIndex] = weights[i];
}*/
} }
int m_CurrentChannels = a_Stream.ReadInt32();//defined as uint in Unity
m_VertexCount = a_Stream.ReadUInt32();
#region 3.5.0 - 3.5.7 if (version[0] == 3 || (version[0] == 4 && version[1] <= 2))
{
m_BindPose = new float[a_Stream.ReadInt32()][,];
for (int i = 0; i < m_BindPose.Length; i++)
{
m_BindPose[i] = new float[4, 4] {
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() },
{ a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() } };
}
}
BitArray m_CurrentChannels = new BitArray(new int[1] { a_Stream.ReadInt32() });
m_VertexCount = a_Stream.ReadInt32();
#region streams for 3.5.0 - 3.5.7
if (version[0] < 4) if (version[0] < 4)
{ {
if (m_MeshCompression != 0 && version[2] == 0) //special case not just on platform 9 if (m_MeshCompression != 0 && version[2] == 0) //special case not just on platform 9
@@ -540,10 +605,11 @@ namespace Unity_Studio
} }
} }
#endregion #endregion
#region 4.0.0 and later #region channels and streams for 4.0.0 and later
else else
{ {
int singleStreamStride = 0;//used tor unity 5 //int singleStreamStride = 0;//used tor unity 5
int streamCount = 0;
m_Channels = new ChannelInfo[a_Stream.ReadInt32()]; m_Channels = new ChannelInfo[a_Stream.ReadInt32()];
for (int c = 0; c < m_Channels.Length; c++) for (int c = 0; c < m_Channels.Length; c++)
@@ -555,7 +621,9 @@ namespace Unity_Studio
m_Channels[c].dimension = a_Stream.ReadByte(); m_Channels[c].dimension = a_Stream.ReadByte();
//calculate stride for Unity 5 //calculate stride for Unity 5
singleStreamStride += m_Channels[c].dimension * (4 / (int)Math.Pow(2, m_Channels[c].format)); //singleStreamStride += m_Channels[c].dimension * (4 / (int)Math.Pow(2, m_Channels[c].format));
if (m_Channels[c].stream >= streamCount) { streamCount = m_Channels[c].stream + 1; }
} }
if (version[0] < 5) if (version[0] < 5)
@@ -571,13 +639,21 @@ namespace Unity_Studio
m_Streams[s].frequency = a_Stream.ReadUInt16(); m_Streams[s].frequency = a_Stream.ReadUInt16();
} }
} }
else //it's just easier to create my own stream here else //create streams
{ {
m_Streams = new StreamInfo[1]; m_Streams = new StreamInfo[streamCount];
m_Streams[0] = new StreamInfo(); for (int s = 0; s < streamCount; s++)
m_Streams[0].channelMask = new BitArray(new int[1] { m_CurrentChannels }); {
m_Streams[0].offset = 0; m_Streams[s] = new StreamInfo();
m_Streams[0].stride = singleStreamStride; m_Streams[s].channelMask = new BitArray(new int[1] { 0 });
m_Streams[s].offset = 0;
if (s > 0) { m_Streams[s].offset = m_Streams[s - 1].offset + m_Streams[s - 1].stride * m_VertexCount; }
m_Streams[s].stride = 0;
foreach (var m_Channel in m_Channels)
{
if (m_Channel.stream == s) { m_Streams[s].stride += m_Channel.dimension * (4 / (int)Math.Pow(2, m_Channel.format)); }
}
}
} }
} }
#endregion #endregion
@@ -588,15 +664,15 @@ namespace Unity_Studio
#endregion #endregion
#region compute FvF #region compute FvF
int valueBufferSize = 0; int componentByteSize = 0;
byte[] valueBuffer; byte[] componentBytes;
float[] dstArray; float[] componentsArray;
#region 4.0.0 and later
if (m_Channels != null) if (m_Channels != null)
{ {
//it is better to loop channels instead of streams //it is better to loop channels instead of streams
//because channels are likely to be sorted by vertex property //because channels are likely to be sorted by vertex property
#region 4.0.0 and later
foreach (var m_Channel in m_Channels) foreach (var m_Channel in m_Channels)
{ {
if (m_Channel.dimension > 0) if (m_Channel.dimension > 0)
@@ -605,12 +681,13 @@ namespace Unity_Studio
for (int b = 0; b < 8; b++) for (int b = 0; b < 8; b++)
{ {
if (m_Stream.channelMask.Get(b)) //in the future, try to use only m_CurrentChannels
if ((version[0] < 5 && m_Stream.channelMask.Get(b)) || (version[0] >= 5 && m_CurrentChannels.Get(b)))
{ {
// in Unity 4.x the colors channel has 1 dimension, as in 1 color with 4 components // in Unity 4.x the colors channel has 1 dimension, as in 1 color with 4 components
if (b == 2 && m_Channel.format == 2) { m_Channel.dimension = 4; } if (b == 2 && m_Channel.format == 2) { m_Channel.dimension = 4; }
valueBufferSize = 4 / (int)Math.Pow(2, m_Channel.format); componentByteSize = 4 / (int)Math.Pow(2, m_Channel.format);
/*switch (m_Channel.format) /*switch (m_Channel.format)
{ {
@@ -626,51 +703,39 @@ namespace Unity_Studio
break; break;
}*/ }*/
valueBuffer = new byte[valueBufferSize]; componentBytes = new byte[componentByteSize];
dstArray = new float[m_VertexCount * m_Channel.dimension]; componentsArray = new float[m_VertexCount * m_Channel.dimension];
for (int v = 0; v < m_VertexCount; v++) for (int v = 0; v < m_VertexCount; v++)
{ {
int vertexOffset = m_Stream.offset + m_Channel.offset + m_Stream.stride * v;
for (int d = 0; d < m_Channel.dimension; d++) for (int d = 0; d < m_Channel.dimension; d++)
{ {
int m_DataSizeOffset = m_Stream.offset + m_Channel.offset + m_Stream.stride * v + valueBufferSize * d; int componentOffset = vertexOffset + componentByteSize * d;
Buffer.BlockCopy(m_DataSize, m_DataSizeOffset, valueBuffer, 0, valueBufferSize); Buffer.BlockCopy(m_DataSize, componentOffset, componentBytes, 0, componentByteSize);
dstArray[v * m_Channel.dimension + d] = bytesToFloat(valueBuffer); componentsArray[v * m_Channel.dimension + d] = bytesToFloat(componentBytes);
} }
} }
switch (b) switch (b)
{ {
case 0: case 0: m_Vertices = componentsArray; break;
m_Vertices = dstArray; case 1: m_Normals = componentsArray; break;
break; case 2: m_Colors = componentsArray; break;
case 1: case 3: m_UV1 = componentsArray; break;
m_Normals = dstArray; case 4: m_UV2 = componentsArray; break;
break;
case 2:
m_Colors = dstArray;
break;
case 3:
m_UV1 = dstArray;
break;
case 4:
m_UV2 = dstArray;
break;
case 5: case 5:
if (version[0] == 5) { m_UV3 = dstArray; } if (version[0] == 5) { m_UV3 = componentsArray; }
else { m_Tangents = dstArray; } else { m_Tangents = componentsArray; }
break;
case 6:
m_UV4 = dstArray;
break;
case 7:
m_Tangents = dstArray;
break; break;
case 6: m_UV4 = componentsArray; break;
case 7: m_Tangents = componentsArray; break;
} }
m_Stream.channelMask.Set(b, false); //is this needed? m_Stream.channelMask.Set(b, false);
valueBuffer = null; m_CurrentChannels.Set(b, false);
dstArray = null; componentBytes = null;
componentsArray = null;
break; //go to next channel break; //go to next channel
} }
} }
@@ -697,63 +762,52 @@ namespace Unity_Studio
{ {
case 0: case 0:
case 1: case 1:
valueBufferSize = 4; componentByteSize = 4;
m_Channel.dimension = 3; m_Channel.dimension = 3;
break; break;
case 2: case 2:
valueBufferSize = 1; componentByteSize = 1;
m_Channel.dimension = 4; m_Channel.dimension = 4;
break; break;
case 3: case 3:
case 4: case 4:
valueBufferSize = 4; componentByteSize = 4;
m_Channel.dimension = 2; m_Channel.dimension = 2;
break; break;
case 5: case 5:
valueBufferSize = 4; componentByteSize = 4;
m_Channel.dimension = 4; m_Channel.dimension = 4;
break; break;
} }
valueBuffer = new byte[valueBufferSize]; componentBytes = new byte[componentByteSize];
dstArray = new float[m_VertexCount * m_Channel.dimension]; componentsArray = new float[m_VertexCount * m_Channel.dimension];
for (int v = 0; v < m_VertexCount; v++) for (int v = 0; v < m_VertexCount; v++)
{ {
int vertexOffset = m_Stream.offset + m_Channel.offset + m_Stream.stride * v;
for (int d = 0; d < m_Channel.dimension; d++) for (int d = 0; d < m_Channel.dimension; d++)
{ {
int m_DataSizeOffset = m_Stream.offset + m_Channel.offset + m_Stream.stride * v + valueBufferSize * d; int m_DataSizeOffset = vertexOffset + componentByteSize * d;
Buffer.BlockCopy(m_DataSize, m_DataSizeOffset, valueBuffer, 0, valueBufferSize); Buffer.BlockCopy(m_DataSize, m_DataSizeOffset, componentBytes, 0, componentByteSize);
dstArray[v * m_Channel.dimension + d] = bytesToFloat(valueBuffer); componentsArray[v * m_Channel.dimension + d] = bytesToFloat(componentBytes);
} }
} }
switch (b) switch (b)
{ {
case 0: case 0: m_Vertices = componentsArray; break;
m_Vertices = dstArray; case 1: m_Normals = componentsArray; break;
break; case 2: m_Colors = componentsArray; break;
case 1: case 3: m_UV1 = componentsArray; break;
m_Normals = dstArray; case 4: m_UV2 = componentsArray; break;
break; case 5: m_Tangents = componentsArray; break;
case 2:
m_Colors = dstArray;
break;
case 3:
m_UV1 = dstArray;
break;
case 4:
m_UV2 = dstArray;
break;
case 5:
m_Tangents = dstArray;
break;
} }
m_Channel.offset += (byte)(m_Channel.dimension * valueBufferSize); //strides larger than 255 are unlikely m_Channel.offset += (byte)(m_Channel.dimension * componentByteSize); //safe to cast as byte because strides larger than 255 are unlikely
m_Stream.channelMask.Set(b, false); //is this needed? m_Stream.channelMask.Set(b, false);
valueBuffer = null; componentBytes = null;
dstArray = null; componentsArray = null;
} }
} }
} }
@@ -767,8 +821,10 @@ namespace Unity_Studio
if (version[0] >= 3 || (version[0] == 2 && version[1] >= 6)) if (version[0] >= 3 || (version[0] == 2 && version[1] >= 6))
{ {
//remember there can be combinations of packed and regular vertex properties //remember there can be combinations of packed and regular vertex properties
#region m_Vertices
PackedBitVector m_Vertices_Packed = new PackedBitVector(); PackedBitVector m_Vertices_Packed = new PackedBitVector();
m_Vertices_Packed.m_NumItems = a_Stream.ReadUInt32(); m_Vertices_Packed.m_NumItems = a_Stream.ReadInt32();
m_Vertices_Packed.m_Range = a_Stream.ReadSingle(); m_Vertices_Packed.m_Range = a_Stream.ReadSingle();
m_Vertices_Packed.m_Start = a_Stream.ReadSingle(); m_Vertices_Packed.m_Start = a_Stream.ReadSingle();
m_Vertices_Packed.m_Data = new byte[a_Stream.ReadInt32()]; m_Vertices_Packed.m_Data = new byte[a_Stream.ReadInt32()];
@@ -786,12 +842,14 @@ namespace Unity_Studio
m_Vertices = new float[m_Vertices_Packed.m_NumItems]; m_Vertices = new float[m_Vertices_Packed.m_NumItems];
for (int v = 0; v < m_Vertices_Packed.m_NumItems; v++) for (int v = 0; v < m_Vertices_Packed.m_NumItems; v++)
{ {
m_Vertices[v] = (float)m_Vertices_Unpacked[v] / bitmax * m_Vertices_Packed.m_Range + m_Vertices_Packed.m_Start; m_Vertices[v] = (float)((double)m_Vertices_Unpacked[v] / bitmax) * m_Vertices_Packed.m_Range + m_Vertices_Packed.m_Start;
} }
} }
#endregion
PackedBitVector m_UV_Packed = new PackedBitVector(); //contains both channels #region m_UV
m_UV_Packed.m_NumItems = a_Stream.ReadUInt32(); PackedBitVector m_UV_Packed = new PackedBitVector(); //contains all channels
m_UV_Packed.m_NumItems = a_Stream.ReadInt32();
m_UV_Packed.m_Range = a_Stream.ReadSingle(); m_UV_Packed.m_Range = a_Stream.ReadSingle();
m_UV_Packed.m_Start = a_Stream.ReadSingle(); m_UV_Packed.m_Start = a_Stream.ReadSingle();
m_UV_Packed.m_Data = new byte[a_Stream.ReadInt32()]; m_UV_Packed.m_Data = new byte[a_Stream.ReadInt32()];
@@ -800,7 +858,7 @@ namespace Unity_Studio
m_UV_Packed.m_BitSize = a_Stream.ReadByte(); m_UV_Packed.m_BitSize = a_Stream.ReadByte();
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
if (m_UV_Packed.m_NumItems > 0) if (m_UV_Packed.m_NumItems > 0 && (bool)Properties.Settings.Default["exportUVs"])
{ {
uint[] m_UV_Unpacked = UnpackBitVector(m_UV_Packed); uint[] m_UV_Unpacked = UnpackBitVector(m_UV_Packed);
int bitmax = 0; int bitmax = 0;
@@ -810,7 +868,7 @@ namespace Unity_Studio
for (int v = 0; v < m_VertexCount * 2; v++) for (int v = 0; v < m_VertexCount * 2; v++)
{ {
m_UV1[v] = (float)m_UV_Unpacked[v] / bitmax * m_UV_Packed.m_Range + m_UV_Packed.m_Start; m_UV1[v] = (float)((double)m_UV_Unpacked[v] / bitmax) * m_UV_Packed.m_Range + m_UV_Packed.m_Start;
} }
if (m_UV_Packed.m_NumItems >= m_VertexCount * 4) if (m_UV_Packed.m_NumItems >= m_VertexCount * 4)
@@ -818,7 +876,7 @@ namespace Unity_Studio
m_UV2 = new float[m_VertexCount * 2]; m_UV2 = new float[m_VertexCount * 2];
for (uint v = 0; v < m_VertexCount * 2; v++) for (uint v = 0; v < m_VertexCount * 2; v++)
{ {
m_UV2[v] = (float)m_UV_Unpacked[v + m_VertexCount * 2] / bitmax * m_UV_Packed.m_Range + m_UV_Packed.m_Start; m_UV2[v] = (float)((double)m_UV_Unpacked[v + m_VertexCount * 2] / bitmax) * m_UV_Packed.m_Range + m_UV_Packed.m_Start;
} }
if (m_UV_Packed.m_NumItems >= m_VertexCount * 6) if (m_UV_Packed.m_NumItems >= m_VertexCount * 6)
@@ -826,7 +884,7 @@ namespace Unity_Studio
m_UV3 = new float[m_VertexCount * 2]; m_UV3 = new float[m_VertexCount * 2];
for (uint v = 0; v < m_VertexCount * 2; v++) for (uint v = 0; v < m_VertexCount * 2; v++)
{ {
m_UV3[v] = (float)m_UV_Unpacked[v + m_VertexCount * 4] / bitmax * m_UV_Packed.m_Range + m_UV_Packed.m_Start; m_UV3[v] = (float)((double)m_UV_Unpacked[v + m_VertexCount * 4] / bitmax) * m_UV_Packed.m_Range + m_UV_Packed.m_Start;
} }
if (m_UV_Packed.m_NumItems == m_VertexCount * 8) if (m_UV_Packed.m_NumItems == m_VertexCount * 8)
@@ -834,17 +892,19 @@ namespace Unity_Studio
m_UV4 = new float[m_VertexCount * 2]; m_UV4 = new float[m_VertexCount * 2];
for (uint v = 0; v < m_VertexCount * 2; v++) for (uint v = 0; v < m_VertexCount * 2; v++)
{ {
m_UV4[v] = (float)m_UV_Unpacked[v + m_VertexCount * 6] / bitmax * m_UV_Packed.m_Range + m_UV_Packed.m_Start; m_UV4[v] = (float)((double)m_UV_Unpacked[v + m_VertexCount * 6] / bitmax) * m_UV_Packed.m_Range + m_UV_Packed.m_Start;
} }
} }
} }
} }
} }
#endregion
#region m_BindPose
if (version[0] < 5) if (version[0] < 5)
{ {
PackedBitVector m_BindPoses_Packed = new PackedBitVector(); PackedBitVector m_BindPoses_Packed = new PackedBitVector();
m_BindPoses_Packed.m_NumItems = a_Stream.ReadUInt32(); m_BindPoses_Packed.m_NumItems = a_Stream.ReadInt32();
m_BindPoses_Packed.m_Range = a_Stream.ReadSingle(); m_BindPoses_Packed.m_Range = a_Stream.ReadSingle();
m_BindPoses_Packed.m_Start = a_Stream.ReadSingle(); m_BindPoses_Packed.m_Start = a_Stream.ReadSingle();
m_BindPoses_Packed.m_Data = new byte[a_Stream.ReadInt32()]; m_BindPoses_Packed.m_Data = new byte[a_Stream.ReadInt32()];
@@ -852,10 +912,32 @@ namespace Unity_Studio
a_Stream.AlignStream(4); a_Stream.AlignStream(4);
m_BindPoses_Packed.m_BitSize = a_Stream.ReadByte(); m_BindPoses_Packed.m_BitSize = a_Stream.ReadByte();
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
if (m_BindPoses_Packed.m_NumItems > 0 && (bool)Properties.Settings.Default["exportDeformers"])
{
uint[] m_BindPoses_Unpacked = UnpackBitVector(m_BindPoses_Packed);
int bitmax = 0;//used to convert int value to float
for (int b = 0; b < m_BindPoses_Packed.m_BitSize; b++) { bitmax |= (1 << b); }
m_BindPose = new float[m_BindPoses_Packed.m_NumItems / 16][,];
for (int i = 0; i < m_BindPose.Length; i++)
{
m_BindPose[i] = new float[4, 4];
for (int j = 0; j < 4; j++)
{
for (int k = 0; k < 4; k++)
{
m_BindPose[i][j,k] = (float)((double)m_BindPoses_Unpacked[i * 16 + j * 4 + k] / bitmax) * m_BindPoses_Packed.m_Range + m_BindPoses_Packed.m_Start;
}
}
}
}
} }
#endregion
PackedBitVector m_Normals_Packed = new PackedBitVector(); PackedBitVector m_Normals_Packed = new PackedBitVector();
m_Normals_Packed.m_NumItems = a_Stream.ReadUInt32(); m_Normals_Packed.m_NumItems = a_Stream.ReadInt32();
m_Normals_Packed.m_Range = a_Stream.ReadSingle(); m_Normals_Packed.m_Range = a_Stream.ReadSingle();
m_Normals_Packed.m_Start = a_Stream.ReadSingle(); m_Normals_Packed.m_Start = a_Stream.ReadSingle();
m_Normals_Packed.m_Data = new byte[a_Stream.ReadInt32()]; m_Normals_Packed.m_Data = new byte[a_Stream.ReadInt32()];
@@ -865,7 +947,7 @@ namespace Unity_Studio
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
PackedBitVector m_Tangents_Packed = new PackedBitVector(); PackedBitVector m_Tangents_Packed = new PackedBitVector();
m_Tangents_Packed.m_NumItems = a_Stream.ReadUInt32(); m_Tangents_Packed.m_NumItems = a_Stream.ReadInt32();
m_Tangents_Packed.m_Range = a_Stream.ReadSingle(); m_Tangents_Packed.m_Range = a_Stream.ReadSingle();
m_Tangents_Packed.m_Start = a_Stream.ReadSingle(); m_Tangents_Packed.m_Start = a_Stream.ReadSingle();
m_Tangents_Packed.m_Data = new byte[a_Stream.ReadInt32()]; m_Tangents_Packed.m_Data = new byte[a_Stream.ReadInt32()];
@@ -874,23 +956,24 @@ namespace Unity_Studio
m_Tangents_Packed.m_BitSize = a_Stream.ReadByte(); m_Tangents_Packed.m_BitSize = a_Stream.ReadByte();
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
PackedBitVector m_Weights_Packed = new PackedBitVector(); PackedBitVector m_Weights = new PackedBitVector();
m_Weights_Packed.m_NumItems = a_Stream.ReadUInt32(); m_Weights.m_NumItems = a_Stream.ReadInt32();
m_Weights_Packed.m_Data = new byte[a_Stream.ReadInt32()]; m_Weights.m_Data = new byte[a_Stream.ReadInt32()];
a_Stream.Read(m_Weights_Packed.m_Data, 0, m_Weights_Packed.m_Data.Length); a_Stream.Read(m_Weights.m_Data, 0, m_Weights.m_Data.Length);
a_Stream.AlignStream(4); a_Stream.AlignStream(4);
m_Weights_Packed.m_BitSize = a_Stream.ReadByte(); m_Weights.m_BitSize = a_Stream.ReadByte();
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
#region m_Normals
PackedBitVector m_NormalSigns_packed = new PackedBitVector(); PackedBitVector m_NormalSigns_packed = new PackedBitVector();
m_NormalSigns_packed.m_NumItems = a_Stream.ReadUInt32(); m_NormalSigns_packed.m_NumItems = a_Stream.ReadInt32();
m_NormalSigns_packed.m_Data = new byte[a_Stream.ReadInt32()]; m_NormalSigns_packed.m_Data = new byte[a_Stream.ReadInt32()];
a_Stream.Read(m_NormalSigns_packed.m_Data, 0, m_NormalSigns_packed.m_Data.Length); a_Stream.Read(m_NormalSigns_packed.m_Data, 0, m_NormalSigns_packed.m_Data.Length);
a_Stream.AlignStream(4); a_Stream.AlignStream(4);
m_NormalSigns_packed.m_BitSize = a_Stream.ReadByte(); m_NormalSigns_packed.m_BitSize = a_Stream.ReadByte();
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
if (m_Normals_Packed.m_NumItems > 0) if (m_Normals_Packed.m_NumItems > 0 && (bool)Properties.Settings.Default["exportNormals"])
{ {
uint[] m_Normals_Unpacked = UnpackBitVector(m_Normals_Packed); uint[] m_Normals_Unpacked = UnpackBitVector(m_Normals_Packed);
uint[] m_NormalSigns = UnpackBitVector(m_NormalSigns_packed); uint[] m_NormalSigns = UnpackBitVector(m_NormalSigns_packed);
@@ -905,19 +988,39 @@ namespace Unity_Studio
if (m_NormalSigns[v] == 0) { m_Normals[v * 3 + 2] *= -1; } if (m_NormalSigns[v] == 0) { m_Normals[v * 3 + 2] *= -1; }
} }
} }
#endregion
PackedBitVector m_TangentSigns = new PackedBitVector(); #region m_Tangents
m_TangentSigns.m_NumItems = a_Stream.ReadUInt32(); PackedBitVector m_TangentSigns_packed = new PackedBitVector();
m_TangentSigns.m_Data = new byte[a_Stream.ReadInt32()]; m_TangentSigns_packed.m_NumItems = a_Stream.ReadInt32();
a_Stream.Read(m_TangentSigns.m_Data, 0, m_TangentSigns.m_Data.Length); m_TangentSigns_packed.m_Data = new byte[a_Stream.ReadInt32()];
a_Stream.Read(m_TangentSigns_packed.m_Data, 0, m_TangentSigns_packed.m_Data.Length);
a_Stream.AlignStream(4); a_Stream.AlignStream(4);
m_TangentSigns.m_BitSize = a_Stream.ReadByte(); m_TangentSigns_packed.m_BitSize = a_Stream.ReadByte();
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
if (m_Tangents_Packed.m_NumItems > 0 && (bool)Properties.Settings.Default["exportTangents"])
{
uint[] m_Tangents_Unpacked = UnpackBitVector(m_Tangents_Packed);
uint[] m_TangentSigns = UnpackBitVector(m_TangentSigns_packed);
int bitmax = 0;
for (int b = 0; b < m_Tangents_Packed.m_BitSize; b++) { bitmax |= (1 << b); }
m_Tangents = new float[m_Tangents_Packed.m_NumItems / 2 * 3];
for (int v = 0; v < m_Tangents_Packed.m_NumItems / 2; v++)
{
m_Tangents[v * 3] = (float)((double)m_Tangents_Unpacked[v * 2] / bitmax) * m_Tangents_Packed.m_Range + m_Tangents_Packed.m_Start;
m_Tangents[v * 3 + 1] = (float)((double)m_Tangents_Unpacked[v * 2 + 1] / bitmax) * m_Tangents_Packed.m_Range + m_Tangents_Packed.m_Start;
m_Tangents[v * 3 + 2] = (float)Math.Sqrt(1 - m_Tangents[v * 3] * m_Tangents[v * 3] - m_Tangents[v * 3 + 1] * m_Tangents[v * 3 + 1]);
if (m_TangentSigns[v] == 0) { m_Tangents[v * 3 + 2] *= -1; }
}
}
#endregion
#region m_FloatColors
if (version[0] >= 5) if (version[0] >= 5)
{ {
PackedBitVector m_FloatColors = new PackedBitVector(); PackedBitVector m_FloatColors = new PackedBitVector();
m_FloatColors.m_NumItems = a_Stream.ReadUInt32(); m_FloatColors.m_NumItems = a_Stream.ReadInt32();
m_FloatColors.m_Range = a_Stream.ReadSingle(); m_FloatColors.m_Range = a_Stream.ReadSingle();
m_FloatColors.m_Start = a_Stream.ReadSingle(); m_FloatColors.m_Start = a_Stream.ReadSingle();
m_FloatColors.m_Data = new byte[a_Stream.ReadInt32()]; m_FloatColors.m_Data = new byte[a_Stream.ReadInt32()];
@@ -926,7 +1029,7 @@ namespace Unity_Studio
m_FloatColors.m_BitSize = a_Stream.ReadByte(); m_FloatColors.m_BitSize = a_Stream.ReadByte();
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
if (m_FloatColors.m_NumItems > 0) if (m_FloatColors.m_NumItems > 0 && (bool)Properties.Settings.Default["exportColors"])
{ {
uint[] m_FloatColors_Unpacked = UnpackBitVector(m_FloatColors); uint[] m_FloatColors_Unpacked = UnpackBitVector(m_FloatColors);
int bitmax = 0; int bitmax = 0;
@@ -940,17 +1043,41 @@ namespace Unity_Studio
} }
} }
} }
#endregion
#region m_Skin
PackedBitVector m_BoneIndices = new PackedBitVector(); PackedBitVector m_BoneIndices = new PackedBitVector();
m_BoneIndices.m_NumItems = a_Stream.ReadUInt32(); m_BoneIndices.m_NumItems = a_Stream.ReadInt32();
m_BoneIndices.m_Data = new byte[a_Stream.ReadInt32()]; m_BoneIndices.m_Data = new byte[a_Stream.ReadInt32()];
a_Stream.Read(m_BoneIndices.m_Data, 0, m_BoneIndices.m_Data.Length); a_Stream.Read(m_BoneIndices.m_Data, 0, m_BoneIndices.m_Data.Length);
a_Stream.AlignStream(4); a_Stream.AlignStream(4);
m_BoneIndices.m_BitSize = a_Stream.ReadByte(); m_BoneIndices.m_BitSize = a_Stream.ReadByte();
a_Stream.Position += 3; //4 byte alignment a_Stream.Position += 3; //4 byte alignment
//how the hell does this work??
if (m_BoneIndices.m_NumItems > 0 && m_BoneIndices.m_NumItems == m_Weights.m_NumItems && (bool)Properties.Settings.Default["exportDeformers"])
{
uint[] m_Weights_Unpacked = UnpackBitVector(m_Weights);
int bitmax = 0;
for (int b = 0; b < m_Weights.m_BitSize; b++) { bitmax |= (1 << b); }
uint[] m_BoneIndices_Unpacked = UnpackBitVector(m_BoneIndices);
m_Skin = new List<BoneInfluence>[m_BoneIndices.m_NumItems / 4];
for (int s = 0; s < m_Skin.Length; s++)
{
m_Skin[s] = new List<BoneInfluence>();
for (int i = 0; i < 4; i++)
{
m_Skin[s].Add(new BoneInfluence() { weight = (float)((double)m_Weights_Unpacked[s * 4 + i] / bitmax),
boneIndex = (int)m_BoneIndices_Unpacked[s * 4 + i] });
}
}
}
#endregion
PackedBitVector m_Triangles = new PackedBitVector(); PackedBitVector m_Triangles = new PackedBitVector();
m_Triangles.m_NumItems = a_Stream.ReadUInt32(); m_Triangles.m_NumItems = a_Stream.ReadInt32();
m_Triangles.m_Data = new byte[a_Stream.ReadInt32()]; m_Triangles.m_Data = new byte[a_Stream.ReadInt32()];
a_Stream.Read(m_Triangles.m_Data, 0, m_Triangles.m_Data.Length); a_Stream.Read(m_Triangles.m_Data, 0, m_Triangles.m_Data.Length);
a_Stream.AlignStream(4); a_Stream.AlignStream(4);
@@ -980,7 +1107,7 @@ namespace Unity_Studio
if (version[0] < 5) if (version[0] < 5)
{ {
PackedBitVector m_Colors_Packed = new PackedBitVector(); PackedBitVector m_Colors_Packed = new PackedBitVector();
m_Colors_Packed.m_NumItems = a_Stream.ReadUInt32(); m_Colors_Packed.m_NumItems = a_Stream.ReadInt32();
m_Colors_Packed.m_Data = new byte[a_Stream.ReadInt32()]; m_Colors_Packed.m_Data = new byte[a_Stream.ReadInt32()];
a_Stream.Read(m_Colors_Packed.m_Data, 0, m_Colors_Packed.m_Data.Length); a_Stream.Read(m_Colors_Packed.m_Data, 0, m_Colors_Packed.m_Data.Length);
a_Stream.AlignStream(4); a_Stream.AlignStream(4);
@@ -1011,6 +1138,7 @@ namespace Unity_Studio
} }
} }
} }
else { uint m_UVInfo = a_Stream.ReadUInt32(); }
a_Stream.Position += 24; //Axis-Aligned Bounding Box a_Stream.Position += 24; //Axis-Aligned Bounding Box
} }

View File

@@ -15,6 +15,7 @@ namespace Unity_Studio
public ushort m_LightmapIndexDynamic; public ushort m_LightmapIndexDynamic;
public PPtr[] m_Materials; public PPtr[] m_Materials;
public PPtr m_Mesh; public PPtr m_Mesh;
public PPtr[] m_Bones;
public SkinnedMeshRenderer(AssetPreloadData preloadData) public SkinnedMeshRenderer(AssetPreloadData preloadData)
{ {
@@ -98,28 +99,38 @@ namespace Unity_Studio
m_Mesh = sourceFile.ReadPPtr(); m_Mesh = sourceFile.ReadPPtr();
/*int m_Bones_size = a_Stream.ReadInt32(); m_Bones = new PPtr[a_Stream.ReadInt32()];
for (int b = 0; b < m_Bones_size; b++) for (int b = 0; b < m_Bones.Length; b++)
{ {
PPtr aBone = sourceFile.ReadPPtr(); m_Bones[b] = sourceFile.ReadPPtr();
} }
if (version[0] < 3) if (version[0] < 3)
{ {
int m_BindPose_size = a_Stream.ReadInt32(); int m_BindPose = a_Stream.ReadInt32();
a_Stream.Position += m_BindPose_size * 16 * 4;//Matrix4x4f a_Stream.Position += m_BindPose * 16 * 4;//Matrix4x4f
} }
else if (version[0] >= 3 && version[1] >= 4) else
{ {
if (version[1] >= 5) if (version[0] >= 4 || (version[0] == 4 && version[1] >= 3))
{
int m_BlendShapeWeights = a_Stream.ReadInt32();
a_Stream.Position += m_BlendShapeWeights * 4; //floats
}
if (version[0] >= 4 || (version[0] >= 3 && version[1] >= 5))
{ {
PPtr m_RootBone = sourceFile.ReadPPtr(); PPtr m_RootBone = sourceFile.ReadPPtr();
} }
//AABB
float[] m_Center = new float[] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() }; if (version[0] >= 4 || (version[0] == 3 && version[1] >= 4))
float[] m_Extent = new float[] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() }; {
bool m_DirtyAABB = a_Stream.ReadBoolean(); //AABB
}*/ float[] m_Center = new float[] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() };
float[] m_Extent = new float[] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() };
bool m_DirtyAABB = a_Stream.ReadBoolean();
}
}
} }
} }
} }

View File

@@ -50,7 +50,7 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<ApplicationIcon>unity.ico</ApplicationIcon> <ApplicationIcon>Resources\unity.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
@@ -128,37 +128,37 @@
<DependentUpon>AboutBox.cs</DependentUpon> <DependentUpon>AboutBox.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="AssetPreloadData.cs" /> <Compile Include="AssetPreloadData.cs" />
<Compile Include="AudioClip.cs" /> <Compile Include="Unity Classes\AudioClip.cs" />
<Compile Include="BuildSettings.cs" /> <Compile Include="Unity Classes\BuildSettings.cs" />
<Compile Include="BundleFile.cs" /> <Compile Include="BundleFile.cs" />
<Compile Include="ClassIDReference.cs" /> <Compile Include="ClassIDReference.cs" />
<Compile Include="EndianStream.cs" /> <Compile Include="EndianStream.cs" />
<Compile Include="FBXExport.cs"> <Compile Include="ExportOptions.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
<Compile Include="FBXExport.Designer.cs"> <Compile Include="ExportOptions.Designer.cs">
<DependentUpon>FBXExport.cs</DependentUpon> <DependentUpon>ExportOptions.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="FMOD Studio API\fmod.cs" /> <Compile Include="FMOD Studio API\fmod.cs" />
<Compile Include="FMOD Studio API\fmod_dsp.cs" /> <Compile Include="FMOD Studio API\fmod_dsp.cs" />
<Compile Include="FMOD Studio API\fmod_errors.cs" /> <Compile Include="FMOD Studio API\fmod_errors.cs" />
<Compile Include="Font.cs" /> <Compile Include="Unity Classes\Font.cs" />
<Compile Include="GOHierarchy.cs"> <Compile Include="GOHierarchy.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
<Compile Include="Lz4DecoderStream.cs" /> <Compile Include="Lz4DecoderStream.cs" />
<Compile Include="Material.cs" /> <Compile Include="Unity Classes\Material.cs" />
<Compile Include="Mesh.cs" /> <Compile Include="Unity Classes\Mesh.cs" />
<Compile Include="GameObject.cs" /> <Compile Include="Unity Classes\GameObject.cs" />
<Compile Include="helpers.cs" /> <Compile Include="helpers.cs" />
<Compile Include="PlayerSettings.cs" /> <Compile Include="Unity Classes\PlayerSettings.cs" />
<Compile Include="RectTransform.cs" /> <Compile Include="Unity Classes\RectTransform.cs" />
<Compile Include="Renderer.cs" /> <Compile Include="Unity Classes\Renderer.cs" />
<Compile Include="SkinnedMeshRenderer.cs" /> <Compile Include="Unity Classes\SkinnedMeshRenderer.cs" />
<Compile Include="MeshFilter.cs" /> <Compile Include="Unity Classes\MeshFilter.cs" />
<Compile Include="TextAsset.cs" /> <Compile Include="Unity Classes\TextAsset.cs" />
<Compile Include="Texture2D.cs" /> <Compile Include="Unity Classes\Texture2D.cs" />
<Compile Include="Transform.cs" /> <Compile Include="Unity Classes\Transform.cs" />
<Compile Include="Program.cs" /> <Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="AssetsFile.cs" /> <Compile Include="AssetsFile.cs" />
@@ -172,8 +172,8 @@
<DependentUpon>AboutBox.cs</DependentUpon> <DependentUpon>AboutBox.cs</DependentUpon>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="FBXExport.resx"> <EmbeddedResource Include="ExportOptions.resx">
<DependentUpon>FBXExport.cs</DependentUpon> <DependentUpon>ExportOptions.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx"> <EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
@@ -219,7 +219,13 @@
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="unity.ico" /> <Content Include="7zip\7z.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="FMOD Studio API\fmod.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Resources\unity.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup /> <ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

File diff suppressed because it is too large Load Diff

View File

@@ -43,6 +43,12 @@
<setting name="showExpOpt" serializeAs="String"> <setting name="showExpOpt" serializeAs="String">
<value>False</value> <value>False</value>
</setting> </setting>
<setting name="exportDeformers" serializeAs="String">
<value>True</value>
</setting>
<setting name="convertDummies" serializeAs="String">
<value>True</value>
</setting>
</Unity_Studio.Properties.Settings> </Unity_Studio.Properties.Settings>
</userSettings> </userSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>