diff --git a/Unity Studio/OpenFolderDialog.cs b/Unity Studio/OpenFolderDialog.cs index 2cacc77..3acb6a1 100644 --- a/Unity Studio/OpenFolderDialog.cs +++ b/Unity Studio/OpenFolderDialog.cs @@ -39,24 +39,21 @@ namespace Unity_Studio private DialogResult ShowVistaDialog(IWin32Window owner) { var frm = (NativeMethods.IFileDialog)(new NativeMethods.FileOpenDialogRCW()); - uint options; - frm.GetOptions(out options); + frm.GetOptions(out var options); options |= NativeMethods.FOS_PICKFOLDERS | NativeMethods.FOS_FORCEFILESYSTEM | NativeMethods.FOS_NOVALIDATE | NativeMethods.FOS_NOTESTFILECREATE | NativeMethods.FOS_DONTADDTORECENT; frm.SetOptions(options); if (this.InitialFolder != null) { - NativeMethods.IShellItem directoryShellItem; var riid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IShellItem - if (NativeMethods.SHCreateItemFromParsingName(this.InitialFolder, IntPtr.Zero, ref riid, out directoryShellItem) == NativeMethods.S_OK) + if (NativeMethods.SHCreateItemFromParsingName(this.InitialFolder, IntPtr.Zero, ref riid, out var directoryShellItem) == NativeMethods.S_OK) { frm.SetFolder(directoryShellItem); } } if (this.DefaultFolder != null) { - NativeMethods.IShellItem directoryShellItem; var riid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IShellItem - if (NativeMethods.SHCreateItemFromParsingName(this.DefaultFolder, IntPtr.Zero, ref riid, out directoryShellItem) == NativeMethods.S_OK) + if (NativeMethods.SHCreateItemFromParsingName(this.DefaultFolder, IntPtr.Zero, ref riid, out var directoryShellItem) == NativeMethods.S_OK) { frm.SetDefaultFolder(directoryShellItem); } @@ -64,11 +61,9 @@ namespace Unity_Studio if (frm.Show(owner.Handle) == NativeMethods.S_OK) { - NativeMethods.IShellItem shellItem; - if (frm.GetResult(out shellItem) == NativeMethods.S_OK) + if (frm.GetResult(out var shellItem) == NativeMethods.S_OK) { - IntPtr pszString; - if (shellItem.GetDisplayName(NativeMethods.SIGDN_FILESYSPATH, out pszString) == NativeMethods.S_OK) + if (shellItem.GetDisplayName(NativeMethods.SIGDN_FILESYSPATH, out var pszString) == NativeMethods.S_OK) { if (pszString != IntPtr.Zero) { diff --git a/Unity Studio/Unity Classes/AudioClip.cs b/Unity Studio/Unity Classes/AudioClip.cs index 16fb1da..f8c9a44 100644 --- a/Unity Studio/Unity Classes/AudioClip.cs +++ b/Unity Studio/Unity Classes/AudioClip.cs @@ -112,8 +112,7 @@ namespace Unity_Studio } else { - EndianBinaryReader estream; - if (UnityStudio.assetsfileandstream.TryGetValue(Path.GetFileName(m_Source), out estream)) + if (UnityStudio.assetsfileandstream.TryGetValue(Path.GetFileName(m_Source), out var estream)) { estream.Position = m_Offset; m_AudioData = estream.ReadBytes((int)m_Size); diff --git a/Unity Studio/Unity Classes/Material.cs b/Unity Studio/Unity Classes/Material.cs index 6343243..c1d1772 100644 --- a/Unity Studio/Unity Classes/Material.cs +++ b/Unity Studio/Unity Classes/Material.cs @@ -42,7 +42,7 @@ namespace Unity_Studio } else if (sourceFile.version[0] >= 5)//5.0 and up { - m_ShaderKeywords = new string[1] { a_Stream.ReadAlignedString(a_Stream.ReadInt32()) }; + m_ShaderKeywords = new[] { a_Stream.ReadAlignedString(a_Stream.ReadInt32()) }; uint m_LightmapFlags = a_Stream.ReadUInt32(); if (sourceFile.version[0] == 5 && sourceFile.version[1] >= 6 || sourceFile.version[0] > 5)//5.6.0 and up { @@ -59,7 +59,7 @@ namespace Unity_Studio string[][] stringTagMap = new string[a_Stream.ReadInt32()][]; for (int i = 0; i < stringTagMap.Length; i++) { - stringTagMap[i] = new string[2] { a_Stream.ReadAlignedString(a_Stream.ReadInt32()), a_Stream.ReadAlignedString(a_Stream.ReadInt32()) }; + stringTagMap[i] = new[] { a_Stream.ReadAlignedString(a_Stream.ReadInt32()), a_Stream.ReadAlignedString(a_Stream.ReadInt32()) }; } } //disabledShaderPasses @@ -79,8 +79,8 @@ namespace Unity_Studio { name = a_Stream.ReadAlignedString(a_Stream.ReadInt32()), m_Texture = sourceFile.ReadPPtr(), - m_Scale = new float[2] { a_Stream.ReadSingle(), a_Stream.ReadSingle() }, - m_Offset = new float[2] { a_Stream.ReadSingle(), a_Stream.ReadSingle() } + m_Scale = new[] { a_Stream.ReadSingle(), a_Stream.ReadSingle() }, + m_Offset = new[] { a_Stream.ReadSingle(), a_Stream.ReadSingle() } }; m_TexEnvs[i] = m_TexEnv; } @@ -102,7 +102,7 @@ namespace Unity_Studio strColorPair m_Color = new strColorPair() { first = a_Stream.ReadAlignedString(a_Stream.ReadInt32()), - second = new float[4] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() } + second = new[] { a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle(), a_Stream.ReadSingle() } }; m_Colors[i] = m_Color; } diff --git a/Unity Studio/Unity Classes/Mesh.cs b/Unity Studio/Unity Classes/Mesh.cs index 74de339..a408d8d 100644 --- a/Unity Studio/Unity Classes/Mesh.cs +++ b/Unity Studio/Unity Classes/Mesh.cs @@ -100,162 +100,162 @@ So it would "fix" meshes that were originally sourced form FBX, but would still namespace Unity_Studio { - public class Mesh - { - private EndianBinaryReader a_Stream; - public string m_Name; - public List m_SubMeshes = new List(); - public List m_Indices = new List(); //use a list because I don't always know the facecount for triangle strips - public List m_materialIDs = new List(); - private uint[] m_IndexBuffer; - private ChannelInfo[] m_Channels; - private StreamInfo[] m_Streams; - public List[] m_Skin; - //public Dictionary[] m_Skin; - public float[][,] m_BindPose; - public int m_VertexCount; - public float[] m_Vertices; - public float[] m_Normals; - public float[] m_Colors; - public float[] m_UV1; - public float[] m_UV2; - public float[] m_UV3; - public float[] m_UV4; - public float[] m_Tangents; + public class Mesh + { + private EndianBinaryReader a_Stream; + public string m_Name; + public List m_SubMeshes = new List(); + public List m_Indices = new List(); //use a list because I don't always know the facecount for triangle strips + public List m_materialIDs = new List(); + private uint[] m_IndexBuffer; + private ChannelInfo[] m_Channels; + private StreamInfo[] m_Streams; + public List[] m_Skin; + //public Dictionary[] m_Skin; + public float[][,] m_BindPose; + public int m_VertexCount; + public float[] m_Vertices; + public float[] m_Normals; + public float[] m_Colors; + public float[] m_UV1; + public float[] m_UV2; + public float[] m_UV3; + public float[] m_UV4; + public float[] m_Tangents; - public class SubMesh - { - public uint firstByte; - public uint indexCount; - public int topology; - public uint triangleCount; - public uint firstVertex; - public uint vertexCount; - } + public class SubMesh + { + public uint firstByte; + public uint indexCount; + public int topology; + public uint triangleCount; + public uint firstVertex; + public uint vertexCount; + } - public class BoneInfluence - { - public float weight; - public int boneIndex; - } + public class BoneInfluence + { + public float weight; + public int boneIndex; + } - public class ChannelInfo - { - public byte stream; - public byte offset; - public byte format; - public byte dimension; - } + public class ChannelInfo + { + public byte stream; + public byte offset; + public byte format; + public byte dimension; + } - public class StreamInfo - { - public BitArray channelMask; - public int offset; - public int stride; - public uint align; //3.5.0 - 3.5.7 - public byte dividerOp; //4.0.0 and later - public ushort frequency; - } + public class StreamInfo + { + public BitArray channelMask; + public int offset; + public int stride; + public uint align; //3.5.0 - 3.5.7 + public byte dividerOp; //4.0.0 and later + public ushort frequency; + } - public class PackedBitVector - { - public int m_NumItems; - public float m_Range = 1.0f; - public float m_Start; - public byte[] m_Data; - public byte m_BitSize; - } + public class PackedBitVector + { + public int m_NumItems; + public float m_Range = 1.0f; + public float m_Start; + public byte[] m_Data; + public byte m_BitSize; + } - public float bytesToFloat (byte[] inputBytes) - { - float result = 0; - if (a_Stream.endian == EndianType.BigEndian) { Array.Reverse(inputBytes); } + public float bytesToFloat(byte[] inputBytes) + { + float result = 0; + if (a_Stream.endian == EndianType.BigEndian) { Array.Reverse(inputBytes); } - switch (inputBytes.Length) - { - case 1: - result = inputBytes[0] / 255.0f; - break; - case 2: - result = Half.ToHalf(inputBytes, 0); - break; - case 4: - result = BitConverter.ToSingle(inputBytes, 0); - break; - } + switch (inputBytes.Length) + { + case 1: + result = inputBytes[0] / 255.0f; + break; + case 2: + result = Half.ToHalf(inputBytes, 0); + break; + case 4: + result = BitConverter.ToSingle(inputBytes, 0); + break; + } - return result; - } + return result; + } - public uint[] UnpackBitVector (PackedBitVector pakData) - { - uint[] unpackedVectors = new uint[pakData.m_NumItems]; - //int bitmax = 0;//used to convert int value to float - //for (int b = 0; b < pakData.m_BitSize; b++) { bitmax |= (1 << b); } - - //the lazy way - //split data into groups of "aligned" bytes i.e. 8 packed values per group - //I could calculate optimized group size based on BitSize, but this is the lazy way - - if (pakData.m_BitSize == 0) - { - pakData.m_BitSize = (byte)((pakData.m_Data.Length * 8) / pakData.m_NumItems); - //don't know, don't care - } - int groupSize = pakData.m_BitSize; //bitSize * 8 values / 8 bits - byte[] group = new byte[groupSize]; - int groupCount = pakData.m_NumItems / 8; + public uint[] UnpackBitVector(PackedBitVector pakData) + { + uint[] unpackedVectors = new uint[pakData.m_NumItems]; + //int bitmax = 0;//used to convert int value to float + //for (int b = 0; b < pakData.m_BitSize; b++) { bitmax |= (1 << b); } - for (int g = 0; g < groupCount; g++) - { - Buffer.BlockCopy(pakData.m_Data, g * groupSize, group, 0, groupSize); - BitArray groupBits = new BitArray(group); + //the lazy way + //split data into groups of "aligned" bytes i.e. 8 packed values per group + //I could calculate optimized group size based on BitSize, but this is the lazy way - for (int v = 0; v < 8; v++) - { - BitArray valueBits = new BitArray(new Boolean[pakData.m_BitSize]); - for (int b = 0; b < pakData.m_BitSize; b++) - { - valueBits.Set(b, groupBits.Get(b + v * pakData.m_BitSize)); - } + if (pakData.m_BitSize == 0) + { + pakData.m_BitSize = (byte)((pakData.m_Data.Length * 8) / pakData.m_NumItems); + //don't know, don't care + } + int groupSize = pakData.m_BitSize; //bitSize * 8 values / 8 bits + byte[] group = new byte[groupSize]; + int groupCount = pakData.m_NumItems / 8; - var valueArr = new int[1]; - valueBits.CopyTo(valueArr, 0); - //unpackedVectors[v + g * 8] = (float)(valueArr[0] / bitmax) * pakData.m_Range + pakData.m_Start; - //valueBits.CopyTo(unpackedVectors, v + g * 8);//doesn't work with uint[] - unpackedVectors[v + g * 8] = (uint)valueArr[0]; - } - } + for (int g = 0; g < groupCount; g++) + { + Buffer.BlockCopy(pakData.m_Data, g * groupSize, group, 0, groupSize); + BitArray groupBits = new BitArray(group); - //m_NumItems is not necessarily a multiple of 8, so there can be one extra group with fewer values - int endBytes = pakData.m_Data.Length - groupCount * groupSize; - int endVal = pakData.m_NumItems - groupCount * 8; + for (int v = 0; v < 8; v++) + { + BitArray valueBits = new BitArray(new Boolean[pakData.m_BitSize]); + for (int b = 0; b < pakData.m_BitSize; b++) + { + valueBits.Set(b, groupBits.Get(b + v * pakData.m_BitSize)); + } - if (endBytes > 0) - { - Buffer.BlockCopy(pakData.m_Data, groupCount * groupSize, group, 0, endBytes); - BitArray groupBits = new BitArray(group); + var valueArr = new int[1]; + valueBits.CopyTo(valueArr, 0); + //unpackedVectors[v + g * 8] = (float)(valueArr[0] / bitmax) * pakData.m_Range + pakData.m_Start; + //valueBits.CopyTo(unpackedVectors, v + g * 8);//doesn't work with uint[] + unpackedVectors[v + g * 8] = (uint)valueArr[0]; + } + } - for (int v = 0; v < endVal; v++) - { - BitArray valueBits = new BitArray(new Boolean[pakData.m_BitSize]); - for (int b = 0; b < pakData.m_BitSize; b++) - { - valueBits.Set(b, groupBits.Get(b + v * pakData.m_BitSize)); - } + //m_NumItems is not necessarily a multiple of 8, so there can be one extra group with fewer values + int endBytes = pakData.m_Data.Length - groupCount * groupSize; + int endVal = pakData.m_NumItems - groupCount * 8; - var valueArr = new int[1]; - valueBits.CopyTo(valueArr, 0); - //unpackedVectors[v + groupCount * 8] = (float)(valueArr[0] / bitmax) * pakData.m_Range + pakData.m_Start; - //valueBits.CopyTo(unpackedVectors, v + groupCount * 8); - unpackedVectors[v + groupCount * 8] = (uint)valueArr[0]; - } - } + if (endBytes > 0) + { + Buffer.BlockCopy(pakData.m_Data, groupCount * groupSize, group, 0, endBytes); + BitArray groupBits = new BitArray(group); + + for (int v = 0; v < endVal; v++) + { + BitArray valueBits = new BitArray(new Boolean[pakData.m_BitSize]); + for (int b = 0; b < pakData.m_BitSize; b++) + { + valueBits.Set(b, groupBits.Get(b + v * pakData.m_BitSize)); + } + + var valueArr = new int[1]; + valueBits.CopyTo(valueArr, 0); + //unpackedVectors[v + groupCount * 8] = (float)(valueArr[0] / bitmax) * pakData.m_Range + pakData.m_Start; + //valueBits.CopyTo(unpackedVectors, v + groupCount * 8); + unpackedVectors[v + groupCount * 8] = (uint)valueArr[0]; + } + } - //the hard way - //compute bit position in m_Data for each value - /*byte[] value = new byte[4] { 0, 0, 0, 0 }; + //the hard way + //compute bit position in m_Data for each value + /*byte[] value = new byte[4] { 0, 0, 0, 0 }; int byteCount = pakData.m_BitSize / 8;//bytes in single value int bitCount = pakData.m_BitSize % 8; @@ -288,10 +288,10 @@ namespace Unity_Studio }*/ - //first I split the data into byte-aligned arrays - //too complicated to calculate group size each time - //then no point in dividing? - /*int groupSize = byteCount + (bitCount + 7)/8; + //first I split the data into byte-aligned arrays + //too complicated to calculate group size each time + //then no point in dividing? + /*int groupSize = byteCount + (bitCount + 7)/8; int groups = pakData.m_Data.Length / groupSize; int valPerGr = (int)(pakData.m_NumItems / groups); @@ -323,402 +323,402 @@ namespace Unity_Studio } }*/ - return unpackedVectors; - } + return unpackedVectors; + } - public Mesh(AssetPreloadData MeshPD, bool readSwitch) - { - //Stream = new EndianStream(File.OpenRead(sourceFile.filePath), sourceFile.endianType); - //Stream.endian = sourceFile.endianType; - var version = MeshPD.sourceFile.version; - a_Stream = MeshPD.sourceFile.a_Stream; - a_Stream.Position = MeshPD.Offset; - bool m_Use16BitIndices = true; //3.5.0 and newer always uses 16bit indices - uint m_MeshCompression = 0; + public Mesh(AssetPreloadData MeshPD, bool readSwitch) + { + //Stream = new EndianStream(File.OpenRead(sourceFile.filePath), sourceFile.endianType); + //Stream.endian = sourceFile.endianType; + var version = MeshPD.sourceFile.version; + a_Stream = MeshPD.sourceFile.a_Stream; + a_Stream.Position = MeshPD.Offset; + bool m_Use16BitIndices = true; //3.5.0 and newer always uses 16bit indices + uint m_MeshCompression = 0; - if (MeshPD.sourceFile.platform == -2) - { - uint m_ObjectHideFlags = a_Stream.ReadUInt32(); - PPtr m_PrefabParentObject = MeshPD.sourceFile.ReadPPtr(); - PPtr m_PrefabInternal = MeshPD.sourceFile.ReadPPtr(); - } + if (MeshPD.sourceFile.platform == -2) + { + uint m_ObjectHideFlags = a_Stream.ReadUInt32(); + PPtr m_PrefabParentObject = MeshPD.sourceFile.ReadPPtr(); + PPtr m_PrefabInternal = MeshPD.sourceFile.ReadPPtr(); + } - m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); + m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); - if (readSwitch) - { + if (readSwitch) + { - if (version[0] < 3 || (version[0] == 3 && version[1] < 5)) - { - m_Use16BitIndices = a_Stream.ReadBoolean(); - a_Stream.Position += 3; - } + if (version[0] < 3 || (version[0] == 3 && version[1] < 5)) + { + m_Use16BitIndices = a_Stream.ReadBoolean(); + a_Stream.Position += 3; + } - #region Index Buffer for 2.5.1 and earlier - if (version[0] == 2 && version[1] <= 5) - { - int m_IndexBuffer_size = a_Stream.ReadInt32(); + #region Index Buffer for 2.5.1 and earlier + if (version[0] == 2 && version[1] <= 5) + { + int m_IndexBuffer_size = a_Stream.ReadInt32(); - if (m_Use16BitIndices) - { - m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; - for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt16(); } - a_Stream.AlignStream(4); - } - else - { - m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; - for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt32(); } - } - } - #endregion + if (m_Use16BitIndices) + { + m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; + for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt16(); } + a_Stream.AlignStream(4); + } + else + { + m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; + for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt32(); } + } + } + #endregion - #region subMeshes - int m_SubMeshes_size = a_Stream.ReadInt32(); - for (int s = 0; s < m_SubMeshes_size; s++) - { - m_SubMeshes.Add(new SubMesh()); - m_SubMeshes[s].firstByte = a_Stream.ReadUInt32(); - m_SubMeshes[s].indexCount = a_Stream.ReadUInt32(); //what is this in case of triangle strips? - m_SubMeshes[s].topology = a_Stream.ReadInt32(); //isTriStrip - if (version[0] < 4) - { - m_SubMeshes[s].triangleCount = a_Stream.ReadUInt32(); - } - if (version[0] >= 3) - { + #region subMeshes + int m_SubMeshes_size = a_Stream.ReadInt32(); + for (int s = 0; s < m_SubMeshes_size; s++) + { + m_SubMeshes.Add(new SubMesh()); + m_SubMeshes[s].firstByte = a_Stream.ReadUInt32(); + m_SubMeshes[s].indexCount = a_Stream.ReadUInt32(); //what is this in case of triangle strips? + m_SubMeshes[s].topology = a_Stream.ReadInt32(); //isTriStrip + if (version[0] < 4) + { + m_SubMeshes[s].triangleCount = a_Stream.ReadUInt32(); + } + if (version[0] >= 3) + { if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3))//2017.3 and up { var baseVertex = a_Stream.ReadUInt32(); } m_SubMeshes[s].firstVertex = a_Stream.ReadUInt32(); - m_SubMeshes[s].vertexCount = a_Stream.ReadUInt32(); - a_Stream.Position += 24; //Axis-Aligned Bounding Box - } - } - #endregion + m_SubMeshes[s].vertexCount = a_Stream.ReadUInt32(); + a_Stream.Position += 24; //Axis-Aligned Bounding Box + } + } + #endregion - #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))) - { - 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 - } + #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))) + { + 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 - } - #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 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 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 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 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() } }; - } + m_BindPose = new float[a_Stream.ReadInt32()][,]; + for (int i = 0; i < m_BindPose.Length; i++) + { + m_BindPose[i] = new[,] { + { 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 + int m_BoneNameHashes_size = a_Stream.ReadInt32(); + a_Stream.Position += m_BoneNameHashes_size * 4; //uints - uint m_RootBoneNameHash = a_Stream.ReadUInt32(); - } - #endregion + uint m_RootBoneNameHash = a_Stream.ReadUInt32(); + } + #endregion - #region Index Buffer for 2.6.0 and later - if (version[0] >= 3 || (version[0] == 2 && version[1] >= 6)) - { - m_MeshCompression = a_Stream.ReadByte(); - if (version[0] >= 4) - { - if (version[0] < 5) { uint m_StreamCompression = a_Stream.ReadByte(); } - bool m_IsReadable = a_Stream.ReadBoolean(); - bool m_KeepVertices = a_Stream.ReadBoolean(); - bool m_KeepIndices = a_Stream.ReadBoolean(); - } - a_Stream.AlignStream(4); + #region Index Buffer for 2.6.0 and later + if (version[0] >= 3 || (version[0] == 2 && version[1] >= 6)) + { + m_MeshCompression = a_Stream.ReadByte(); + if (version[0] >= 4) + { + if (version[0] < 5) { uint m_StreamCompression = a_Stream.ReadByte(); } + bool m_IsReadable = a_Stream.ReadBoolean(); + bool m_KeepVertices = a_Stream.ReadBoolean(); + bool m_KeepIndices = a_Stream.ReadBoolean(); + } + a_Stream.AlignStream(4); if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3))//2017.3 and up { var m_IndexFormat = a_Stream.ReadInt32(); } int m_IndexBuffer_size = a_Stream.ReadInt32(); - if (m_Use16BitIndices) - { - m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; - for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt16(); } - a_Stream.AlignStream(4); - } - else - { - m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; - for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt32(); } - a_Stream.AlignStream(4);//untested - } - } - #endregion + if (m_Use16BitIndices) + { + m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; + for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt16(); } + a_Stream.AlignStream(4); + } + else + { + m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; + for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = a_Stream.ReadUInt32(); } + a_Stream.AlignStream(4);//untested + } + } + #endregion - #region Vertex Buffer for 3.4.2 and earlier - if (version[0] < 3 || (version[0] == 3 && version[1] < 5)) - { - 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(); } + #region Vertex Buffer for 3.4.2 and earlier + if (version[0] < 3 || (version[0] == 3 && version[1] < 5)) + { + 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(); } - m_Skin = new List[a_Stream.ReadInt32()]; - //m_Skin = new Dictionary[a_Stream.ReadInt32()]; - for (int s = 0; s < m_Skin.Length; s++) - { - m_Skin[s] = new List(); - 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 = new List[a_Stream.ReadInt32()]; + //m_Skin = new Dictionary[a_Stream.ReadInt32()]; + for (int s = 0; s < m_Skin.Length; s++) + { + m_Skin[s] = new List(); + 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(); + /*m_Skin[s] = new Dictionary(); 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() } }; - } + m_BindPose = new float[a_Stream.ReadInt32()][,]; + for (int i = 0; i < m_BindPose.Length; i++) + { + m_BindPose[i] = new[,] { + { 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]; - for (int v = 0; v < m_UV1_size * 2; v++) { m_UV1[v] = a_Stream.ReadSingle(); } + int m_UV1_size = a_Stream.ReadInt32(); + m_UV1 = new float[m_UV1_size * 2]; + for (int v = 0; v < m_UV1_size * 2; v++) { m_UV1[v] = a_Stream.ReadSingle(); } - int m_UV2_size = a_Stream.ReadInt32(); - m_UV2 = new float[m_UV2_size * 2]; - for (int v = 0; v < m_UV2_size * 2; v++) { m_UV2[v] = a_Stream.ReadSingle(); } + int m_UV2_size = a_Stream.ReadInt32(); + m_UV2 = new float[m_UV2_size * 2]; + for (int v = 0; v < m_UV2_size * 2; v++) { m_UV2[v] = a_Stream.ReadSingle(); } - if (version[0] == 2 && version[1] <= 5) - { - int m_TangentSpace_size = a_Stream.ReadInt32(); - m_Normals = new float[m_TangentSpace_size * 3]; - for (int v = 0; v < m_TangentSpace_size; v++) - { - m_Normals[v * 3] = a_Stream.ReadSingle(); - m_Normals[v * 3 + 1] = a_Stream.ReadSingle(); - m_Normals[v * 3 + 2] = a_Stream.ReadSingle(); - a_Stream.Position += 16; //Vector3f tangent & float handedness - } - } - else //2.6.0 and later - { - int m_Tangents_size = a_Stream.ReadInt32(); - a_Stream.Position += m_Tangents_size * 16; //Vector4f + if (version[0] == 2 && version[1] <= 5) + { + int m_TangentSpace_size = a_Stream.ReadInt32(); + m_Normals = new float[m_TangentSpace_size * 3]; + for (int v = 0; v < m_TangentSpace_size; v++) + { + m_Normals[v * 3] = a_Stream.ReadSingle(); + m_Normals[v * 3 + 1] = a_Stream.ReadSingle(); + m_Normals[v * 3 + 2] = a_Stream.ReadSingle(); + a_Stream.Position += 16; //Vector3f tangent & float handedness + } + } + else //2.6.0 and later + { + int m_Tangents_size = a_Stream.ReadInt32(); + a_Stream.Position += m_Tangents_size * 16; //Vector4f - int m_Normals_size = a_Stream.ReadInt32(); - m_Normals = new float[m_Normals_size * 3]; - for (int v = 0; v < m_Normals_size * 3; v++) { m_Normals[v] = a_Stream.ReadSingle(); } - } - } - #endregion - #region Vertex Buffer for 3.5.0 and later - else - { - #region read vertex stream - m_Skin = new List[a_Stream.ReadInt32()]; - //m_Skin = new Dictionary[a_Stream.ReadInt32()]; - for (int s = 0; s < m_Skin.Length; s++) - { - m_Skin[s] = new List(); - 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_Normals_size = a_Stream.ReadInt32(); + m_Normals = new float[m_Normals_size * 3]; + for (int v = 0; v < m_Normals_size * 3; v++) { m_Normals[v] = a_Stream.ReadSingle(); } + } + } + #endregion + #region Vertex Buffer for 3.5.0 and later + else + { + #region read vertex stream + m_Skin = new List[a_Stream.ReadInt32()]; + //m_Skin = new Dictionary[a_Stream.ReadInt32()]; + for (int s = 0; s < m_Skin.Length; s++) + { + m_Skin[s] = new List(); + 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(); + /*m_Skin[s] = new Dictionary(); 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]; }*/ - } + } - 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() } }; - } - } + 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[,] { + { 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(); - //int singleStreamStride = 0;//used tor unity 5 - int streamCount = 0; + BitArray m_CurrentChannels = new BitArray(new int[1] { a_Stream.ReadInt32() }); + m_VertexCount = a_Stream.ReadInt32(); + //int singleStreamStride = 0;//used tor unity 5 + int streamCount = 0; - #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 - { - a_Stream.Position += 12; - } - else - { - m_Streams = new StreamInfo[4]; - for (int s = 0; s < 4; s++) - { - m_Streams[s] = new StreamInfo(); - m_Streams[s].channelMask = new BitArray(new int[1] { a_Stream.ReadInt32() }); - m_Streams[s].offset = a_Stream.ReadInt32(); - m_Streams[s].stride = a_Stream.ReadInt32(); - m_Streams[s].align = a_Stream.ReadUInt32(); - } - } - } - #endregion - #region channels and streams for 4.0.0 and later - else - { - m_Channels = new ChannelInfo[a_Stream.ReadInt32()]; - for (int c = 0; c < m_Channels.Length; c++) - { - m_Channels[c] = new ChannelInfo(); - m_Channels[c].stream = a_Stream.ReadByte(); - m_Channels[c].offset = a_Stream.ReadByte(); - m_Channels[c].format = a_Stream.ReadByte(); - m_Channels[c].dimension = a_Stream.ReadByte(); + #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 + { + a_Stream.Position += 12; + } + else + { + m_Streams = new StreamInfo[4]; + for (int s = 0; s < 4; s++) + { + m_Streams[s] = new StreamInfo(); + m_Streams[s].channelMask = new BitArray(new int[1] { a_Stream.ReadInt32() }); + m_Streams[s].offset = a_Stream.ReadInt32(); + m_Streams[s].stride = a_Stream.ReadInt32(); + m_Streams[s].align = a_Stream.ReadUInt32(); + } + } + } + #endregion + #region channels and streams for 4.0.0 and later + else + { + m_Channels = new ChannelInfo[a_Stream.ReadInt32()]; + for (int c = 0; c < m_Channels.Length; c++) + { + m_Channels[c] = new ChannelInfo(); + m_Channels[c].stream = a_Stream.ReadByte(); + m_Channels[c].offset = a_Stream.ReadByte(); + m_Channels[c].format = a_Stream.ReadByte(); + 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)); + //calculate stride for Unity 5 + //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 (m_Channels[c].stream >= streamCount) { streamCount = m_Channels[c].stream + 1; } + } - if (version[0] < 5) - { - m_Streams = new StreamInfo[a_Stream.ReadInt32()]; - for (int s = 0; s < m_Streams.Length; s++) - { - m_Streams[s] = new StreamInfo(); - m_Streams[s].channelMask = new BitArray(new int[1] { a_Stream.ReadInt32() }); - m_Streams[s].offset = a_Stream.ReadInt32(); - m_Streams[s].stride = a_Stream.ReadByte(); - m_Streams[s].dividerOp = a_Stream.ReadByte(); - m_Streams[s].frequency = a_Stream.ReadUInt16(); - } - } - } - #endregion + if (version[0] < 5) + { + m_Streams = new StreamInfo[a_Stream.ReadInt32()]; + for (int s = 0; s < m_Streams.Length; s++) + { + m_Streams[s] = new StreamInfo(); + m_Streams[s].channelMask = new BitArray(new int[1] { a_Stream.ReadInt32() }); + m_Streams[s].offset = a_Stream.ReadInt32(); + m_Streams[s].stride = a_Stream.ReadByte(); + m_Streams[s].dividerOp = a_Stream.ReadByte(); + m_Streams[s].frequency = a_Stream.ReadUInt16(); + } + } + } + #endregion - //actual Vertex Buffer - byte[] m_DataSize = new byte[a_Stream.ReadInt32()]; - a_Stream.Read(m_DataSize, 0, m_DataSize.Length); + //actual Vertex Buffer + byte[] m_DataSize = new byte[a_Stream.ReadInt32()]; + a_Stream.Read(m_DataSize, 0, m_DataSize.Length); - if (version[0] >= 5) //create streams - { - 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; - m_Streams[s].stride = 0; + if (version[0] >= 5) //create streams + { + 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; + 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)); } - } + 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)); } + } - if (s > 0) - { - m_Streams[s].offset = m_Streams[s - 1].offset + m_Streams[s - 1].stride * m_VertexCount; - //sometimes there are 8 bytes between streams - //this is NOT an alignment, even if sometimes it may seem so + if (s > 0) + { + m_Streams[s].offset = m_Streams[s - 1].offset + m_Streams[s - 1].stride * m_VertexCount; + //sometimes there are 8 bytes between streams + //this is NOT an alignment, even if sometimes it may seem so - if (streamCount == 2) { m_Streams[s].offset = m_DataSize.Length - m_Streams[s].stride * m_VertexCount; } - else - { - m_VertexCount = 0; - return; - } + if (streamCount == 2) { m_Streams[s].offset = m_DataSize.Length - m_Streams[s].stride * m_VertexCount; } + else + { + m_VertexCount = 0; + return; + } - /*var absoluteOffset = a_Stream.Position + 4 + m_Streams[s].offset; + /*var absoluteOffset = a_Stream.Position + 4 + m_Streams[s].offset; if ((absoluteOffset % m_Streams[s].stride) != 0) { m_Streams[s].offset += m_Streams[s].stride - (int)(absoluteOffset % m_Streams[s].stride); }*/ - } - } - } - #endregion + } + } + } + #endregion - #region compute FvF - int componentByteSize = 0; - byte[] componentBytes; - float[] componentsArray; + #region compute FvF + 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 - foreach (var m_Channel in m_Channels) - { - if (m_Channel.dimension > 0) - { - var m_Stream = m_Streams[m_Channel.stream]; + #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 + foreach (var m_Channel in m_Channels) + { + if (m_Channel.dimension > 0) + { + var m_Stream = m_Streams[m_Channel.stream]; - for (int b = 0; b < 8; 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; } + for (int b = 0; b < 8; 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; } - componentByteSize = 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) { case 0: //32bit valueBufferSize = 4; @@ -732,563 +732,563 @@ namespace Unity_Studio break; }*/ - componentBytes = new byte[componentByteSize]; - componentsArray = 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 componentOffset = vertexOffset + componentByteSize * d; - Buffer.BlockCopy(m_DataSize, componentOffset, componentBytes, 0, componentByteSize); - componentsArray[v * m_Channel.dimension + d] = bytesToFloat(componentBytes); - } - } + 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 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 = 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 = componentsArray; } - else { m_Tangents = componentsArray; } - break; - case 6: m_UV4 = componentsArray; break; - case 7: m_Tangents = componentsArray; break; - } + switch (b) + { + 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 = componentsArray; } + else { m_Tangents = componentsArray; } + break; + case 6: m_UV4 = componentsArray; break; + case 7: m_Tangents = componentsArray; break; + } - m_Stream.channelMask.Set(b, false); - m_CurrentChannels.Set(b, false); - componentBytes = null; - componentsArray = null; - break; //go to next channel - } - } - } - } - } - #endregion - #region 3.5.0 - 3.5.7 - else if (m_Streams != null) - { - foreach (var m_Stream in m_Streams) - { - //a stream may have multiple vertex components but without channels there are no offsets, so I assume all vertex properties are in order - //Unity 3.5.x only uses floats, and that's probably why channels were introduced in Unity 4 + m_Stream.channelMask.Set(b, false); + m_CurrentChannels.Set(b, false); + componentBytes = null; + componentsArray = null; + break; //go to next channel + } + } + } + } + } + #endregion + #region 3.5.0 - 3.5.7 + else if (m_Streams != null) + { + foreach (var m_Stream in m_Streams) + { + //a stream may have multiple vertex components but without channels there are no offsets, so I assume all vertex properties are in order + //Unity 3.5.x only uses floats, and that's probably why channels were introduced in Unity 4 - ChannelInfo m_Channel = new ChannelInfo();//create my own channel so I can use the same methods - m_Channel.offset = 0; + ChannelInfo m_Channel = new ChannelInfo();//create my own channel so I can use the same methods + m_Channel.offset = 0; - for (int b = 0; b < 6; b++) - { - if (m_Stream.channelMask.Get(b)) - { - switch (b) - { - case 0: - case 1: - componentByteSize = 4; - m_Channel.dimension = 3; - break; - case 2: - componentByteSize = 1; - m_Channel.dimension = 4; - break; - case 3: - case 4: - componentByteSize = 4; - m_Channel.dimension = 2; - break; - case 5: - componentByteSize = 4; - m_Channel.dimension = 4; - break; - } + for (int b = 0; b < 6; b++) + { + if (m_Stream.channelMask.Get(b)) + { + switch (b) + { + case 0: + case 1: + componentByteSize = 4; + m_Channel.dimension = 3; + break; + case 2: + componentByteSize = 1; + m_Channel.dimension = 4; + break; + case 3: + case 4: + componentByteSize = 4; + m_Channel.dimension = 2; + break; + case 5: + componentByteSize = 4; + m_Channel.dimension = 4; + break; + } - componentBytes = new byte[componentByteSize]; - componentsArray = 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 = vertexOffset + componentByteSize * d; - Buffer.BlockCopy(m_DataSize, m_DataSizeOffset, componentBytes, 0, componentByteSize); - componentsArray[v * m_Channel.dimension + d] = bytesToFloat(componentBytes); - } - } + 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 = 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 = 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; - } + switch (b) + { + 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 * componentByteSize); //safe to cast as byte because strides larger than 255 are unlikely - m_Stream.channelMask.Set(b, false); - componentBytes = null; - componentsArray = null; - } - } - } - } - #endregion - #endregion - } - #endregion + 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; + } + } + } + } + #endregion + #endregion + } + #endregion - #region Compressed Mesh data for 2.6.0 and later - 160 bytes - if (version[0] >= 3 || (version[0] == 2 && version[1] >= 6)) - { - //remember there can be combinations of packed and regular vertex properties + #region Compressed Mesh data for 2.6.0 and later - 160 bytes + 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.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()]; - a_Stream.Read(m_Vertices_Packed.m_Data, 0, m_Vertices_Packed.m_Data.Length); - a_Stream.AlignStream(4); - m_Vertices_Packed.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + #region m_Vertices + PackedBitVector m_Vertices_Packed = new PackedBitVector(); + 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()]; + a_Stream.Read(m_Vertices_Packed.m_Data, 0, m_Vertices_Packed.m_Data.Length); + a_Stream.AlignStream(4); + m_Vertices_Packed.m_BitSize = a_Stream.ReadByte(); + a_Stream.Position += 3; //4 byte alignment - if (m_Vertices_Packed.m_NumItems > 0) - { - m_VertexCount = m_Vertices_Packed.m_NumItems / 3; - uint[] m_Vertices_Unpacked = UnpackBitVector(m_Vertices_Packed); - int bitmax = 0;//used to convert int value to float - for (int b = 0; b < m_Vertices_Packed.m_BitSize; b++) { bitmax |= (1 << b); } - m_Vertices = new float[m_Vertices_Packed.m_NumItems]; - for (int v = 0; v < m_Vertices_Packed.m_NumItems; v++) - { - m_Vertices[v] = (float)((double)m_Vertices_Unpacked[v] / bitmax) * m_Vertices_Packed.m_Range + m_Vertices_Packed.m_Start; - } - } - #endregion + if (m_Vertices_Packed.m_NumItems > 0) + { + m_VertexCount = m_Vertices_Packed.m_NumItems / 3; + uint[] m_Vertices_Unpacked = UnpackBitVector(m_Vertices_Packed); + int bitmax = 0;//used to convert int value to float + for (int b = 0; b < m_Vertices_Packed.m_BitSize; b++) { bitmax |= (1 << b); } + m_Vertices = new float[m_Vertices_Packed.m_NumItems]; + for (int v = 0; v < m_Vertices_Packed.m_NumItems; v++) + { + m_Vertices[v] = (float)((double)m_Vertices_Unpacked[v] / bitmax) * m_Vertices_Packed.m_Range + m_Vertices_Packed.m_Start; + } + } + #endregion - #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()]; - a_Stream.Read(m_UV_Packed.m_Data, 0, m_UV_Packed.m_Data.Length); - a_Stream.AlignStream(4); - m_UV_Packed.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + #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()]; + a_Stream.Read(m_UV_Packed.m_Data, 0, m_UV_Packed.m_Data.Length); + a_Stream.AlignStream(4); + m_UV_Packed.m_BitSize = a_Stream.ReadByte(); + a_Stream.Position += 3; //4 byte alignment - if (m_UV_Packed.m_NumItems > 0 && (bool)Properties.Settings.Default["exportUVs"]) - { - uint[] m_UV_Unpacked = UnpackBitVector(m_UV_Packed); - int bitmax = 0; - for (int b = 0; b < m_UV_Packed.m_BitSize; b++) { bitmax |= (1 << b); } + if (m_UV_Packed.m_NumItems > 0 && (bool)Properties.Settings.Default["exportUVs"]) + { + uint[] m_UV_Unpacked = UnpackBitVector(m_UV_Packed); + int bitmax = 0; + for (int b = 0; b < m_UV_Packed.m_BitSize; b++) { bitmax |= (1 << b); } - m_UV1 = new float[m_VertexCount * 2]; + m_UV1 = new float[m_VertexCount * 2]; - for (int v = 0; v < m_VertexCount * 2; v++) - { - m_UV1[v] = (float)((double)m_UV_Unpacked[v] / bitmax) * m_UV_Packed.m_Range + m_UV_Packed.m_Start; - } + for (int v = 0; v < m_VertexCount * 2; v++) + { + 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) - { - m_UV2 = new float[m_VertexCount * 2]; - for (uint v = 0; v < m_VertexCount * 2; v++) - { - 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 * 4) + { + m_UV2 = new float[m_VertexCount * 2]; + for (uint v = 0; v < m_VertexCount * 2; v++) + { + 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) - { - m_UV3 = new float[m_VertexCount * 2]; - for (uint v = 0; v < m_VertexCount * 2; v++) - { - 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 * 6) + { + m_UV3 = new float[m_VertexCount * 2]; + for (uint v = 0; v < m_VertexCount * 2; v++) + { + 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) - { - m_UV4 = new float[m_VertexCount * 2]; - for (uint v = 0; v < m_VertexCount * 2; v++) - { - m_UV4[v] = (float)((double)m_UV_Unpacked[v + m_VertexCount * 6] / bitmax) * m_UV_Packed.m_Range + m_UV_Packed.m_Start; - } - } - } - } - } - #endregion + if (m_UV_Packed.m_NumItems == m_VertexCount * 8) + { + m_UV4 = new float[m_VertexCount * 2]; + for (uint v = 0; v < m_VertexCount * 2; v++) + { + 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.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()]; - a_Stream.Read(m_BindPoses_Packed.m_Data, 0, m_BindPoses_Packed.m_Data.Length); - a_Stream.AlignStream(4); - m_BindPoses_Packed.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + #region m_BindPose + if (version[0] < 5) + { + PackedBitVector m_BindPoses_Packed = new PackedBitVector(); + 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()]; + a_Stream.Read(m_BindPoses_Packed.m_Data, 0, m_BindPoses_Packed.m_Data.Length); + 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); } + 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][,]; + 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 + 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.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()]; - a_Stream.Read(m_Normals_Packed.m_Data, 0, m_Normals_Packed.m_Data.Length); - a_Stream.AlignStream(4); - m_Normals_Packed.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + PackedBitVector m_Normals_Packed = new PackedBitVector(); + 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()]; + a_Stream.Read(m_Normals_Packed.m_Data, 0, m_Normals_Packed.m_Data.Length); + a_Stream.AlignStream(4); + m_Normals_Packed.m_BitSize = a_Stream.ReadByte(); + a_Stream.Position += 3; //4 byte alignment - PackedBitVector m_Tangents_Packed = new PackedBitVector(); - 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()]; - a_Stream.Read(m_Tangents_Packed.m_Data, 0, m_Tangents_Packed.m_Data.Length); - a_Stream.AlignStream(4); - m_Tangents_Packed.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + PackedBitVector m_Tangents_Packed = new PackedBitVector(); + 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()]; + a_Stream.Read(m_Tangents_Packed.m_Data, 0, m_Tangents_Packed.m_Data.Length); + a_Stream.AlignStream(4); + m_Tangents_Packed.m_BitSize = a_Stream.ReadByte(); + a_Stream.Position += 3; //4 byte alignment - 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.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + 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.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.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 + #region m_Normals + PackedBitVector m_NormalSigns_packed = new PackedBitVector(); + 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 && (bool)Properties.Settings.Default["exportNormals"]) - { - uint[] m_Normals_Unpacked = UnpackBitVector(m_Normals_Packed); - uint[] m_NormalSigns = UnpackBitVector(m_NormalSigns_packed); - int bitmax = 0; - for (int b = 0; b < m_Normals_Packed.m_BitSize; b++) { bitmax |= (1 << b); } - m_Normals = new float[m_Normals_Packed.m_NumItems / 2 * 3]; - for (int v = 0; v < m_Normals_Packed.m_NumItems / 2; v++) - { - m_Normals[v * 3] = (float)((double)m_Normals_Unpacked[v * 2] / bitmax) * m_Normals_Packed.m_Range + m_Normals_Packed.m_Start; - m_Normals[v * 3 + 1] = (float)((double)m_Normals_Unpacked[v * 2 + 1] / bitmax) * m_Normals_Packed.m_Range + m_Normals_Packed.m_Start; - m_Normals[v * 3 + 2] = (float)Math.Sqrt(1 - m_Normals[v * 3] * m_Normals[v * 3] - m_Normals[v * 3 + 1] * m_Normals[v * 3 + 1]); - if (m_NormalSigns[v] == 0) { m_Normals[v * 3 + 2] *= -1; } - } - } - #endregion + 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); + int bitmax = 0; + for (int b = 0; b < m_Normals_Packed.m_BitSize; b++) { bitmax |= (1 << b); } + m_Normals = new float[m_Normals_Packed.m_NumItems / 2 * 3]; + for (int v = 0; v < m_Normals_Packed.m_NumItems / 2; v++) + { + m_Normals[v * 3] = (float)((double)m_Normals_Unpacked[v * 2] / bitmax) * m_Normals_Packed.m_Range + m_Normals_Packed.m_Start; + m_Normals[v * 3 + 1] = (float)((double)m_Normals_Unpacked[v * 2 + 1] / bitmax) * m_Normals_Packed.m_Range + m_Normals_Packed.m_Start; + m_Normals[v * 3 + 2] = (float)Math.Sqrt(1 - m_Normals[v * 3] * m_Normals[v * 3] - m_Normals[v * 3 + 1] * m_Normals[v * 3 + 1]); + if (m_NormalSigns[v] == 0) { m_Normals[v * 3 + 2] *= -1; } + } + } + #endregion - #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_packed.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + #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_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 + 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.ReadInt32(); - m_FloatColors.m_Range = a_Stream.ReadSingle(); - m_FloatColors.m_Start = a_Stream.ReadSingle(); - m_FloatColors.m_Data = new byte[a_Stream.ReadInt32()]; - a_Stream.Read(m_FloatColors.m_Data, 0, m_FloatColors.m_Data.Length); - a_Stream.AlignStream(4); - m_FloatColors.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + #region m_FloatColors + if (version[0] >= 5) + { + PackedBitVector m_FloatColors = new PackedBitVector(); + 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()]; + a_Stream.Read(m_FloatColors.m_Data, 0, m_FloatColors.m_Data.Length); + a_Stream.AlignStream(4); + m_FloatColors.m_BitSize = a_Stream.ReadByte(); + a_Stream.Position += 3; //4 byte alignment - if (m_FloatColors.m_NumItems > 0 && (bool)Properties.Settings.Default["exportColors"]) - { - uint[] m_FloatColors_Unpacked = UnpackBitVector(m_FloatColors); - int bitmax = 0; - for (int b = 0; b < m_FloatColors.m_BitSize; b++) { bitmax |= (1 << b); } + if (m_FloatColors.m_NumItems > 0 && (bool)Properties.Settings.Default["exportColors"]) + { + uint[] m_FloatColors_Unpacked = UnpackBitVector(m_FloatColors); + int bitmax = 0; + for (int b = 0; b < m_FloatColors.m_BitSize; b++) { bitmax |= (1 << b); } - m_Colors = new float[m_FloatColors.m_NumItems]; + m_Colors = new float[m_FloatColors.m_NumItems]; - for (int v = 0; v < m_FloatColors.m_NumItems; v++) - { - m_Colors[v] = (float)m_FloatColors_Unpacked[v] / bitmax * m_FloatColors.m_Range + m_FloatColors.m_Start; - } - } - } - #endregion + for (int v = 0; v < m_FloatColors.m_NumItems; v++) + { + m_Colors[v] = (float)m_FloatColors_Unpacked[v] / bitmax * m_FloatColors.m_Range + m_FloatColors.m_Start; + } + } + } + #endregion - #region m_Skin - PackedBitVector m_BoneIndices = new PackedBitVector(); - 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 + #region m_Skin + PackedBitVector m_BoneIndices = new PackedBitVector(); + 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 - if (m_BoneIndices.m_NumItems > 0 && (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); } + if (m_BoneIndices.m_NumItems > 0 && (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); + uint[] m_BoneIndices_Unpacked = UnpackBitVector(m_BoneIndices); - m_Skin = new List[m_VertexCount]; - for (int s = 0; s < m_Skin.Length; s++) - { - m_Skin[s] = new List(4); - } + m_Skin = new List[m_VertexCount]; + for (int s = 0; s < m_Skin.Length; s++) + { + m_Skin[s] = new List(4); + } - int inflCount = m_Weights.m_NumItems; - int vertIndex = 0; - int weightIndex = 0; - int bonesIndex = 0; - for(weightIndex = 0; weightIndex < inflCount; vertIndex++) - { - int inflSum = 0; - int j; - for(j = 0; j < 4; j++) - { - int curWeight = 0; - if(j == 3) - { - curWeight = 31 - inflSum; - } - else - { - curWeight = (int)m_Weights_Unpacked[weightIndex]; - weightIndex++; - inflSum += curWeight; - } - double curWeightDouble = (double)curWeight; - float realCurWeight = (float)(curWeightDouble / bitmax); + int inflCount = m_Weights.m_NumItems; + int vertIndex = 0; + int weightIndex = 0; + int bonesIndex = 0; + for (weightIndex = 0; weightIndex < inflCount; vertIndex++) + { + int inflSum = 0; + int j; + for (j = 0; j < 4; j++) + { + int curWeight = 0; + if (j == 3) + { + curWeight = 31 - inflSum; + } + else + { + curWeight = (int)m_Weights_Unpacked[weightIndex]; + weightIndex++; + inflSum += curWeight; + } + double curWeightDouble = (double)curWeight; + float realCurWeight = (float)(curWeightDouble / bitmax); - int boneIndex = (int)m_BoneIndices_Unpacked[bonesIndex]; - bonesIndex++; - if (boneIndex < 0) - { - throw new Exception($"Invalid bone index {boneIndex}"); - } - BoneInfluence boneInfl = new BoneInfluence() - { - weight = realCurWeight, - boneIndex = boneIndex, - }; - m_Skin[vertIndex].Add(boneInfl); + int boneIndex = (int)m_BoneIndices_Unpacked[bonesIndex]; + bonesIndex++; + if (boneIndex < 0) + { + throw new Exception($"Invalid bone index {boneIndex}"); + } + BoneInfluence boneInfl = new BoneInfluence() + { + weight = realCurWeight, + boneIndex = boneIndex, + }; + m_Skin[vertIndex].Add(boneInfl); - if(inflSum == 31) - { - break; - } - if (inflSum > 31) - { - throw new Exception("Influence sum " + inflSum + " greater than 31"); - } - } - for(; j < 4; j++) - { - BoneInfluence boneInfl = new BoneInfluence() - { - weight = 0.0f, - boneIndex = 0, - }; - m_Skin[vertIndex].Add(boneInfl); - } - } + if (inflSum == 31) + { + break; + } + if (inflSum > 31) + { + throw new Exception("Influence sum " + inflSum + " greater than 31"); + } + } + for (; j < 4; j++) + { + BoneInfluence boneInfl = new BoneInfluence() + { + weight = 0.0f, + boneIndex = 0, + }; + m_Skin[vertIndex].Add(boneInfl); + } + } - bool isFine = vertIndex == m_VertexCount; - if (!isFine) - { - throw new Exception("Vertecies aint equals"); - } - } - #endregion + bool isFine = vertIndex == m_VertexCount; + if (!isFine) + { + throw new Exception("Vertecies aint equals"); + } + } + #endregion - PackedBitVector m_Triangles = new PackedBitVector(); - 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); - m_Triangles.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + PackedBitVector m_Triangles = new PackedBitVector(); + 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); + m_Triangles.m_BitSize = a_Stream.ReadByte(); + a_Stream.Position += 3; //4 byte alignment - if (m_Triangles.m_NumItems > 0) { m_IndexBuffer = UnpackBitVector(m_Triangles); } - } - #endregion + if (m_Triangles.m_NumItems > 0) { m_IndexBuffer = UnpackBitVector(m_Triangles); } + } + #endregion - #region Colors & Collision triangles for 3.4.2 and earlier - if (version[0] <= 2 || (version[0] == 3 && version[1] <= 4)) // - { - a_Stream.Position += 24; //Axis-Aligned Bounding Box - int m_Colors_size = a_Stream.ReadInt32(); - m_Colors = new float[m_Colors_size * 4]; - for (int v = 0; v < m_Colors_size * 4; v++) { m_Colors[v] = (float)(a_Stream.ReadByte()) / 0xFF; } + #region Colors & Collision triangles for 3.4.2 and earlier + if (version[0] <= 2 || (version[0] == 3 && version[1] <= 4)) // + { + a_Stream.Position += 24; //Axis-Aligned Bounding Box + int m_Colors_size = a_Stream.ReadInt32(); + m_Colors = new float[m_Colors_size * 4]; + for (int v = 0; v < m_Colors_size * 4; v++) { m_Colors[v] = (float)(a_Stream.ReadByte()) / 0xFF; } - int m_CollisionTriangles_size = a_Stream.ReadInt32(); - a_Stream.Position += m_CollisionTriangles_size * 4; //UInt32 indices - int m_CollisionVertexCount = a_Stream.ReadInt32(); - } - #endregion - #region Compressed colors & Local AABB for 3.5.0 to 4.x.x - else //vertex colors are either in streams or packed bits - { - if (version[0] < 5) - { - PackedBitVector m_Colors_Packed = new PackedBitVector(); - 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); - m_Colors_Packed.m_BitSize = a_Stream.ReadByte(); - a_Stream.Position += 3; //4 byte alignment + int m_CollisionTriangles_size = a_Stream.ReadInt32(); + a_Stream.Position += m_CollisionTriangles_size * 4; //UInt32 indices + int m_CollisionVertexCount = a_Stream.ReadInt32(); + } + #endregion + #region Compressed colors & Local AABB for 3.5.0 to 4.x.x + else //vertex colors are either in streams or packed bits + { + if (version[0] < 5) + { + PackedBitVector m_Colors_Packed = new PackedBitVector(); + 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); + m_Colors_Packed.m_BitSize = a_Stream.ReadByte(); + a_Stream.Position += 3; //4 byte alignment - if (m_Colors_Packed.m_NumItems > 0) - { - if (m_Colors_Packed.m_BitSize == 32) - { - //4 x 8bit color channels - m_Colors = new float[m_Colors_Packed.m_Data.Length]; - for (int v = 0; v < m_Colors_Packed.m_Data.Length; v++) - { - m_Colors[v] = (float)m_Colors_Packed.m_Data[v] / 0xFF; - } - } - else //not tested - { - uint[] m_Colors_Unpacked = UnpackBitVector(m_Colors_Packed); - int bitmax = 0;//used to convert int value to float - for (int b = 0; b < m_Colors_Packed.m_BitSize; b++) { bitmax |= (1 << b); } - m_Colors = new float[m_Colors_Packed.m_NumItems]; - for (int v = 0; v < m_Colors_Packed.m_NumItems; v++) - { - m_Colors[v] = (float)m_Colors_Unpacked[v] / bitmax; - } - } - } - } - else { uint m_UVInfo = a_Stream.ReadUInt32(); } + if (m_Colors_Packed.m_NumItems > 0) + { + if (m_Colors_Packed.m_BitSize == 32) + { + //4 x 8bit color channels + m_Colors = new float[m_Colors_Packed.m_Data.Length]; + for (int v = 0; v < m_Colors_Packed.m_Data.Length; v++) + { + m_Colors[v] = (float)m_Colors_Packed.m_Data[v] / 0xFF; + } + } + else //not tested + { + uint[] m_Colors_Unpacked = UnpackBitVector(m_Colors_Packed); + int bitmax = 0;//used to convert int value to float + for (int b = 0; b < m_Colors_Packed.m_BitSize; b++) { bitmax |= (1 << b); } + m_Colors = new float[m_Colors_Packed.m_NumItems]; + for (int v = 0; v < m_Colors_Packed.m_NumItems; v++) + { + m_Colors[v] = (float)m_Colors_Unpacked[v] / bitmax; + } + } + } + } + else { uint m_UVInfo = a_Stream.ReadUInt32(); } - a_Stream.Position += 24; //Axis-Aligned Bounding Box - } - #endregion + a_Stream.Position += 24; //Axis-Aligned Bounding Box + } + #endregion - int m_MeshUsageFlags = a_Stream.ReadInt32(); + int m_MeshUsageFlags = a_Stream.ReadInt32(); - if (version[0] >= 5) - { - //int m_BakedConvexCollisionMesh = a_Stream.ReadInt32(); - //a_Stream.Position += m_BakedConvexCollisionMesh; - //int m_BakedTriangleCollisionMesh = a_Stream.ReadInt32(); - //a_Stream.Position += m_BakedConvexCollisionMesh; - } + if (version[0] >= 5) + { + //int m_BakedConvexCollisionMesh = a_Stream.ReadInt32(); + //a_Stream.Position += m_BakedConvexCollisionMesh; + //int m_BakedTriangleCollisionMesh = a_Stream.ReadInt32(); + //a_Stream.Position += m_BakedConvexCollisionMesh; + } - #region Build face indices - for (int s = 0; s < m_SubMeshes_size; s++) - { - uint firstIndex = m_SubMeshes[s].firstByte / 2; - if (!m_Use16BitIndices) { firstIndex /= 2; } + #region Build face indices + for (int s = 0; s < m_SubMeshes_size; s++) + { + uint firstIndex = m_SubMeshes[s].firstByte / 2; + if (!m_Use16BitIndices) { firstIndex /= 2; } - if (m_SubMeshes[s].topology == 0) - { - for (int i = 0; i < m_SubMeshes[s].indexCount / 3; i++) - { - m_Indices.Add(m_IndexBuffer[firstIndex + i * 3]); - m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 1]); - m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 2]); - m_materialIDs.Add(s); - } - } - else - { - for (int i = 0; i < m_SubMeshes[s].indexCount - 2; i++) - { - uint fa = m_IndexBuffer[firstIndex + i]; - uint fb = m_IndexBuffer[firstIndex + i + 1]; - uint fc = m_IndexBuffer[firstIndex + i + 2]; + if (m_SubMeshes[s].topology == 0) + { + for (int i = 0; i < m_SubMeshes[s].indexCount / 3; i++) + { + m_Indices.Add(m_IndexBuffer[firstIndex + i * 3]); + m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 1]); + m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 2]); + m_materialIDs.Add(s); + } + } + else + { + for (int i = 0; i < m_SubMeshes[s].indexCount - 2; i++) + { + uint fa = m_IndexBuffer[firstIndex + i]; + uint fb = m_IndexBuffer[firstIndex + i + 1]; + uint fc = m_IndexBuffer[firstIndex + i + 2]; - if ((fa != fb) && (fa != fc) && (fc != fb)) - { - m_Indices.Add(fa); - if ((i % 2) == 0) - { - m_Indices.Add(fb); - m_Indices.Add(fc); - } - else - { - m_Indices.Add(fc); - m_Indices.Add(fb); - } - m_materialIDs.Add(s); - } - } - } - } - #endregion - } - else - { - MeshPD.extension = ".obj"; - MeshPD.Text = m_Name; - } - } - } + if ((fa != fb) && (fa != fc) && (fc != fb)) + { + m_Indices.Add(fa); + if ((i % 2) == 0) + { + m_Indices.Add(fb); + m_Indices.Add(fc); + } + else + { + m_Indices.Add(fc); + m_Indices.Add(fb); + } + m_materialIDs.Add(s); + } + } + } + } + #endregion + } + else + { + MeshPD.extension = ".obj"; + MeshPD.Text = m_Name; + } + } + } } diff --git a/Unity Studio/Unity Classes/Texture2D.cs b/Unity Studio/Unity Classes/Texture2D.cs index d2f0c6f..ff8c436 100644 --- a/Unity Studio/Unity Classes/Texture2D.cs +++ b/Unity Studio/Unity Classes/Texture2D.cs @@ -186,8 +186,7 @@ namespace Unity_Studio } else { - EndianBinaryReader estream; - if (UnityStudio.assetsfileandstream.TryGetValue(Path.GetFileName(path), out estream)) + if (UnityStudio.assetsfileandstream.TryGetValue(Path.GetFileName(path), out var estream)) { estream.Position = offset; image_data = estream.ReadBytes(image_data_size); diff --git a/Unity Studio/Unity Classes/VideoClip.cs b/Unity Studio/Unity Classes/VideoClip.cs index 2b2cbef..b925314 100644 --- a/Unity Studio/Unity Classes/VideoClip.cs +++ b/Unity Studio/Unity Classes/VideoClip.cs @@ -85,8 +85,7 @@ namespace Unity_Studio { preloadData.extension = Path.GetExtension(m_OriginalPath); preloadData.Text = m_Name; - if (m_Source != null) - preloadData.fullSize = preloadData.Size + (int)m_Size; + preloadData.fullSize = preloadData.Size + (int)m_Size; } } } diff --git a/Unity Studio/Unity Studio Classes/AssetsFile.cs b/Unity Studio/Unity Studio Classes/AssetsFile.cs index 26df084..e0a924c 100644 --- a/Unity Studio/Unity Studio Classes/AssetsFile.cs +++ b/Unity Studio/Unity Studio Classes/AssetsFile.cs @@ -17,7 +17,7 @@ namespace Unity_Studio public int fileGen; public bool valid; public string m_Version = "2.5.0f5"; - public int[] version = new int[4] { 0, 0, 0, 0 }; + public int[] version = { 0, 0, 0, 0 }; public string[] buildType; public int platform = 100663296; public string platformStr = ""; @@ -313,14 +313,7 @@ namespace Unity_Studio } AssetPreloadData asset = new AssetPreloadData(); - if (fileGen < 14) - { - asset.m_PathID = a_Stream.ReadInt32(); - } - else - { - asset.m_PathID = a_Stream.ReadInt64(); - } + asset.m_PathID = fileGen < 14 ? a_Stream.ReadInt32() : a_Stream.ReadInt64(); asset.Offset = a_Stream.ReadUInt32(); asset.Offset += dataOffset; asset.Size = a_Stream.ReadInt32(); @@ -344,8 +337,7 @@ namespace Unity_Studio //but not the last! } - string typeString; - if (ClassIDReference.Names.TryGetValue(asset.Type2, out typeString)) + if (ClassIDReference.Names.TryGetValue(asset.Type2, out var typeString)) { asset.TypeString = typeString; } diff --git a/Unity Studio/Unity Studio Classes/ClassStruct.cs b/Unity Studio/Unity Studio Classes/ClassStruct.cs index f55fb1c..11b2b7c 100644 --- a/Unity Studio/Unity Studio Classes/ClassStruct.cs +++ b/Unity Studio/Unity Studio Classes/ClassStruct.cs @@ -43,8 +43,7 @@ namespace Unity_Studio { var a_Stream = asset.sourceFile.a_Stream; a_Stream.Position = asset.Offset; - ClassStruct classStructure; - if (asset.sourceFile.ClassStructures.TryGetValue(asset.Type1, out classStructure)) + if (asset.sourceFile.ClassStructures.TryGetValue(asset.Type1, out var classStructure)) { var sb = new StringBuilder(); ReadClassStruct(sb, classStructure.members, a_Stream); diff --git a/Unity Studio/Unity Studio Classes/Helpers.cs b/Unity Studio/Unity Studio Classes/Helpers.cs index 647e014..fa571fa 100644 --- a/Unity Studio/Unity Studio Classes/Helpers.cs +++ b/Unity Studio/Unity Studio Classes/Helpers.cs @@ -25,8 +25,7 @@ namespace Unity_Studio if (FileID >= 0 && FileID < sourceFile.sharedAssetsList.Count) { result.m_FileID = sourceFile.sharedAssetsList[FileID].Index; } - if (sourceFile.fileGen < 14) { result.m_PathID = a_Stream.ReadInt32(); } - else { result.m_PathID = a_Stream.ReadInt64(); } + result.m_PathID = sourceFile.fileGen < 14 ? a_Stream.ReadInt32() : a_Stream.ReadInt64(); return result; } @@ -81,8 +80,7 @@ namespace Unity_Studio if (m_Component.m_FileID >= 0 && m_Component.m_FileID < assetsfileList.Count) { AssetsFile sourceFile = assetsfileList[m_Component.m_FileID]; - AssetPreloadData asset; - if (sourceFile.preloadTable.TryGetValue(m_Component.m_PathID, out asset)) + if (sourceFile.preloadTable.TryGetValue(m_Component.m_PathID, out var asset)) { switch (asset.Type2) { diff --git a/Unity Studio/Unity Studio Classes/UnityStudio.cs b/Unity Studio/Unity Studio Classes/UnityStudio.cs index 42f26ff..d1423f4 100644 --- a/Unity Studio/Unity Studio Classes/UnityStudio.cs +++ b/Unity Studio/Unity Studio Classes/UnityStudio.cs @@ -163,7 +163,7 @@ namespace Unity_Studio { int extractedCount = 0; - StatusStripUpdate("Decompressing " + Path.GetFileName(bundleFileName) + " ..."); + StatusStripUpdate($"Decompressing {Path.GetFileName(bundleFileName)} ..."); string extractPath = bundleFileName + "_unpacked\\"; Directory.CreateDirectory(extractPath); @@ -180,7 +180,7 @@ namespace Unity_Studio } if (!File.Exists(filePath)) { - StatusStripUpdate("Extracting " + Path.GetFileName(memFile.fileName)); + StatusStripUpdate($"Extracting {Path.GetFileName(memFile.fileName)}"); extractedCount += 1; using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write)) @@ -385,11 +385,9 @@ namespace Unity_Studio var parentNode = fileNode; - Transform m_Transform; - if (assetsfileList.TryGetTransform(m_GameObject.m_Transform, out m_Transform)) + if (assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform)) { - Transform m_Father; - if (assetsfileList.TryGetTransform(m_Transform.m_Father, out m_Father)) + if (assetsfileList.TryGetTransform(m_Transform.m_Father, out var m_Father)) { //GameObject Parent; if (assetsfileList.TryGetGameObject(m_Father.m_GameObject, out parentNode)) @@ -413,7 +411,7 @@ namespace Unity_Studio if (File.Exists(mainPath + "\\materials.json")) { - string matLine = ""; + string matLine; using (StreamReader reader = File.OpenText(mainPath + "\\materials.json")) { matLine = reader.ReadToEnd(); } @@ -429,8 +427,7 @@ namespace Unity_Studio //group class structures by versionv foreach (var assetsFile in assetsfileList) { - SortedDictionary curVer; - if (AllClassStructures.TryGetValue(assetsFile.m_Version, out curVer)) + if (AllClassStructures.TryGetValue(assetsFile.m_Version, out var curVer)) { foreach (var uClass in assetsFile.ClassStructures) { @@ -491,14 +488,12 @@ namespace Unity_Studio { GameObjects.Add(m_GameObject); - AssetPreloadData MeshFilterPD; - if (assetsfileList.TryGetPD(m_GameObject.m_MeshFilter, out MeshFilterPD)) + if (assetsfileList.TryGetPD(m_GameObject.m_MeshFilter, out var MeshFilterPD)) { //MeshFilters are not unique! //MeshFilters.Add(MeshFilterPD); MeshFilter m_MeshFilter = new MeshFilter(MeshFilterPD); - AssetPreloadData MeshPD; - if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out MeshPD)) + if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out var MeshPD)) { Meshes.Add(MeshPD); @@ -510,15 +505,13 @@ namespace Unity_Studio } #region get Renderer - AssetPreloadData RendererPD; - if (assetsfileList.TryGetPD(m_GameObject.m_MeshRenderer, out RendererPD)) + if (assetsfileList.TryGetPD(m_GameObject.m_MeshRenderer, out var RendererPD)) { MeshRenderer m_Renderer = new MeshRenderer(RendererPD); foreach (var MaterialPPtr in m_Renderer.m_Materials) { - AssetPreloadData MaterialPD; - if (assetsfileList.TryGetPD(MaterialPPtr, out MaterialPD)) + if (assetsfileList.TryGetPD(MaterialPPtr, out var MaterialPD)) { Materials.Add(MaterialPD); cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name); @@ -526,11 +519,11 @@ namespace Unity_Studio } } } + #endregion #region get SkinnedMeshRenderer - AssetPreloadData SkinnedMeshPD; - if (assetsfileList.TryGetPD(m_GameObject.m_SkinnedMeshRenderer, out SkinnedMeshPD)) + if (assetsfileList.TryGetPD(m_GameObject.m_SkinnedMeshRenderer, out var SkinnedMeshPD)) { Skins.Add(SkinnedMeshPD); @@ -538,8 +531,7 @@ namespace Unity_Studio foreach (var MaterialPPtr in m_SkinnedMeshRenderer.m_Materials) { - AssetPreloadData MaterialPD; - if (assetsfileList.TryGetPD(MaterialPPtr, out MaterialPD)) + if (assetsfileList.TryGetPD(MaterialPPtr, out var MaterialPD)) { Materials.Add(MaterialPD); cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name); @@ -554,11 +546,9 @@ namespace Unity_Studio //collect skeleton dummies to make sure they are exported foreach (var bonePPtr in m_SkinnedMeshRenderer.m_Bones) { - Transform b_Transform; - if (assetsfileList.TryGetTransform(bonePPtr, out b_Transform)) + if (assetsfileList.TryGetTransform(bonePPtr, out var b_Transform)) { - GameObject m_Bone; - if (assetsfileList.TryGetGameObject(b_Transform.m_GameObject, out m_Bone)) + if (assetsfileList.TryGetGameObject(b_Transform.m_GameObject, out var m_Bone)) { LimbNodes.Add(m_Bone); //also collect the root bone @@ -569,11 +559,9 @@ namespace Unity_Studio #region collect children because m_SkinnedMeshRenderer.m_Bones doesn't contain terminations foreach (var ChildPPtr in b_Transform.m_Children) { - Transform ChildTR; - if (assetsfileList.TryGetTransform(ChildPPtr, out ChildTR)) + if (assetsfileList.TryGetTransform(ChildPPtr, out var ChildTR)) { - GameObject m_Child; - if (assetsfileList.TryGetGameObject(ChildTR.m_GameObject, out m_Child)) + if (assetsfileList.TryGetGameObject(ChildTR.m_GameObject, out var m_Child)) { //check that the Model doesn't contain a Mesh, although this won't ensure it's part of the skeleton if (m_Child.m_MeshFilter == null && m_Child.m_SkinnedMeshRenderer == null) @@ -662,15 +650,12 @@ namespace Unity_Studio #region write texture connections foreach (var m_TexEnv in m_Material.m_TexEnvs) { - AssetPreloadData TexturePD; #region get Porsche material from json - if (!assetsfileList.TryGetPD(m_TexEnv.m_Texture, out TexturePD) && jsonMats != null) + if (!assetsfileList.TryGetPD(m_TexEnv.m_Texture, out var TexturePD) && jsonMats != null) { - Dictionary matProp; - if (jsonMats.TryGetValue(m_Material.m_Name, out matProp)) + if (jsonMats.TryGetValue(m_Material.m_Name, out var matProp)) { - string texName; - if (matProp.TryGetValue(m_TexEnv.name, out texName)) + if (matProp.TryGetValue(m_TexEnv.name, out var texName)) { foreach (var asset in exportableAssets) { @@ -872,8 +857,7 @@ namespace Unity_Studio ob.Append("\n\t\t\tP: \"ScalingMax\", \"Vector3D\", \"Vector\", \"\",0,0,0"); ob.Append("\n\t\t\tP: \"DefaultAttributeIndex\", \"int\", \"Integer\", \"\",0"); - Transform m_Transform; - if (assetsfileList.TryGetTransform(m_GameObject.m_Transform, out m_Transform)) + if (assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform)) { float[] m_EulerRotation = QuatToEuler(new[] { m_Transform.m_LocalRotation[0], -m_Transform.m_LocalRotation[1], -m_Transform.m_LocalRotation[2], m_Transform.m_LocalRotation[3] }); @@ -929,10 +913,7 @@ namespace Unity_Studio foreach (var SkinnedMeshPD in Skins) { SkinnedMeshRenderer m_SkinnedMeshRenderer = new SkinnedMeshRenderer(SkinnedMeshPD); - - GameObject m_GameObject; - AssetPreloadData MeshPD; - if (assetsfileList.TryGetGameObject(m_SkinnedMeshRenderer.m_GameObject, out m_GameObject) && assetsfileList.TryGetPD(m_SkinnedMeshRenderer.m_Mesh, out MeshPD)) + if (assetsfileList.TryGetGameObject(m_SkinnedMeshRenderer.m_GameObject, out var m_GameObject) && assetsfileList.TryGetPD(m_SkinnedMeshRenderer.m_Mesh, out var MeshPD)) { //generate unique Geometry ID for instanced mesh objects //instanced skinned geometry is possible in FBX, but all instances are linked to the same skeleton nodes @@ -984,11 +965,9 @@ namespace Unity_Studio for (int b = 0; b < m_SkinnedMeshRenderer.m_Bones.Length; b++) { - Transform m_Transform; - if (assetsfileList.TryGetTransform(m_SkinnedMeshRenderer.m_Bones[b], out m_Transform)) + if (assetsfileList.TryGetTransform(m_SkinnedMeshRenderer.m_Bones[b], out var m_Transform)) { - GameObject m_Bone; - if (assetsfileList.TryGetGameObject(m_Transform.m_GameObject, out m_Bone)) + if (assetsfileList.TryGetGameObject(m_Transform.m_GameObject, out var m_Bone)) { int influences = 0, ibSplit = 0, wbSplit = 0; StringBuilder ib = new StringBuilder();//indices (vertex) @@ -1426,8 +1405,7 @@ namespace Unity_Studio ob.Append("\n\t\t\tVersion: 101"); ob.Append("\n\t\t\tName: \"\""); ob.Append("\n\t\t\tMappingInformationType: \""); - if (m_Mesh.m_SubMeshes.Count == 1) { ob.Append("AllSame\""); } - else { ob.Append("ByPolygon\""); } + ob.Append(m_Mesh.m_SubMeshes.Count == 1 ? "AllSame\"" : "ByPolygon\""); ob.Append("\n\t\t\tReferenceInformationType: \"IndexToDirect\""); ob.AppendFormat("\n\t\t\tMaterials: *{0} {{", m_Mesh.m_materialIDs.Count); ob.Append("\n\t\t\t\ta: "); @@ -1573,7 +1551,7 @@ namespace Unity_Studio eaz = 0; } - return new float[3] { (float)(eax * 180 / Math.PI), (float)(eay * 180 / Math.PI), (float)(eaz * 180 / Math.PI) }; + return new[] { (float)(eax * 180 / Math.PI), (float)(eay * 180 / Math.PI), (float)(eaz * 180 / Math.PI) }; } private static byte[] RandomColorGenerator(string name) @@ -1586,7 +1564,7 @@ namespace Unity_Studio byte green = (byte)r.Next(0, 255); byte blue = (byte)r.Next(0, 255); - return new byte[3] { red, green, blue }; + return new[] { red, green, blue }; } public static bool ExportTexture2D(AssetPreloadData asset, string exportPathName, bool flip) @@ -1647,12 +1625,9 @@ namespace Unity_Studio return false; if (convertfsb && oldextension == ".fsb") { - FMOD.System system; - FMOD.Sound sound; - FMOD.RESULT result; FMOD.CREATESOUNDEXINFO exinfo = new FMOD.CREATESOUNDEXINFO(); - result = FMOD.Factory.System_Create(out system); + var result = FMOD.Factory.System_Create(out var system); if (result != FMOD.RESULT.OK) { return false; } result = system.init(1, FMOD.INITFLAGS.NORMAL, IntPtr.Zero); @@ -1661,7 +1636,7 @@ namespace Unity_Studio exinfo.cbsize = Marshal.SizeOf(exinfo); exinfo.length = (uint)m_AudioClip.m_Size; - result = system.createSound(m_AudioClip.m_AudioData, FMOD.MODE.OPENMEMORY, ref exinfo, out sound); + result = system.createSound(m_AudioClip.m_AudioData, FMOD.MODE.OPENMEMORY, ref exinfo, out var sound); if (result != FMOD.RESULT.OK) { return false; } result = sound.getSubSound(0, out var subsound); diff --git a/Unity Studio/UnityStudioForm.Designer.cs b/Unity Studio/UnityStudioForm.Designer.cs index 864d89e..8c43b6f 100644 --- a/Unity Studio/UnityStudioForm.Designer.cs +++ b/Unity Studio/UnityStudioForm.Designer.cs @@ -721,6 +721,7 @@ this.glControl1.TabIndex = 4; this.glControl1.VSync = false; this.glControl1.Paint += new System.Windows.Forms.PaintEventHandler(this.glControl1_Paint); + this.glControl1.MouseWheel += new System.Windows.Forms.MouseEventHandler(glControl1_MouseWheel); // // classPreviewPanel // diff --git a/Unity Studio/UnityStudioForm.cs b/Unity Studio/UnityStudioForm.cs index dac9b05..243d195 100644 --- a/Unity Studio/UnityStudioForm.cs +++ b/Unity Studio/UnityStudioForm.cs @@ -22,7 +22,8 @@ namespace Unity_Studio private AssetPreloadData lastSelectedItem; private AssetPreloadData lastLoadedAsset; - private string[] fileTypes = { "globalgamemanagers", "maindata.", "level*.", "*.assets", "*.sharedAssets", "CustomAssetBundle-*", "CAB-*", "BuildPlayer-*" }; + private string[] assetsFileTypes = { "globalgamemanagers", "maindata.", "level*.", "*.assets", "*.sharedAssets", "CustomAssetBundle-*", "CAB-*", "BuildPlayer-*" }; + private string[] bundleFileTypes = { "*.unity3d", "*.unity3d.lz4", "*.assetbundle", "*.assetbundle-*", "*.bundle", "*.bytes" }; private FMOD.System system; private FMOD.Sound sound; @@ -153,9 +154,9 @@ namespace Unity_Studio MergeSplitAssets(mainPath); - for (int t = 0; t < fileTypes.Length; t++) + for (int t = 0; t < assetsFileTypes.Length; t++) { - string[] fileNames = Directory.GetFiles(mainPath, fileTypes[t], SearchOption.AllDirectories); + string[] fileNames = Directory.GetFiles(mainPath, assetsFileTypes[t], SearchOption.AllDirectories); #region sort specific types alphanumerically if (fileNames.Length > 0 && (t == 1 || t == 2)) { @@ -231,7 +232,7 @@ namespace Unity_Studio extractedCount += extractBundleFile(fileName); ProgressBarPerformStep(); } - StatusStripUpdate("Finished extracting " + extractedCount + " files."); + StatusStripUpdate($"Finished extracting {extractedCount} files."); }); } } @@ -245,8 +246,7 @@ namespace Unity_Studio if (openFolderDialog1.ShowDialog(this) == DialogResult.OK) { string startPath = openFolderDialog1.Folder; - string[] fileTypes = new string[6] { "*.unity3d", "*.unity3d.lz4", "*.assetbundle", "*.assetbundle-*", "*.bundle", "*.bytes" }; - foreach (var fileType in fileTypes) + foreach (var fileType in bundleFileTypes) { string[] fileNames = Directory.GetFiles(startPath, fileType, SearchOption.AllDirectories); bundleFiles.AddRange(fileNames); @@ -260,7 +260,7 @@ namespace Unity_Studio extractedCount += extractBundleFile(fileName); ProgressBarPerformStep(); } - StatusStripUpdate("Finished extracting " + extractedCount + " files."); + StatusStripUpdate($"Finished extracting {extractedCount} files."); }); } } @@ -278,11 +278,11 @@ namespace Unity_Studio { if (productName != "") { - Text = "Unity Studio - " + productName + " - " + assetsfileList[0].m_Version + " - " + assetsfileList[0].platformStr; + Text = $"Unity Studio - {productName} - {assetsfileList[0].m_Version} - {assetsfileList[0].platformStr}"; } else if (assetsfileList.Count > 0) { - Text = "Unity Studio - no productName - " + assetsfileList[0].m_Version + " - " + assetsfileList[0].platformStr; + Text = $"Unity Studio - no productName - {assetsfileList[0].m_Version} - {assetsfileList[0].platformStr}"; } if (!dontLoadAssetsMenuItem.Checked) { @@ -312,7 +312,7 @@ namespace Unity_Studio } classesListView.EndUpdate(); } - StatusStripUpdate("Finished loading " + assetsfileList.Count + " files with " + (assetListView.Items.Count + sceneTreeView.Nodes.Count) + " exportable assets."); + StatusStripUpdate($"Finished loading {assetsfileList.Count} files with {assetListView.Items.Count} exportable assets."); treeSearch.Select(); })); } @@ -329,88 +329,73 @@ namespace Unity_Studio else { tabControl1.TabPages.Add(tabPage3); } } - if (glControl1.Visible == true) + if (glControl1.Visible) { - // --> Right - if (e.KeyCode == Keys.D) + switch (e.KeyCode) { - if (e.Shift) //Move - { - viewMatrixData *= Matrix4.CreateTranslation(0.1f, 0, 0); - } - else //Rotate - { - viewMatrixData *= Matrix4.CreateRotationY(0.1f); - } - glControl1.Invalidate(); - } - - // <-- Left - if (e.KeyCode == Keys.A) - { - if (e.Shift) //Move - { - viewMatrixData *= Matrix4.CreateTranslation(-0.1f, 0, 0); - } - else //Rotate - { - viewMatrixData *= Matrix4.CreateRotationY(-0.1f); - } - glControl1.Invalidate(); - } - - // Up - if (e.KeyCode == Keys.W) - { - if (e.Control) //Toggle WireFrame - { - wireFrameMode = (wireFrameMode + 1) % 3; + case Keys.D: // --> Right + if (e.Shift) //Move + { + viewMatrixData *= Matrix4.CreateTranslation(0.1f, 0, 0); + } + else //Rotate + { + viewMatrixData *= Matrix4.CreateRotationY(0.1f); + } glControl1.Invalidate(); - } - else if (e.Shift) //Move - { - viewMatrixData *= Matrix4.CreateTranslation(0, 0.1f, 0); - } - else //Rotate - { - viewMatrixData *= Matrix4.CreateRotationX(0.1f); - } - glControl1.Invalidate(); - } - - // Down - if (e.KeyCode == Keys.S) - { - if (e.Control) //Toggle Shade - { - shadeMode = (shadeMode + 1) % 2; + break; + case Keys.A: // <-- Left + if (e.Shift) //Move + { + viewMatrixData *= Matrix4.CreateTranslation(-0.1f, 0, 0); + } + else //Rotate + { + viewMatrixData *= Matrix4.CreateRotationY(-0.1f); + } glControl1.Invalidate(); - } - else if (e.Shift) //Move - { - viewMatrixData *= Matrix4.CreateTranslation(0, -0.1f, 0); - } - else //Rotate - { - viewMatrixData *= Matrix4.CreateRotationX(-0.1f); - } - glControl1.Invalidate(); + break; + case Keys.W: // Up + if (e.Control) //Toggle WireFrame + { + wireFrameMode = (wireFrameMode + 1) % 3; + glControl1.Invalidate(); + } + else if (e.Shift) //Move + { + viewMatrixData *= Matrix4.CreateTranslation(0, 0.1f, 0); + } + else //Rotate + { + viewMatrixData *= Matrix4.CreateRotationX(0.1f); + } + glControl1.Invalidate(); + break; + case Keys.S: // Down + if (e.Control) //Toggle Shade + { + shadeMode = (shadeMode + 1) % 2; + glControl1.Invalidate(); + } + else if (e.Shift) //Move + { + viewMatrixData *= Matrix4.CreateTranslation(0, -0.1f, 0); + } + else //Rotate + { + viewMatrixData *= Matrix4.CreateRotationX(-0.1f); + } + glControl1.Invalidate(); + break; + case Keys.Q: // Zoom Out + viewMatrixData *= Matrix4.CreateScale(0.9f); + glControl1.Invalidate(); + break; + case Keys.E: // Zoom In + viewMatrixData *= Matrix4.CreateScale(1.1f); + glControl1.Invalidate(); + break; } - - // Zoom Out - if (e.KeyCode == Keys.Q) - { - viewMatrixData *= Matrix4.CreateScale(0.9f); - glControl1.Invalidate(); - } - - // Zoom In - if (e.KeyCode == Keys.E) - { - viewMatrixData *= Matrix4.CreateScale(1.1f); - glControl1.Invalidate(); - } - // Normal mode if (e.Control && e.KeyCode == Keys.N) { @@ -418,7 +403,6 @@ namespace Unity_Studio createVAO(); glControl1.Invalidate(); } - // Toggle Timer if (e.KeyCode == Keys.T) { @@ -457,7 +441,7 @@ namespace Unity_Studio foreach (var uclass in version.Value) { - string saveFile = versionPath + "\\" + uclass.Key + " " + uclass.Value.Text + ".txt"; + string saveFile = $"{versionPath}\\{uclass.Key} {uclass.Value.Text}.txt"; using (StreamWriter TXTwriter = new StreamWriter(saveFile)) { TXTwriter.Write(uclass.Value.membersstr); @@ -507,10 +491,7 @@ namespace Unity_Studio if (sound != null && channel != null) { - FMOD.RESULT result; - - bool playing = false; - result = channel.isPlaying(out playing); + var result = channel.isPlaying(out var playing); if (result == FMOD.RESULT.OK && playing) { result = channel.stop(); @@ -823,8 +804,7 @@ namespace Unity_Studio #region Texture2D case 28: //Texture2D { - if (imageTexture != null) - imageTexture.Dispose(); + imageTexture?.Dispose(); var m_Texture2D = new Texture2D(asset, true); imageTexture = m_Texture2D.ConvertToBitmap(true); if (imageTexture != null) @@ -848,17 +828,15 @@ namespace Unity_Studio AudioClip m_AudioClip = new AudioClip(asset, true); if (m_AudioClip.m_AudioData == null) break; - FMOD.RESULT result; FMOD.CREATESOUNDEXINFO exinfo = new FMOD.CREATESOUNDEXINFO(); exinfo.cbsize = Marshal.SizeOf(exinfo); exinfo.length = (uint)m_AudioClip.m_Size; - result = system.createSound(m_AudioClip.m_AudioData, (FMOD.MODE.OPENMEMORY | loopMode), ref exinfo, out sound); + var result = system.createSound(m_AudioClip.m_AudioData, FMOD.MODE.OPENMEMORY | loopMode, ref exinfo, out sound); if (ERRCHECK(result)) { break; } - FMOD.Sound subsound; - result = sound.getSubSound(0, out subsound); + result = sound.getSubSound(0, out var subsound); if (result == FMOD.RESULT.OK) { sound = subsound; @@ -876,7 +854,7 @@ namespace Unity_Studio if (ERRCHECK(result)) { break; } FMODinfoLabel.Text = FMODfrequency + " Hz"; - FMODtimerLabel.Text = "0:0.0 / " + (FMODlenms / 1000 / 60) + ":" + (FMODlenms / 1000 % 60) + "." + (FMODlenms / 10 % 100); + FMODtimerLabel.Text = $"0:0.0 / {FMODlenms / 1000 / 60}:{FMODlenms / 1000 % 60}.{FMODlenms / 10 % 100}"; break; } #endregion @@ -1013,7 +991,6 @@ namespace Unity_Studio offset[i] = (max[i] + min[i]) / 2; } float d = Math.Max(1e-5f, dist.Length); - Vector3 scale = new Vector3(2f / d); modelMatrixData = Matrix4.CreateTranslation(-offset) * Matrix4.CreateScale(2f / d); #endregion #region Indicies @@ -1140,17 +1117,14 @@ namespace Unity_Studio { FMODreset(); - FMOD.RESULT result; - uint version = 0; - - result = FMOD.Factory.System_Create(out system); + var result = FMOD.Factory.System_Create(out system); if (ERRCHECK(result)) { return; } - result = system.getVersion(out version); + result = system.getVersion(out var version); ERRCHECK(result); if (version < FMOD.VERSION.number) { - MessageBox.Show("Error! You are using an old version of FMOD " + version.ToString("X") + ". This program requires " + FMOD.VERSION.number.ToString("X") + "."); + MessageBox.Show($"Error! You are using an old version of FMOD {version:X}. This program requires {FMOD.VERSION.number:X}."); Application.Exit(); } @@ -1182,12 +1156,10 @@ namespace Unity_Studio private void FMODplayButton_Click(object sender, EventArgs e) { - FMOD.RESULT result; if (sound != null && channel != null) { timer.Start(); - bool playing = false; - result = channel.isPlaying(out playing); + var result = channel.isPlaying(out var playing); if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE)) { if (ERRCHECK(result)) { return; } @@ -1226,14 +1198,9 @@ namespace Unity_Studio private void FMODpauseButton_Click(object sender, EventArgs e) { - FMOD.RESULT result; - if (sound != null && channel != null) { - bool playing = false; - bool paused = false; - - result = channel.isPlaying(out playing); + var result = channel.isPlaying(out var playing); if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE)) { if (ERRCHECK(result)) { return; } @@ -1241,14 +1208,14 @@ namespace Unity_Studio if (playing) { - result = channel.getPaused(out paused); + result = channel.getPaused(out var paused); if (ERRCHECK(result)) { return; } result = channel.setPaused(!paused); if (ERRCHECK(result)) { return; } if (paused) { - FMODstatusLabel.Text = (playing ? "Playing" : "Stopped"); + FMODstatusLabel.Text = "Playing"; FMODpauseButton.Text = "Pause"; timer.Start(); } @@ -1264,11 +1231,9 @@ namespace Unity_Studio private void FMODstopButton_Click(object sender, EventArgs e) { - FMOD.RESULT result; if (channel != null) { - bool playing = false; - result = channel.isPlaying(out playing); + var result = channel.isPlaying(out var playing); if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE)) { if (ERRCHECK(result)) { return; } @@ -1293,14 +1258,7 @@ namespace Unity_Studio { FMOD.RESULT result; - if (FMODloopButton.Checked) - { - loopMode = FMOD.MODE.LOOP_NORMAL; - } - else - { - loopMode = FMOD.MODE.LOOP_OFF; - } + loopMode = FMODloopButton.Checked ? FMOD.MODE.LOOP_NORMAL : FMOD.MODE.LOOP_OFF; if (sound != null) { @@ -1310,15 +1268,13 @@ namespace Unity_Studio if (channel != null) { - bool playing = false; - result = channel.isPlaying(out playing); + result = channel.isPlaying(out var playing); if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE)) { if (ERRCHECK(result)) { return; } } - bool paused = false; - result = channel.getPaused(out paused); + result = channel.getPaused(out var paused); if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE)) { if (ERRCHECK(result)) { return; } @@ -1334,10 +1290,9 @@ namespace Unity_Studio private void FMODvolumeBar_ValueChanged(object sender, EventArgs e) { - FMOD.RESULT result; FMODVolume = Convert.ToSingle(FMODvolumeBar.Value) / 10; - result = masterSoundGroup.setVolume(FMODVolume); + var result = masterSoundGroup.setVolume(FMODVolume); if (ERRCHECK(result)) { return; } } @@ -1346,7 +1301,7 @@ namespace Unity_Studio if (channel != null) { uint newms = FMODlenms / 1000 * (uint)FMODprogressBar.Value; - FMODtimerLabel.Text = (newms / 1000 / 60) + ":" + (newms / 1000 % 60) + "." + (newms / 10 % 100) + "/" + (FMODlenms / 1000 / 60) + ":" + (FMODlenms / 1000 % 60) + "." + (FMODlenms / 10 % 100); + FMODtimerLabel.Text = $"{newms / 1000 / 60}:{newms / 1000 % 60}.{newms / 10 % 100}/{FMODlenms / 1000 / 60}:{FMODlenms / 1000 % 60}.{FMODlenms / 10 % 100}"; } } @@ -1359,19 +1314,16 @@ namespace Unity_Studio { if (channel != null) { - FMOD.RESULT result; - uint newms = FMODlenms / 1000 * (uint)FMODprogressBar.Value; - result = channel.setPosition(newms, FMOD.TIMEUNIT.MS); + var result = channel.setPosition(newms, FMOD.TIMEUNIT.MS); if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE)) { if (ERRCHECK(result)) { return; } } - bool playing = false; - result = channel.isPlaying(out playing); + result = channel.isPlaying(out var playing); if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE)) { if (ERRCHECK(result)) { return; } @@ -1383,14 +1335,13 @@ namespace Unity_Studio private void timer_Tick(object sender, EventArgs e) { - FMOD.RESULT result; uint ms = 0; bool playing = false; bool paused = false; if (channel != null) { - result = channel.getPosition(out ms, FMOD.TIMEUNIT.MS); + var result = channel.getPosition(out ms, FMOD.TIMEUNIT.MS); if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE)) { ERRCHECK(result); @@ -1409,9 +1360,9 @@ namespace Unity_Studio } } - FMODtimerLabel.Text = (ms / 1000 / 60) + ":" + (ms / 1000 % 60) + "." + (ms / 10 % 100) + " / " + (FMODlenms / 1000 / 60) + ":" + (FMODlenms / 1000 % 60) + "." + (FMODlenms / 10 % 100); + FMODtimerLabel.Text = $"{ms / 1000 / 60}:{ms / 1000 % 60}.{ms / 10 % 100} / {FMODlenms / 1000 / 60}:{FMODlenms / 1000 % 60}.{FMODlenms / 10 % 100}"; FMODprogressBar.Value = (int)(ms * 1000 / FMODlenms); - FMODstatusLabel.Text = (paused ? "Paused " : playing ? "Playing" : "Stopped"); + FMODstatusLabel.Text = paused ? "Paused " : playing ? "Playing" : "Stopped"; if (system != null && channel != null) { @@ -1424,7 +1375,7 @@ namespace Unity_Studio if (result != FMOD.RESULT.OK) { FMODreset(); - StatusStripUpdate("FMOD error! " + result + " - " + FMOD.Error.String(result)); + StatusStripUpdate($"FMOD error! {result} - {FMOD.Error.String(result)}"); return true; } return false; @@ -1502,7 +1453,7 @@ namespace Unity_Studio { if (sceneTreeView.Nodes.Count > 0) { - bool exportSwitch = (((ToolStripItem)sender).Name == "exportAll3DMenuItem") ? true : false; + bool exportSwitch = ((ToolStripItem)sender).Name == "exportAll3DMenuItem"; var timestamp = DateTime.Now; @@ -1543,21 +1494,21 @@ namespace Unity_Studio { timer.Stop(); List toExportAssets = null; - if (((ToolStripItem)sender).Name == "exportAllAssetsMenuItem") + switch (((ToolStripItem)sender).Name) { - toExportAssets = exportableAssets; - } - else if (((ToolStripItem)sender).Name == "exportFilteredAssetsMenuItem") - { - toExportAssets = visibleAssets; - } - else if (((ToolStripItem)sender).Name == "exportSelectedAssetsMenuItem") - { - toExportAssets = new List(assetListView.SelectedIndices.Count); - foreach (var i in assetListView.SelectedIndices.OfType()) - { - toExportAssets.Add((AssetPreloadData)assetListView.Items[i]); - } + case "exportAllAssetsMenuItem": + toExportAssets = exportableAssets; + break; + case "exportFilteredAssetsMenuItem": + toExportAssets = visibleAssets; + break; + case "exportSelectedAssetsMenuItem": + toExportAssets = new List(assetListView.SelectedIndices.Count); + foreach (var i in assetListView.SelectedIndices.OfType()) + { + toExportAssets.Add((AssetPreloadData)assetListView.Items[i]); + } + break; } int assetGroupSelectedIndex = assetGroupOptions.SelectedIndex; @@ -1578,7 +1529,7 @@ namespace Unity_Studio string exportpath = savePath + "\\"; if (assetGroupSelectedIndex == 1) { exportpath += Path.GetFileNameWithoutExtension(asset.sourceFile.filePath) + "_export\\"; } else if (assetGroupSelectedIndex == 0) { exportpath = savePath + "\\" + asset.TypeString + "\\"; } - StatusStripUpdate("Exporting " + asset.TypeString + ": " + asset.Text); + StatusStripUpdate($"Exporting {asset.TypeString}: {asset.Text}"); switch (asset.Type2) { case 28: //Texture2D @@ -1645,18 +1596,18 @@ namespace Unity_Studio } ProgressBarPerformStep(); } - string statusText = ""; + string statusText; switch (exportedCount) { case 0: statusText = "Nothing exported."; break; default: - statusText = "Finished exporting " + exportedCount + " assets."; + statusText = $"Finished exporting {exportedCount} assets."; break; } - if (toExport > exportedCount) { statusText += " " + (toExport - exportedCount) + " assets skipped (not extractable or files already exist)"; } + if (toExport > exportedCount) { statusText += $" {toExport - exportedCount} assets skipped (not extractable or files already exist)"; } StatusStripUpdate(statusText); @@ -1750,7 +1701,7 @@ namespace Unity_Studio private void timerOpenTK_Tick(object sender, EventArgs e) { - if (glControl1.Visible == true) + if (glControl1.Visible) { viewMatrixData *= Matrix4.CreateRotationY(-0.1f); glControl1.Invalidate(); @@ -1761,11 +1712,9 @@ namespace Unity_Studio { GL.Viewport(0, 0, glControl1.ClientSize.Width, glControl1.ClientSize.Height); GL.ClearColor(Color.CadetBlue); - int vsID, fsID; - pgmID = GL.CreateProgram(); - loadShader("vs", ShaderType.VertexShader, pgmID, out vsID); - loadShader("fs", ShaderType.FragmentShader, pgmID, out fsID); + loadShader("vs", ShaderType.VertexShader, pgmID, out int vsID); + loadShader("fs", ShaderType.FragmentShader, pgmID, out int fsID); GL.LinkProgram(pgmID); pgmColorID = GL.CreateProgram(); @@ -1948,5 +1897,14 @@ namespace Unity_Studio contextMenuStrip1.Show(assetListView, e.X, e.Y); } } + + private void glControl1_MouseWheel(object sender, MouseEventArgs e) + { + if (glControl1.Visible) + { + viewMatrixData *= Matrix4.CreateScale(1 + e.Delta / 1000f); + glControl1.Invalidate(); + } + } } }