Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac864c31f3 | ||
|
|
1f2635c877 | ||
|
|
235b74a9cd | ||
|
|
93ebc67841 | ||
|
|
2c94852939 | ||
|
|
5ba447aba2 | ||
|
|
cdfcba78a9 |
@@ -1,6 +1,6 @@
|
||||
**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.
|
||||
|
||||
#### Current features
|
||||
|
||||
BIN
Unity Studio/7zip/7z.dll
Normal file
BIN
Unity Studio/7zip/7z.dll
Normal file
Binary file not shown.
@@ -16,6 +16,7 @@ namespace Unity_Studio
|
||||
public int[] version = new int[4] { 0, 0, 0, 0 };
|
||||
public string[] buildType;
|
||||
public int platform = 100663296;
|
||||
public string platformStr = "";
|
||||
//public EndianType endianType = EndianType.BigEndian;
|
||||
//public List<AssetPreloadData> preloadTable = new List<AssetPreloadData>();
|
||||
public Dictionary<long, AssetPreloadData> preloadTable = new Dictionary<long, AssetPreloadData>();
|
||||
@@ -52,20 +53,20 @@ namespace Unity_Studio
|
||||
|
||||
switch (fileGen)
|
||||
{
|
||||
case 6:
|
||||
case 6://2.5.0 - 2.6.1
|
||||
{
|
||||
a_Stream.Position = (dataEnd - tableSize);
|
||||
a_Stream.Position += 1;
|
||||
break;
|
||||
}
|
||||
case 7://Unity 3 beta
|
||||
case 7://3.0.0 beta
|
||||
{
|
||||
a_Stream.Position = (dataEnd - tableSize);
|
||||
a_Stream.Position += 1;
|
||||
m_Version = a_Stream.ReadStringToNull();
|
||||
break;
|
||||
}
|
||||
case 8:
|
||||
case 8://3.0.0 - 3.4.2
|
||||
{
|
||||
a_Stream.Position = (dataEnd - tableSize);
|
||||
a_Stream.Position += 1;
|
||||
@@ -73,15 +74,15 @@ namespace Unity_Studio
|
||||
platform = a_Stream.ReadInt32();
|
||||
break;
|
||||
}
|
||||
case 9:
|
||||
case 9://3.5.0 - 4.6.x
|
||||
{
|
||||
a_Stream.Position += 4;//azero
|
||||
m_Version = a_Stream.ReadStringToNull();
|
||||
platform = a_Stream.ReadInt32();
|
||||
break;
|
||||
}
|
||||
case 14:
|
||||
case 15://not fully tested!
|
||||
case 14://5.0.0 beta and final
|
||||
case 15://5.0.1 and up
|
||||
{
|
||||
a_Stream.Position += 4;//azero
|
||||
m_Version = a_Stream.ReadStringToNull();
|
||||
@@ -105,20 +106,21 @@ namespace Unity_Studio
|
||||
a_Stream.endian = EndianType.LittleEndian;
|
||||
}
|
||||
|
||||
/*Platform list:
|
||||
-2: unitypackage
|
||||
4: OSX
|
||||
5: PC
|
||||
6: Web
|
||||
7: Web_streamed
|
||||
9: iOS
|
||||
10: PS3(big)
|
||||
11: Xbox360(big)
|
||||
13: Android
|
||||
16: Google_NaCl
|
||||
21: WP8
|
||||
25: Linux
|
||||
*/
|
||||
switch (platform)
|
||||
{
|
||||
case -2: platformStr = "Unity Package"; break;
|
||||
case 4: platformStr = "OSX"; break;
|
||||
case 5: platformStr = "PC"; break;
|
||||
case 6: platformStr = "Web"; break;
|
||||
case 7: platformStr = "Web streamed"; break;
|
||||
case 9: platformStr = "iOS"; break;
|
||||
case 10: platformStr = "PS3"; break;
|
||||
case 11: platformStr = "Xbox 360"; break;
|
||||
case 13: platformStr = "Android"; break;
|
||||
case 16: platformStr = "Google NaCl"; break;
|
||||
case 21: platformStr = "WP8"; break;
|
||||
case 25: platformStr = "Linux"; break;
|
||||
}
|
||||
|
||||
int baseCount = a_Stream.ReadInt32();
|
||||
for (int i = 0; i < baseCount; i++)
|
||||
|
||||
@@ -163,21 +163,24 @@ namespace Unity_Studio
|
||||
|
||||
public string ReadAlignedString(int length)
|
||||
{
|
||||
|
||||
byte[] stringData = new byte[length];
|
||||
base.Read(stringData, 0, length);
|
||||
var result = System.Text.Encoding.UTF8.GetString(stringData); //must verify strange characters in PS3
|
||||
|
||||
/*string result = "";
|
||||
char c;
|
||||
for (int i = 0; i < length; i++)
|
||||
if (length > 0 && length < (base.BaseStream.Length - base.BaseStream.Position))//crude failsafe
|
||||
{
|
||||
c = (char)base.ReadByte();
|
||||
result += c.ToString();
|
||||
}*/
|
||||
byte[] stringData = new byte[length];
|
||||
base.Read(stringData, 0, length);
|
||||
var result = System.Text.Encoding.UTF8.GetString(stringData); //must verify strange characters in PS3
|
||||
|
||||
AlignStream(4);
|
||||
return result;
|
||||
/*string result = "";
|
||||
char c;
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
c = (char)base.ReadByte();
|
||||
result += c.ToString();
|
||||
}*/
|
||||
|
||||
AlignStream(4);
|
||||
return result;
|
||||
}
|
||||
else { return ""; }
|
||||
}
|
||||
|
||||
public string ReadStringToNull()
|
||||
|
||||
@@ -29,10 +29,11 @@
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.includeBox = new System.Windows.Forms.GroupBox();
|
||||
this.convertDummies = new System.Windows.Forms.CheckBox();
|
||||
this.embedBox = new System.Windows.Forms.CheckBox();
|
||||
this.lightsBox = 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.exportColors = new System.Windows.Forms.CheckBox();
|
||||
this.exportUVs = new System.Windows.Forms.CheckBox();
|
||||
@@ -56,23 +57,35 @@
|
||||
// includeBox
|
||||
//
|
||||
this.includeBox.AutoSize = true;
|
||||
this.includeBox.Controls.Add(this.convertDummies);
|
||||
this.includeBox.Controls.Add(this.embedBox);
|
||||
this.includeBox.Controls.Add(this.lightsBox);
|
||||
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.Location = new System.Drawing.Point(13, 13);
|
||||
this.includeBox.Location = new System.Drawing.Point(12, 12);
|
||||
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.TabStop = false;
|
||||
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
|
||||
//
|
||||
this.embedBox.AutoSize = true;
|
||||
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.Size = new System.Drawing.Size(91, 17);
|
||||
this.embedBox.TabIndex = 4;
|
||||
@@ -83,7 +96,7 @@
|
||||
//
|
||||
this.lightsBox.AutoSize = true;
|
||||
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.Size = new System.Drawing.Size(54, 17);
|
||||
this.lightsBox.TabIndex = 3;
|
||||
@@ -94,23 +107,23 @@
|
||||
//
|
||||
this.camerasBox.AutoSize = true;
|
||||
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.Size = new System.Drawing.Size(67, 17);
|
||||
this.camerasBox.TabIndex = 2;
|
||||
this.camerasBox.Text = "Cameras";
|
||||
this.camerasBox.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// animationBox
|
||||
// exportDeformers
|
||||
//
|
||||
this.animationBox.AutoSize = true;
|
||||
this.animationBox.Enabled = false;
|
||||
this.animationBox.Location = new System.Drawing.Point(14, 154);
|
||||
this.animationBox.Name = "animationBox";
|
||||
this.animationBox.Size = new System.Drawing.Size(72, 17);
|
||||
this.animationBox.TabIndex = 1;
|
||||
this.animationBox.Text = "Animation";
|
||||
this.animationBox.UseVisualStyleBackColor = true;
|
||||
this.exportDeformers.AutoSize = true;
|
||||
this.exportDeformers.Location = new System.Drawing.Point(14, 154);
|
||||
this.exportDeformers.Name = "exportDeformers";
|
||||
this.exportDeformers.Size = new System.Drawing.Size(98, 17);
|
||||
this.exportDeformers.TabIndex = 1;
|
||||
this.exportDeformers.Text = "Skin Deformers";
|
||||
this.exportDeformers.UseVisualStyleBackColor = true;
|
||||
this.exportDeformers.CheckedChanged += new System.EventHandler(this.exportDeformers_CheckedChanged);
|
||||
//
|
||||
// geometryBox
|
||||
//
|
||||
@@ -155,7 +168,6 @@
|
||||
// exportTangents
|
||||
//
|
||||
this.exportTangents.AutoSize = true;
|
||||
this.exportTangents.Enabled = false;
|
||||
this.exportTangents.Location = new System.Drawing.Point(7, 44);
|
||||
this.exportTangents.Name = "exportTangents";
|
||||
this.exportTangents.Size = new System.Drawing.Size(71, 17);
|
||||
@@ -184,7 +196,7 @@
|
||||
this.advancedBox.Controls.Add(this.upAxis);
|
||||
this.advancedBox.Controls.Add(this.scaleFactor);
|
||||
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.Size = new System.Drawing.Size(360, 80);
|
||||
this.advancedBox.TabIndex = 5;
|
||||
@@ -240,7 +252,7 @@
|
||||
//
|
||||
// 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.Size = new System.Drawing.Size(75, 23);
|
||||
this.fbxOKbutton.TabIndex = 6;
|
||||
@@ -251,7 +263,7 @@
|
||||
// fbxCancel
|
||||
//
|
||||
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.Size = new System.Drawing.Size(75, 23);
|
||||
this.fbxCancel.TabIndex = 7;
|
||||
@@ -267,11 +279,11 @@
|
||||
// showExpOpt
|
||||
//
|
||||
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.Size = new System.Drawing.Size(127, 17);
|
||||
this.showExpOpt.Size = new System.Drawing.Size(179, 17);
|
||||
this.showExpOpt.TabIndex = 8;
|
||||
this.showExpOpt.Text = "Show for each export";
|
||||
this.showExpOpt.Text = "Show this dialog for every export";
|
||||
this.showExpOpt.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// ExportOptions
|
||||
@@ -280,7 +292,7 @@
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
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.fbxCancel);
|
||||
this.Controls.Add(this.fbxOKbutton);
|
||||
@@ -315,7 +327,7 @@
|
||||
private System.Windows.Forms.CheckBox embedBox;
|
||||
private System.Windows.Forms.CheckBox lightsBox;
|
||||
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.CheckBox exportColors;
|
||||
private System.Windows.Forms.CheckBox exportUVs;
|
||||
@@ -327,5 +339,6 @@
|
||||
private System.Windows.Forms.Button fbxCancel;
|
||||
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
|
||||
private System.Windows.Forms.CheckBox showExpOpt;
|
||||
private System.Windows.Forms.CheckBox convertDummies;
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,9 @@ namespace Unity_Studio
|
||||
exportTangents.Checked = (bool)Properties.Settings.Default["exportTangents"];
|
||||
exportUVs.Checked = (bool)Properties.Settings.Default["exportUVs"];
|
||||
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"];
|
||||
upAxis.SelectedIndex = (int)Properties.Settings.Default["upAxis"];
|
||||
showExpOpt.Checked = (bool)Properties.Settings.Default["showExpOpt"];
|
||||
@@ -38,6 +41,7 @@ namespace Unity_Studio
|
||||
Properties.Settings.Default["exportTangents"] = exportTangents.Checked;
|
||||
Properties.Settings.Default["exportUVs"] = exportUVs.Checked;
|
||||
Properties.Settings.Default["exportColors"] = exportColors.Checked;
|
||||
Properties.Settings.Default["exportDeformers"] = exportDeformers.Checked;
|
||||
Properties.Settings.Default["scaleFactor"] = scaleFactor.Value;
|
||||
Properties.Settings.Default["upAxis"] = upAxis.SelectedIndex;
|
||||
this.DialogResult = DialogResult.OK;
|
||||
@@ -49,5 +53,11 @@ namespace Unity_Studio
|
||||
this.DialogResult = DialogResult.Cancel;
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void exportDeformers_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
exportOpnions_CheckedChanged(sender, e);
|
||||
convertDummies.Enabled = exportDeformers.Checked;
|
||||
}
|
||||
}
|
||||
}
|
||||
4288
Unity Studio/FMOD Studio API/fmod.cs
Normal file
4288
Unity Studio/FMOD Studio API/fmod.cs
Normal file
File diff suppressed because it is too large
Load Diff
BIN
Unity Studio/FMOD Studio API/fmod.dll
Normal file
BIN
Unity Studio/FMOD Studio API/fmod.dll
Normal file
Binary file not shown.
1785
Unity Studio/FMOD Studio API/fmod_dsp.cs
Normal file
1785
Unity Studio/FMOD Studio API/fmod_dsp.cs
Normal file
File diff suppressed because it is too large
Load Diff
103
Unity Studio/FMOD Studio API/fmod_errors.cs
Normal file
103
Unity Studio/FMOD Studio API/fmod_errors.cs
Normal file
@@ -0,0 +1,103 @@
|
||||
/* =================================================================================================== */
|
||||
/* FMOD Studio - Error string header file. Copyright (c), Firelight Technologies Pty, Ltd. 2004-2015. */
|
||||
/* */
|
||||
/* Use this header if you want to store or display a string version / english explanation of */
|
||||
/* the FMOD error codes. */
|
||||
/* */
|
||||
/* =================================================================================================== */
|
||||
|
||||
namespace FMOD
|
||||
{
|
||||
public class Error
|
||||
{
|
||||
public static string String(FMOD.RESULT errcode)
|
||||
{
|
||||
switch (errcode)
|
||||
{
|
||||
case FMOD.RESULT.OK: return "No errors.";
|
||||
case FMOD.RESULT.ERR_BADCOMMAND: return "Tried to call a function on a data type that does not allow this type of functionality (ie calling Sound::lock on a streaming sound).";
|
||||
case FMOD.RESULT.ERR_CHANNEL_ALLOC: return "Error trying to allocate a channel.";
|
||||
case FMOD.RESULT.ERR_CHANNEL_STOLEN: return "The specified channel has been reused to play another sound.";
|
||||
case FMOD.RESULT.ERR_DMA: return "DMA Failure. See debug output for more information.";
|
||||
case FMOD.RESULT.ERR_DSP_CONNECTION: return "DSP connection error. Connection possibly caused a cyclic dependency or connected dsps with incompatible buffer counts.";
|
||||
case FMOD.RESULT.ERR_DSP_DONTPROCESS: return "DSP return code from a DSP process query callback. Tells mixer not to call the process callback and therefore not consume CPU. Use this to optimize the DSP graph.";
|
||||
case FMOD.RESULT.ERR_DSP_FORMAT: return "DSP Format error. A DSP unit may have attempted to connect to this network with the wrong format, or a matrix may have been set with the wrong size if the target unit has a specified channel map.";
|
||||
case FMOD.RESULT.ERR_DSP_INUSE: return "DSP is already in the mixer's DSP network. It must be removed before being reinserted or released.";
|
||||
case FMOD.RESULT.ERR_DSP_NOTFOUND: return "DSP connection error. Couldn't find the DSP unit specified.";
|
||||
case FMOD.RESULT.ERR_DSP_RESERVED: return "DSP operation error. Cannot perform operation on this DSP as it is reserved by the system.";
|
||||
case FMOD.RESULT.ERR_DSP_SILENCE: return "DSP return code from a DSP process query callback. Tells mixer silence would be produced from read, so go idle and not consume CPU. Use this to optimize the DSP graph.";
|
||||
case FMOD.RESULT.ERR_DSP_TYPE: return "DSP operation cannot be performed on a DSP of this type.";
|
||||
case FMOD.RESULT.ERR_FILE_BAD: return "Error loading file.";
|
||||
case FMOD.RESULT.ERR_FILE_COULDNOTSEEK: return "Couldn't perform seek operation. This is a limitation of the medium (ie netstreams) or the file format.";
|
||||
case FMOD.RESULT.ERR_FILE_DISKEJECTED: return "Media was ejected while reading.";
|
||||
case FMOD.RESULT.ERR_FILE_EOF: return "End of file unexpectedly reached while trying to read essential data (truncated?).";
|
||||
case FMOD.RESULT.ERR_FILE_ENDOFDATA: return "End of current chunk reached while trying to read data.";
|
||||
case FMOD.RESULT.ERR_FILE_NOTFOUND: return "File not found.";
|
||||
case FMOD.RESULT.ERR_FORMAT: return "Unsupported file or audio format.";
|
||||
case FMOD.RESULT.ERR_HEADER_MISMATCH: return "There is a version mismatch between the FMOD header and either the FMOD Studio library or the FMOD Low Level library.";
|
||||
case FMOD.RESULT.ERR_HTTP: return "A HTTP error occurred. This is a catch-all for HTTP errors not listed elsewhere.";
|
||||
case FMOD.RESULT.ERR_HTTP_ACCESS: return "The specified resource requires authentication or is forbidden.";
|
||||
case FMOD.RESULT.ERR_HTTP_PROXY_AUTH: return "Proxy authentication is required to access the specified resource.";
|
||||
case FMOD.RESULT.ERR_HTTP_SERVER_ERROR: return "A HTTP server error occurred.";
|
||||
case FMOD.RESULT.ERR_HTTP_TIMEOUT: return "The HTTP request timed out.";
|
||||
case FMOD.RESULT.ERR_INITIALIZATION: return "FMOD was not initialized correctly to support this function.";
|
||||
case FMOD.RESULT.ERR_INITIALIZED: return "Cannot call this command after System::init.";
|
||||
case FMOD.RESULT.ERR_INTERNAL: return "An error occurred that wasn't supposed to. Contact support.";
|
||||
case FMOD.RESULT.ERR_INVALID_FLOAT: return "Value passed in was a NaN, Inf or denormalized float.";
|
||||
case FMOD.RESULT.ERR_INVALID_HANDLE: return "An invalid object handle was used.";
|
||||
case FMOD.RESULT.ERR_INVALID_PARAM: return "An invalid parameter was passed to this function.";
|
||||
case FMOD.RESULT.ERR_INVALID_POSITION: return "An invalid seek position was passed to this function.";
|
||||
case FMOD.RESULT.ERR_INVALID_SPEAKER: return "An invalid speaker was passed to this function based on the current speaker mode.";
|
||||
case FMOD.RESULT.ERR_INVALID_SYNCPOINT: return "The syncpoint did not come from this sound handle.";
|
||||
case FMOD.RESULT.ERR_INVALID_THREAD: return "Tried to call a function on a thread that is not supported.";
|
||||
case FMOD.RESULT.ERR_INVALID_VECTOR: return "The vectors passed in are not unit length, or perpendicular.";
|
||||
case FMOD.RESULT.ERR_MAXAUDIBLE: return "Reached maximum audible playback count for this sound's soundgroup.";
|
||||
case FMOD.RESULT.ERR_MEMORY: return "Not enough memory or resources.";
|
||||
case FMOD.RESULT.ERR_MEMORY_CANTPOINT: return "Can't use FMOD_OPENMEMORY_POINT on non PCM source data, or non mp3/xma/adpcm data if FMOD_CREATECOMPRESSEDSAMPLE was used.";
|
||||
case FMOD.RESULT.ERR_NEEDS3D: return "Tried to call a command on a 2d sound when the command was meant for 3d sound.";
|
||||
case FMOD.RESULT.ERR_NEEDSHARDWARE: return "Tried to use a feature that requires hardware support.";
|
||||
case FMOD.RESULT.ERR_NET_CONNECT: return "Couldn't connect to the specified host.";
|
||||
case FMOD.RESULT.ERR_NET_SOCKET_ERROR: return "A socket error occurred. This is a catch-all for socket-related errors not listed elsewhere.";
|
||||
case FMOD.RESULT.ERR_NET_URL: return "The specified URL couldn't be resolved.";
|
||||
case FMOD.RESULT.ERR_NET_WOULD_BLOCK: return "Operation on a non-blocking socket could not complete immediately.";
|
||||
case FMOD.RESULT.ERR_NOTREADY: return "Operation could not be performed because specified sound/DSP connection is not ready.";
|
||||
case FMOD.RESULT.ERR_OUTPUT_ALLOCATED: return "Error initializing output device, but more specifically, the output device is already in use and cannot be reused.";
|
||||
case FMOD.RESULT.ERR_OUTPUT_CREATEBUFFER: return "Error creating hardware sound buffer.";
|
||||
case FMOD.RESULT.ERR_OUTPUT_DRIVERCALL: return "A call to a standard soundcard driver failed, which could possibly mean a bug in the driver or resources were missing or exhausted.";
|
||||
case FMOD.RESULT.ERR_OUTPUT_FORMAT: return "Soundcard does not support the specified format.";
|
||||
case FMOD.RESULT.ERR_OUTPUT_INIT: return "Error initializing output device.";
|
||||
case FMOD.RESULT.ERR_OUTPUT_NODRIVERS: return "The output device has no drivers installed. If pre-init, FMOD_OUTPUT_NOSOUND is selected as the output mode. If post-init, the function just fails.";
|
||||
case FMOD.RESULT.ERR_PLUGIN: return "An unspecified error has been returned from a plugin.";
|
||||
case FMOD.RESULT.ERR_PLUGIN_MISSING: return "A requested output, dsp unit type or codec was not available.";
|
||||
case FMOD.RESULT.ERR_PLUGIN_RESOURCE: return "A resource that the plugin requires cannot be found. (ie the DLS file for MIDI playback)";
|
||||
case FMOD.RESULT.ERR_PLUGIN_VERSION: return "A plugin was built with an unsupported SDK version.";
|
||||
case FMOD.RESULT.ERR_RECORD: return "An error occurred trying to initialize the recording device.";
|
||||
case FMOD.RESULT.ERR_REVERB_CHANNELGROUP: return "Reverb properties cannot be set on this channel because a parent channelgroup owns the reverb connection.";
|
||||
case FMOD.RESULT.ERR_REVERB_INSTANCE: return "Specified instance in FMOD_REVERB_PROPERTIES couldn't be set. Most likely because it is an invalid instance number or the reverb doesn't exist.";
|
||||
case FMOD.RESULT.ERR_SUBSOUNDS: return "The error occurred because the sound referenced contains subsounds when it shouldn't have, or it doesn't contain subsounds when it should have. The operation may also not be able to be performed on a parent sound.";
|
||||
case FMOD.RESULT.ERR_SUBSOUND_ALLOCATED: return "This subsound is already being used by another sound, you cannot have more than one parent to a sound. Null out the other parent's entry first.";
|
||||
case FMOD.RESULT.ERR_SUBSOUND_CANTMOVE: return "Shared subsounds cannot be replaced or moved from their parent stream, such as when the parent stream is an FSB file.";
|
||||
case FMOD.RESULT.ERR_TAGNOTFOUND: return "The specified tag could not be found or there are no tags.";
|
||||
case FMOD.RESULT.ERR_TOOMANYCHANNELS: return "The sound created exceeds the allowable input channel count. This can be increased using the 'maxinputchannels' parameter in System::setSoftwareFormat.";
|
||||
case FMOD.RESULT.ERR_TRUNCATED: return "The retrieved string is too long to fit in the supplied buffer and has been truncated.";
|
||||
case FMOD.RESULT.ERR_UNIMPLEMENTED: return "Something in FMOD hasn't been implemented when it should be! contact support!";
|
||||
case FMOD.RESULT.ERR_UNINITIALIZED: return "This command failed because System::init or System::setDriver was not called.";
|
||||
case FMOD.RESULT.ERR_UNSUPPORTED: return "A command issued was not supported by this object. Possibly a plugin without certain callbacks specified.";
|
||||
case FMOD.RESULT.ERR_VERSION: return "The version number of this file format is not supported.";
|
||||
case FMOD.RESULT.ERR_EVENT_ALREADY_LOADED: return "The specified bank has already been loaded.";
|
||||
case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_BUSY: return "The live update connection failed due to the game already being connected.";
|
||||
case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_MISMATCH: return "The live update connection failed due to the game data being out of sync with the tool.";
|
||||
case FMOD.RESULT.ERR_EVENT_LIVEUPDATE_TIMEOUT: return "The live update connection timed out.";
|
||||
case FMOD.RESULT.ERR_EVENT_NOTFOUND: return "The requested event, bus or vca could not be found.";
|
||||
case FMOD.RESULT.ERR_STUDIO_UNINITIALIZED: return "The Studio::System object is not yet initialized.";
|
||||
case FMOD.RESULT.ERR_STUDIO_NOT_LOADED: return "The specified resource is not loaded, so it can't be unloaded.";
|
||||
case FMOD.RESULT.ERR_INVALID_STRING: return "An invalid string was passed to this function.";
|
||||
case FMOD.RESULT.ERR_ALREADY_LOCKED: return "The specified resource is already locked.";
|
||||
case FMOD.RESULT.ERR_NOT_LOCKED: return "The specified resource is not locked, so it can't be unlocked.";
|
||||
case FMOD.RESULT.ERR_RECORD_DISCONNECTED: return "The specified recording driver has been disconnected.";
|
||||
case FMOD.RESULT.ERR_TOOMANYSAMPLES: return "The length provided exceed the allowable limit.";
|
||||
default: return "Unknown error.";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
24
Unity Studio/Properties/Settings.Designer.cs
generated
24
Unity Studio/Properties/Settings.Designer.cs
generated
@@ -166,5 +166,29 @@ namespace Unity_Studio.Properties {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,5 +38,11 @@
|
||||
<Setting Name="showExpOpt" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</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>
|
||||
</SettingsFile>
|
||||
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
@@ -9,8 +9,8 @@ namespace Unity_Studio
|
||||
class AudioClip
|
||||
{
|
||||
public string m_Name;
|
||||
public int m_Format = 0;
|
||||
public int m_Type;
|
||||
public int m_Format;
|
||||
public int m_Type = -1;
|
||||
public bool m_3D;
|
||||
public bool m_UseHardware;
|
||||
|
||||
@@ -25,14 +25,14 @@ namespace Unity_Studio
|
||||
public bool m_PreloadAudioData;
|
||||
public bool m_LoadInBackground;
|
||||
public bool m_Legacy3D;
|
||||
public int m_CompressionFormat;
|
||||
public int m_CompressionFormat = -1;
|
||||
|
||||
public string m_Source;
|
||||
public long m_Offset;
|
||||
public long m_Size;
|
||||
public byte[] m_AudioData;
|
||||
|
||||
public string extension;
|
||||
public string extension = "";
|
||||
|
||||
public AudioClip(AssetPreloadData preloadData, bool readSwitch)
|
||||
{
|
||||
@@ -73,8 +73,7 @@ namespace Unity_Studio
|
||||
}
|
||||
else
|
||||
{
|
||||
m_LoadType = a_Stream.ReadInt32();
|
||||
m_Type = m_LoadType;
|
||||
m_LoadType = a_Stream.ReadInt32();//Decompress on load, Compressed in memory, Streaming
|
||||
m_Channels = a_Stream.ReadInt32();
|
||||
m_Frequency = a_Stream.ReadInt32();
|
||||
m_BitsPerSample = a_Stream.ReadInt32();
|
||||
@@ -97,13 +96,13 @@ namespace Unity_Studio
|
||||
}
|
||||
|
||||
#region Info Text & extension
|
||||
preloadData.InfoText = "Format: " + m_Format + "\nType: ";
|
||||
preloadData.InfoText = "Compression format: ";
|
||||
|
||||
switch (m_Type)
|
||||
{
|
||||
case 1:
|
||||
extension = ".fsb";
|
||||
preloadData.InfoText += "FSB";
|
||||
case 2:
|
||||
extension = ".aif";
|
||||
preloadData.InfoText += "AIFF";
|
||||
break;
|
||||
case 13:
|
||||
extension = ".mp3";
|
||||
@@ -121,11 +120,29 @@ namespace Unity_Studio
|
||||
extension = ".wav";
|
||||
preloadData.InfoText += "Xbox360 WAV";
|
||||
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;
|
||||
}
|
||||
|
||||
if (extension == "") { preloadData.InfoText += "Unknown"; }
|
||||
preloadData.InfoText += "\n3D: " + m_3D.ToString();
|
||||
#endregion
|
||||
|
||||
@@ -81,11 +81,11 @@ So Unity adds a -90 degree rotation, similar to the FBX PreRotation, to bring th
|
||||
Except it does it as a regular rotation, and combines it with any other rotations in the Transform asset.
|
||||
|
||||
Converting from Unity back to FBX, the same vertex conversion cannot be applied because we have to take into account the rotation.
|
||||
Option 0: convert vertices and transformations as -X,Y,Z and set FBX option to Y-up without PreRotation!
|
||||
Option 0: export vertices and transformations as -X,Y,Z and set FBX option to Y-up without PreRotation!
|
||||
the result will be Max Z = FBX Y, Max -Y = FBX Z, Max X = FBX X => final order -X -Z Y
|
||||
Option 1: convert vertices and transformations as -X,-Z,Y and set FBX options as "Z-up".
|
||||
Option 1: export vertices and transformations as -X,-Z,Y and set FBX options as "Z-up".
|
||||
The -90 rotation exported from Unity will bring the model in correct orientation.
|
||||
Option 2: convert vertices and transformations as -X,-Y,-Z, add -90 PreRotation to every Mesh Node and set FBX options as "Y-up".
|
||||
Option 2: export vertices and transformations as -X,-Y,-Z, add -90 PreRotation to every Mesh Node and set FBX options as "Y-up".
|
||||
The -90 rotation from Unity plus the -90 PreRotation will bring the model in correct orientation.
|
||||
Remember though that the PreRotation is baked into the Geometry.
|
||||
|
||||
@@ -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.
|
||||
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.
|
||||
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<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 uint m_VertexCount;
|
||||
private uint[] m_IndexBuffer;
|
||||
private ChannelInfo[] m_Channels;
|
||||
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_Normals;
|
||||
public float[] m_Colors;
|
||||
@@ -130,6 +133,12 @@ namespace Unity_Studio
|
||||
public uint vertexCount;
|
||||
}
|
||||
|
||||
public class BoneInfluence
|
||||
{
|
||||
public float weight;
|
||||
public int boneIndex;
|
||||
}
|
||||
|
||||
public class ChannelInfo
|
||||
{
|
||||
public byte stream;
|
||||
@@ -150,7 +159,7 @@ namespace Unity_Studio
|
||||
|
||||
public class PackedBitVector
|
||||
{
|
||||
public uint m_NumItems;
|
||||
public int m_NumItems;
|
||||
public float m_Range = 1.0f;
|
||||
public float m_Start = 0.0f;
|
||||
public byte[] m_Data;
|
||||
@@ -362,6 +371,7 @@ namespace Unity_Studio
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region subMeshes
|
||||
int m_SubMeshes_size = a_Stream.ReadInt32();
|
||||
for (int s = 0; s < m_SubMeshes_size; s++)
|
||||
{
|
||||
@@ -380,52 +390,64 @@ namespace Unity_Studio
|
||||
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();
|
||||
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
|
||||
bool stop = true;
|
||||
}
|
||||
else //4.3.0 and later
|
||||
for (int s = 0; s < m_Shapes_size; s++) //untested
|
||||
{
|
||||
int m_ShapeVertices_size = a_Stream.ReadInt32();
|
||||
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
|
||||
|
||||
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();
|
||||
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
|
||||
}
|
||||
#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
|
||||
|
||||
@@ -454,7 +476,7 @@ namespace Unity_Studio
|
||||
{
|
||||
m_IndexBuffer = new uint[m_IndexBuffer_size / 4];
|
||||
for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt32(); }
|
||||
//align??
|
||||
a_Stream.AlignStream(4);//untested
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
@@ -462,15 +484,36 @@ namespace Unity_Studio
|
||||
#region Vertex Buffer for 3.4.2 and earlier
|
||||
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];
|
||||
for (int v = 0; v < m_VertexCount * 3; v++) { m_Vertices[v] = a_Stream.ReadSingle(); }
|
||||
|
||||
int m_Skin_size = a_Stream.ReadInt32();
|
||||
a_Stream.Position += m_Skin_size * 32; //4x float weights & 4x int boneIndices
|
||||
m_Skin = new List<BoneInfluence>[a_Stream.ReadInt32()];
|
||||
//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();
|
||||
a_Stream.Position += m_BindPose_size * 16 * 4; //matrix 4x4
|
||||
/*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];
|
||||
}*/
|
||||
}
|
||||
|
||||
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();
|
||||
m_UV1 = new float[m_UV1_size * 2];
|
||||
@@ -507,19 +550,41 @@ namespace Unity_Studio
|
||||
else
|
||||
{
|
||||
#region read vertex stream
|
||||
int m_Skin_size = a_Stream.ReadInt32();
|
||||
a_Stream.Position += m_Skin_size * 32; //4x float weights & 4x int boneIndices
|
||||
|
||||
if (version[0] <= 3 || (version[0] == 4 && version[1] <= 2))
|
||||
m_Skin = new List<BoneInfluence>[a_Stream.ReadInt32()];
|
||||
//m_Skin = new Dictionary<int, float>[a_Stream.ReadInt32()];
|
||||
for (int s = 0; s < m_Skin.Length; s++)
|
||||
{
|
||||
int m_BindPose_size = a_Stream.ReadInt32();
|
||||
a_Stream.Position += m_BindPose_size * 16 * 4; //matrix 4x4
|
||||
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(); }
|
||||
|
||||
/*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 (m_MeshCompression != 0 && version[2] == 0) //special case not just on platform 9
|
||||
@@ -540,10 +605,11 @@ namespace Unity_Studio
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
#region 4.0.0 and later
|
||||
#region channels and streams for 4.0.0 and later
|
||||
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()];
|
||||
for (int c = 0; c < m_Channels.Length; c++)
|
||||
@@ -555,7 +621,9 @@ namespace Unity_Studio
|
||||
m_Channels[c].dimension = a_Stream.ReadByte();
|
||||
|
||||
//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)
|
||||
@@ -571,13 +639,21 @@ namespace Unity_Studio
|
||||
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[0] = new StreamInfo();
|
||||
m_Streams[0].channelMask = new BitArray(new int[1] { m_CurrentChannels });
|
||||
m_Streams[0].offset = 0;
|
||||
m_Streams[0].stride = singleStreamStride;
|
||||
m_Streams = new StreamInfo[streamCount];
|
||||
for (int s = 0; s < streamCount; s++)
|
||||
{
|
||||
m_Streams[s] = new StreamInfo();
|
||||
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
|
||||
@@ -588,15 +664,15 @@ namespace Unity_Studio
|
||||
#endregion
|
||||
|
||||
#region compute FvF
|
||||
int valueBufferSize = 0;
|
||||
byte[] valueBuffer;
|
||||
float[] dstArray;
|
||||
int componentByteSize = 0;
|
||||
byte[] componentBytes;
|
||||
float[] componentsArray;
|
||||
|
||||
#region 4.0.0 and later
|
||||
if (m_Channels != null)
|
||||
{
|
||||
//it is better to loop channels instead of streams
|
||||
//because channels are likely to be sorted by vertex property
|
||||
#region 4.0.0 and later
|
||||
foreach (var m_Channel in m_Channels)
|
||||
{
|
||||
if (m_Channel.dimension > 0)
|
||||
@@ -605,12 +681,13 @@ namespace Unity_Studio
|
||||
|
||||
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
|
||||
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)
|
||||
{
|
||||
@@ -626,51 +703,39 @@ namespace Unity_Studio
|
||||
break;
|
||||
}*/
|
||||
|
||||
valueBuffer = new byte[valueBufferSize];
|
||||
dstArray = new float[m_VertexCount * m_Channel.dimension];
|
||||
componentBytes = new byte[componentByteSize];
|
||||
componentsArray = new float[m_VertexCount * m_Channel.dimension];
|
||||
|
||||
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++)
|
||||
{
|
||||
int m_DataSizeOffset = m_Stream.offset + m_Channel.offset + m_Stream.stride * v + valueBufferSize * d;
|
||||
Buffer.BlockCopy(m_DataSize, m_DataSizeOffset, valueBuffer, 0, valueBufferSize);
|
||||
dstArray[v * m_Channel.dimension + d] = bytesToFloat(valueBuffer);
|
||||
int componentOffset = vertexOffset + componentByteSize * d;
|
||||
Buffer.BlockCopy(m_DataSize, componentOffset, componentBytes, 0, componentByteSize);
|
||||
componentsArray[v * m_Channel.dimension + d] = bytesToFloat(componentBytes);
|
||||
}
|
||||
}
|
||||
|
||||
switch (b)
|
||||
{
|
||||
case 0:
|
||||
m_Vertices = dstArray;
|
||||
break;
|
||||
case 1:
|
||||
m_Normals = dstArray;
|
||||
break;
|
||||
case 2:
|
||||
m_Colors = dstArray;
|
||||
break;
|
||||
case 3:
|
||||
m_UV1 = dstArray;
|
||||
break;
|
||||
case 4:
|
||||
m_UV2 = dstArray;
|
||||
break;
|
||||
case 0: m_Vertices = componentsArray; break;
|
||||
case 1: m_Normals = componentsArray; break;
|
||||
case 2: m_Colors = componentsArray; break;
|
||||
case 3: m_UV1 = componentsArray; break;
|
||||
case 4: m_UV2 = componentsArray; break;
|
||||
case 5:
|
||||
if (version[0] == 5) { m_UV3 = dstArray; }
|
||||
else { m_Tangents = dstArray; }
|
||||
break;
|
||||
case 6:
|
||||
m_UV4 = dstArray;
|
||||
break;
|
||||
case 7:
|
||||
m_Tangents = dstArray;
|
||||
if (version[0] == 5) { m_UV3 = componentsArray; }
|
||||
else { m_Tangents = componentsArray; }
|
||||
break;
|
||||
case 6: m_UV4 = componentsArray; break;
|
||||
case 7: m_Tangents = componentsArray; break;
|
||||
}
|
||||
|
||||
m_Stream.channelMask.Set(b, false); //is this needed?
|
||||
valueBuffer = null;
|
||||
dstArray = null;
|
||||
m_Stream.channelMask.Set(b, false);
|
||||
m_CurrentChannels.Set(b, false);
|
||||
componentBytes = null;
|
||||
componentsArray = null;
|
||||
break; //go to next channel
|
||||
}
|
||||
}
|
||||
@@ -697,63 +762,52 @@ namespace Unity_Studio
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
valueBufferSize = 4;
|
||||
componentByteSize = 4;
|
||||
m_Channel.dimension = 3;
|
||||
break;
|
||||
case 2:
|
||||
valueBufferSize = 1;
|
||||
componentByteSize = 1;
|
||||
m_Channel.dimension = 4;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
valueBufferSize = 4;
|
||||
componentByteSize = 4;
|
||||
m_Channel.dimension = 2;
|
||||
break;
|
||||
case 5:
|
||||
valueBufferSize = 4;
|
||||
componentByteSize = 4;
|
||||
m_Channel.dimension = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
valueBuffer = new byte[valueBufferSize];
|
||||
dstArray = new float[m_VertexCount * m_Channel.dimension];
|
||||
componentBytes = new byte[componentByteSize];
|
||||
componentsArray = new float[m_VertexCount * m_Channel.dimension];
|
||||
|
||||
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++)
|
||||
{
|
||||
int m_DataSizeOffset = m_Stream.offset + m_Channel.offset + m_Stream.stride * v + valueBufferSize * d;
|
||||
Buffer.BlockCopy(m_DataSize, m_DataSizeOffset, valueBuffer, 0, valueBufferSize);
|
||||
dstArray[v * m_Channel.dimension + d] = bytesToFloat(valueBuffer);
|
||||
int m_DataSizeOffset = vertexOffset + componentByteSize * d;
|
||||
Buffer.BlockCopy(m_DataSize, m_DataSizeOffset, componentBytes, 0, componentByteSize);
|
||||
componentsArray[v * m_Channel.dimension + d] = bytesToFloat(componentBytes);
|
||||
}
|
||||
}
|
||||
|
||||
switch (b)
|
||||
{
|
||||
case 0:
|
||||
m_Vertices = dstArray;
|
||||
break;
|
||||
case 1:
|
||||
m_Normals = dstArray;
|
||||
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;
|
||||
case 0: m_Vertices = componentsArray; break;
|
||||
case 1: m_Normals = componentsArray; break;
|
||||
case 2: m_Colors = componentsArray; break;
|
||||
case 3: m_UV1 = componentsArray; break;
|
||||
case 4: m_UV2 = componentsArray; break;
|
||||
case 5: m_Tangents = componentsArray; break;
|
||||
}
|
||||
|
||||
m_Channel.offset += (byte)(m_Channel.dimension * valueBufferSize); //strides larger than 255 are unlikely
|
||||
m_Stream.channelMask.Set(b, false); //is this needed?
|
||||
valueBuffer = null;
|
||||
dstArray = null;
|
||||
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);
|
||||
componentBytes = null;
|
||||
componentsArray = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -767,8 +821,10 @@ namespace Unity_Studio
|
||||
if (version[0] >= 3 || (version[0] == 2 && version[1] >= 6))
|
||||
{
|
||||
//remember there can be combinations of packed and regular vertex properties
|
||||
|
||||
#region m_Vertices
|
||||
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_Start = a_Stream.ReadSingle();
|
||||
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];
|
||||
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
|
||||
m_UV_Packed.m_NumItems = a_Stream.ReadUInt32();
|
||||
#region m_UV
|
||||
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_Start = a_Stream.ReadSingle();
|
||||
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();
|
||||
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);
|
||||
int bitmax = 0;
|
||||
@@ -810,7 +868,7 @@ namespace Unity_Studio
|
||||
|
||||
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)
|
||||
@@ -818,7 +876,7 @@ namespace Unity_Studio
|
||||
m_UV2 = new float[m_VertexCount * 2];
|
||||
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)
|
||||
@@ -826,7 +884,7 @@ namespace Unity_Studio
|
||||
m_UV3 = new float[m_VertexCount * 2];
|
||||
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)
|
||||
@@ -834,17 +892,19 @@ namespace Unity_Studio
|
||||
m_UV4 = new float[m_VertexCount * 2];
|
||||
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)
|
||||
{
|
||||
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_Start = a_Stream.ReadSingle();
|
||||
m_BindPoses_Packed.m_Data = new byte[a_Stream.ReadInt32()];
|
||||
@@ -852,10 +912,32 @@ namespace Unity_Studio
|
||||
a_Stream.AlignStream(4);
|
||||
m_BindPoses_Packed.m_BitSize = a_Stream.ReadByte();
|
||||
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();
|
||||
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_Start = a_Stream.ReadSingle();
|
||||
m_Normals_Packed.m_Data = new byte[a_Stream.ReadInt32()];
|
||||
@@ -865,7 +947,7 @@ namespace Unity_Studio
|
||||
a_Stream.Position += 3; //4 byte alignment
|
||||
|
||||
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_Start = a_Stream.ReadSingle();
|
||||
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();
|
||||
a_Stream.Position += 3; //4 byte alignment
|
||||
|
||||
PackedBitVector m_Weights_Packed = new PackedBitVector();
|
||||
m_Weights_Packed.m_NumItems = a_Stream.ReadUInt32();
|
||||
m_Weights_Packed.m_Data = new byte[a_Stream.ReadInt32()];
|
||||
a_Stream.Read(m_Weights_Packed.m_Data, 0, m_Weights_Packed.m_Data.Length);
|
||||
PackedBitVector m_Weights = new PackedBitVector();
|
||||
m_Weights.m_NumItems = a_Stream.ReadInt32();
|
||||
m_Weights.m_Data = new byte[a_Stream.ReadInt32()];
|
||||
a_Stream.Read(m_Weights.m_Data, 0, m_Weights.m_Data.Length);
|
||||
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
|
||||
|
||||
#region m_Normals
|
||||
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()];
|
||||
a_Stream.Read(m_NormalSigns_packed.m_Data, 0, m_NormalSigns_packed.m_Data.Length);
|
||||
a_Stream.AlignStream(4);
|
||||
m_NormalSigns_packed.m_BitSize = a_Stream.ReadByte();
|
||||
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_NormalSigns = UnpackBitVector(m_NormalSigns_packed);
|
||||
@@ -905,19 +988,39 @@ namespace Unity_Studio
|
||||
if (m_NormalSigns[v] == 0) { m_Normals[v * 3 + 2] *= -1; }
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
PackedBitVector m_TangentSigns = new PackedBitVector();
|
||||
m_TangentSigns.m_NumItems = a_Stream.ReadUInt32();
|
||||
m_TangentSigns.m_Data = new byte[a_Stream.ReadInt32()];
|
||||
a_Stream.Read(m_TangentSigns.m_Data, 0, m_TangentSigns.m_Data.Length);
|
||||
#region m_Tangents
|
||||
PackedBitVector m_TangentSigns_packed = new PackedBitVector();
|
||||
m_TangentSigns_packed.m_NumItems = a_Stream.ReadInt32();
|
||||
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);
|
||||
m_TangentSigns.m_BitSize = a_Stream.ReadByte();
|
||||
m_TangentSigns_packed.m_BitSize = a_Stream.ReadByte();
|
||||
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)
|
||||
{
|
||||
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_Start = a_Stream.ReadSingle();
|
||||
m_FloatColors.m_Data = new byte[a_Stream.ReadInt32()];
|
||||
@@ -926,7 +1029,7 @@ namespace Unity_Studio
|
||||
m_FloatColors.m_BitSize = a_Stream.ReadByte();
|
||||
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);
|
||||
int bitmax = 0;
|
||||
@@ -940,17 +1043,41 @@ namespace Unity_Studio
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region m_Skin
|
||||
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()];
|
||||
a_Stream.Read(m_BoneIndices.m_Data, 0, m_BoneIndices.m_Data.Length);
|
||||
a_Stream.AlignStream(4);
|
||||
m_BoneIndices.m_BitSize = a_Stream.ReadByte();
|
||||
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();
|
||||
m_Triangles.m_NumItems = a_Stream.ReadUInt32();
|
||||
m_Triangles.m_NumItems = 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.AlignStream(4);
|
||||
@@ -980,7 +1107,7 @@ namespace Unity_Studio
|
||||
if (version[0] < 5)
|
||||
{
|
||||
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()];
|
||||
a_Stream.Read(m_Colors_Packed.m_Data, 0, m_Colors_Packed.m_Data.Length);
|
||||
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
|
||||
}
|
||||
@@ -39,7 +39,7 @@ namespace Unity_Studio
|
||||
else if (sourceFile.version[0] == 3 && sourceFile.version[1] <= 4) { }
|
||||
else { int accelerometerFrequency = a_Stream.ReadInt32(); }//3.5.0 and up
|
||||
}
|
||||
|
||||
//fail in Unity 5 beta
|
||||
companyName = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
|
||||
productName = a_Stream.ReadAlignedString(a_Stream.ReadInt32());
|
||||
}
|
||||
@@ -15,6 +15,7 @@ namespace Unity_Studio
|
||||
public ushort m_LightmapIndexDynamic;
|
||||
public PPtr[] m_Materials;
|
||||
public PPtr m_Mesh;
|
||||
public PPtr[] m_Bones;
|
||||
|
||||
public SkinnedMeshRenderer(AssetPreloadData preloadData)
|
||||
{
|
||||
@@ -98,28 +99,38 @@ namespace Unity_Studio
|
||||
|
||||
m_Mesh = sourceFile.ReadPPtr();
|
||||
|
||||
/*int m_Bones_size = a_Stream.ReadInt32();
|
||||
for (int b = 0; b < m_Bones_size; b++)
|
||||
m_Bones = new PPtr[a_Stream.ReadInt32()];
|
||||
for (int b = 0; b < m_Bones.Length; b++)
|
||||
{
|
||||
PPtr aBone = sourceFile.ReadPPtr();
|
||||
m_Bones[b] = sourceFile.ReadPPtr();
|
||||
}
|
||||
|
||||
if (version[0] < 3)
|
||||
{
|
||||
int m_BindPose_size = a_Stream.ReadInt32();
|
||||
a_Stream.Position += m_BindPose_size * 16 * 4;//Matrix4x4f
|
||||
int m_BindPose = a_Stream.ReadInt32();
|
||||
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();
|
||||
}
|
||||
//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();
|
||||
}*/
|
||||
|
||||
if (version[0] >= 4 || (version[0] == 3 && version[1] >= 4))
|
||||
{
|
||||
//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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,7 @@
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>unity.ico</ApplicationIcon>
|
||||
<ApplicationIcon>Resources\unity.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
@@ -128,57 +128,52 @@
|
||||
<DependentUpon>AboutBox.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="AssetPreloadData.cs" />
|
||||
<Compile Include="AudioClip.cs" />
|
||||
<Compile Include="BuildSettings.cs" />
|
||||
<Compile Include="Unity Classes\AudioClip.cs" />
|
||||
<Compile Include="Unity Classes\BuildSettings.cs" />
|
||||
<Compile Include="BundleFile.cs" />
|
||||
<Compile Include="ClassIDReference.cs" />
|
||||
<Compile Include="EndianStream.cs" />
|
||||
<Compile Include="FBXExport.cs">
|
||||
<Compile Include="ExportOptions.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FBXExport.Designer.cs">
|
||||
<DependentUpon>FBXExport.cs</DependentUpon>
|
||||
<Compile Include="ExportOptions.Designer.cs">
|
||||
<DependentUpon>ExportOptions.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Font.cs" />
|
||||
<Compile Include="FMOD Studio API\fmod.cs" />
|
||||
<Compile Include="FMOD Studio API\fmod_dsp.cs" />
|
||||
<Compile Include="FMOD Studio API\fmod_errors.cs" />
|
||||
<Compile Include="Unity Classes\Font.cs" />
|
||||
<Compile Include="GOHierarchy.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Lz4DecoderStream.cs" />
|
||||
<Compile Include="Material.cs" />
|
||||
<Compile Include="Mesh.cs" />
|
||||
<Compile Include="FMOD\fmod.cs" />
|
||||
<Compile Include="FMOD\fmod_dsp.cs" />
|
||||
<Compile Include="FMOD\fmod_errors.cs" />
|
||||
<Compile Include="FMOD\fmod_memoryinfo.cs" />
|
||||
<Compile Include="GameObject.cs" />
|
||||
<Compile Include="Unity Classes\Material.cs" />
|
||||
<Compile Include="Unity Classes\Mesh.cs" />
|
||||
<Compile Include="Unity Classes\GameObject.cs" />
|
||||
<Compile Include="helpers.cs" />
|
||||
<Compile Include="PlayerSettings.cs" />
|
||||
<Compile Include="RectTransform.cs" />
|
||||
<Compile Include="Renderer.cs" />
|
||||
<Compile Include="SkinnedMeshRenderer.cs" />
|
||||
<Compile Include="MeshFilter.cs" />
|
||||
<Compile Include="TextAsset.cs" />
|
||||
<Compile Include="Texture2D.cs" />
|
||||
<Compile Include="Transform.cs" />
|
||||
<Compile Include="Unity Classes\PlayerSettings.cs" />
|
||||
<Compile Include="Unity Classes\RectTransform.cs" />
|
||||
<Compile Include="Unity Classes\Renderer.cs" />
|
||||
<Compile Include="Unity Classes\SkinnedMeshRenderer.cs" />
|
||||
<Compile Include="Unity Classes\MeshFilter.cs" />
|
||||
<Compile Include="Unity Classes\TextAsset.cs" />
|
||||
<Compile Include="Unity Classes\Texture2D.cs" />
|
||||
<Compile Include="Unity Classes\Transform.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="AssetsFile.cs" />
|
||||
<Compile Include="UnityStudioForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="UnityStudioForm.Designer.cs">
|
||||
<DependentUpon>UnityStudioForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="AssetsFile.cs" />
|
||||
<EmbeddedResource Include="AboutBox.resx">
|
||||
<DependentUpon>AboutBox.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="FBXExport.resx">
|
||||
<DependentUpon>FBXExport.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="UnityStudioForm.resx">
|
||||
<DependentUpon>UnityStudioForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
<EmbeddedResource Include="ExportOptions.resx">
|
||||
<DependentUpon>ExportOptions.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
@@ -190,6 +185,10 @@
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="UnityStudioForm.resx">
|
||||
<DependentUpon>UnityStudioForm.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<None Include="app.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
@@ -220,8 +219,15 @@
|
||||
</BootstrapperPackage>
|
||||
</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 />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
||||
41
Unity Studio/UnityStudioForm.Designer.cs
generated
41
Unity Studio/UnityStudioForm.Designer.cs
generated
@@ -62,7 +62,6 @@
|
||||
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
||||
this.tabPage1 = new System.Windows.Forms.TabPage();
|
||||
this.sceneTreeView = new Unity_Studio.GOHierarchy();
|
||||
this.treeSearch = new System.Windows.Forms.TextBox();
|
||||
this.tabPage2 = new System.Windows.Forms.TabPage();
|
||||
this.assetListView = new System.Windows.Forms.ListView();
|
||||
@@ -75,6 +74,7 @@
|
||||
this.previewPanel = new System.Windows.Forms.Panel();
|
||||
this.assetInfoLabel = new System.Windows.Forms.Label();
|
||||
this.FMODpanel = new System.Windows.Forms.Panel();
|
||||
this.FMODcopyright = new System.Windows.Forms.Label();
|
||||
this.FMODinfoLabel = new System.Windows.Forms.Label();
|
||||
this.FMODtimerLabel = new System.Windows.Forms.Label();
|
||||
this.FMODstatusLabel = new System.Windows.Forms.Label();
|
||||
@@ -100,6 +100,7 @@
|
||||
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
|
||||
this.saveFolderDialog1 = new System.Windows.Forms.SaveFileDialog();
|
||||
this.treeTip = new System.Windows.Forms.ToolTip(this.components);
|
||||
this.sceneTreeView = new Unity_Studio.GOHierarchy();
|
||||
this.menuStrip1.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
|
||||
this.splitContainer1.Panel1.SuspendLayout();
|
||||
@@ -390,8 +391,6 @@
|
||||
this.splitContainer1.SplitterDistance = 420;
|
||||
this.splitContainer1.TabIndex = 2;
|
||||
this.splitContainer1.TabStop = false;
|
||||
this.splitContainer1.SplitterMoved += new System.Windows.Forms.SplitterEventHandler(this.splitContainer1_SplitterMoved);
|
||||
this.splitContainer1.Resize += new System.EventHandler(this.splitContainer1_Resize);
|
||||
//
|
||||
// tabControl1
|
||||
//
|
||||
@@ -418,17 +417,6 @@
|
||||
this.tabPage1.Text = "Scene Hierarchy";
|
||||
this.tabPage1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// sceneTreeView
|
||||
//
|
||||
this.sceneTreeView.CheckBoxes = true;
|
||||
this.sceneTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.sceneTreeView.HideSelection = false;
|
||||
this.sceneTreeView.Location = new System.Drawing.Point(0, 20);
|
||||
this.sceneTreeView.Name = "sceneTreeView";
|
||||
this.sceneTreeView.Size = new System.Drawing.Size(410, 588);
|
||||
this.sceneTreeView.TabIndex = 1;
|
||||
this.sceneTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.sceneTreeView_AfterCheck);
|
||||
//
|
||||
// treeSearch
|
||||
//
|
||||
this.treeSearch.Dock = System.Windows.Forms.DockStyle.Top;
|
||||
@@ -454,6 +442,7 @@
|
||||
this.tabPage2.TabIndex = 1;
|
||||
this.tabPage2.Text = "Asset List";
|
||||
this.tabPage2.UseVisualStyleBackColor = true;
|
||||
this.tabPage2.Resize += new System.EventHandler(this.tabPage2_Resize);
|
||||
//
|
||||
// assetListView
|
||||
//
|
||||
@@ -490,6 +479,7 @@
|
||||
// columnHeaderSize
|
||||
//
|
||||
this.columnHeaderSize.Text = "Size";
|
||||
this.columnHeaderSize.Width = 23;
|
||||
//
|
||||
// listSearch
|
||||
//
|
||||
@@ -552,6 +542,7 @@
|
||||
//
|
||||
this.FMODpanel.Anchor = System.Windows.Forms.AnchorStyles.None;
|
||||
this.FMODpanel.BackColor = System.Drawing.SystemColors.ControlDark;
|
||||
this.FMODpanel.Controls.Add(this.FMODcopyright);
|
||||
this.FMODpanel.Controls.Add(this.FMODinfoLabel);
|
||||
this.FMODpanel.Controls.Add(this.FMODtimerLabel);
|
||||
this.FMODpanel.Controls.Add(this.FMODstatusLabel);
|
||||
@@ -567,6 +558,16 @@
|
||||
this.FMODpanel.TabIndex = 2;
|
||||
this.FMODpanel.Visible = false;
|
||||
//
|
||||
// FMODcopyright
|
||||
//
|
||||
this.FMODcopyright.AutoSize = true;
|
||||
this.FMODcopyright.ForeColor = System.Drawing.SystemColors.ControlLight;
|
||||
this.FMODcopyright.Location = new System.Drawing.Point(117, 187);
|
||||
this.FMODcopyright.Name = "FMODcopyright";
|
||||
this.FMODcopyright.Size = new System.Drawing.Size(283, 13);
|
||||
this.FMODcopyright.TabIndex = 9;
|
||||
this.FMODcopyright.Text = "Audio Engine supplied by FMOD by Firelight Technologies.";
|
||||
//
|
||||
// FMODinfoLabel
|
||||
//
|
||||
this.FMODinfoLabel.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
||||
@@ -801,6 +802,17 @@
|
||||
this.saveFolderDialog1.RestoreDirectory = true;
|
||||
this.saveFolderDialog1.Title = "Browse for folder";
|
||||
//
|
||||
// sceneTreeView
|
||||
//
|
||||
this.sceneTreeView.CheckBoxes = true;
|
||||
this.sceneTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.sceneTreeView.HideSelection = false;
|
||||
this.sceneTreeView.Location = new System.Drawing.Point(0, 20);
|
||||
this.sceneTreeView.Name = "sceneTreeView";
|
||||
this.sceneTreeView.Size = new System.Drawing.Size(410, 588);
|
||||
this.sceneTreeView.TabIndex = 1;
|
||||
this.sceneTreeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.sceneTreeView_AfterCheck);
|
||||
//
|
||||
// UnityStudioForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
@@ -917,6 +929,7 @@
|
||||
private System.Windows.Forms.TextBox classTextBox;
|
||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
|
||||
private System.Windows.Forms.ToolStripMenuItem exportClassStructuresMenuItem;
|
||||
private System.Windows.Forms.Label FMODcopyright;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -43,6 +43,12 @@
|
||||
<setting name="showExpOpt" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="exportDeformers" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="convertDummies" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
</Unity_Studio.Properties.Settings>
|
||||
</userSettings>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
|
||||
|
||||
Reference in New Issue
Block a user