diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index eba1110..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d16fd75 --- /dev/null +++ b/.gitignore @@ -0,0 +1,68 @@ +#Ignore thumbnails created by windows +Thumbs.db + +#Ignore files built by Visual Studio +*.user +.obj +.exe +.pdb +.user +.aps +.pch +.vspscc +_i.c +_p.c +.ncb +.suo +.tlb +.tlh +.bak +.cache +.ilk +.log +.vs +[Bb]in +[Dd]ebug +.lib +.sbr +obj +[Rr]elease +_ReSharper +[Tt]est[Rr]esult + +#Ignore packages directory +Packages + +#Allow NuGet.exe +!NuGet.exe + +#Ignore generated nupkg files +.nupkg + +#Allow released nupkg files +!VisualStudioGitIgnore.1.0.nupkg +!VisualStudioGitIgnore.1.1.nupkg +!VisualStudioGitIgnore.1.2.nupkg + +#Ignore local testsettings +Local.testsettings + +#Allow R# .DotSettings +!.csproj.DotSettings + +#Ignore Azure build csdef & Pubxml files +ServiceDefinition.build.csdef +.azurePubxml +UCosmic.Www.Mvc.Publish.xml + +#Ignore WebDeploy publish profile +.Publish.xml + +#Ignore email files delivered to specified pickup directory +.eml + +#Allow chromedriver.exe +!chromedriver.exe + +#Ignore private folder +Private \ No newline at end of file diff --git a/README.md b/README.md index ee65453..81ad6e7 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ # SCPAK +一个[Scpaker](https://github.com/CXHGT/SCPAK)的fork diff --git a/SCPAK.sln b/SCPAK.sln index 454363c..85433f2 100644 --- a/SCPAK.sln +++ b/SCPAK.sln @@ -9,26 +9,50 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SCPaker", "SCPaker\SCPaker\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SCPAK", "SCPAK\SCPAK.csproj", "{D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SCPacker.NET", "SCPacker.NET\SCPacker.NET.csproj", "{12D66A9B-F60F-4E22-A318-907B8B58B0D6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU + Debug45|Any CPU = Debug45|Any CPU + Release45|Any CPU = Release45|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {62727A07-1870-4CDD-80ED-335537D33E99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62727A07-1870-4CDD-80ED-335537D33E99}.Debug|Any CPU.Build.0 = Debug|Any CPU {62727A07-1870-4CDD-80ED-335537D33E99}.Release|Any CPU.ActiveCfg = Release|Any CPU {62727A07-1870-4CDD-80ED-335537D33E99}.Release|Any CPU.Build.0 = Release|Any CPU + {62727A07-1870-4CDD-80ED-335537D33E99}.Debug45|Any CPU.ActiveCfg = Debug|Any CPU + {62727A07-1870-4CDD-80ED-335537D33E99}.Debug45|Any CPU.Build.0 = Debug|Any CPU + {62727A07-1870-4CDD-80ED-335537D33E99}.Release45|Any CPU.ActiveCfg = Debug|Any CPU + {62727A07-1870-4CDD-80ED-335537D33E99}.Release45|Any CPU.Build.0 = Debug|Any CPU {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Debug|Any CPU.Build.0 = Debug|Any CPU {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Release|Any CPU.ActiveCfg = Release|Any CPU {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Release|Any CPU.Build.0 = Release|Any CPU {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Release|Any CPU.Deploy.0 = Release|Any CPU + {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Debug45|Any CPU.ActiveCfg = Debug|Any CPU + {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Debug45|Any CPU.Build.0 = Debug|Any CPU + {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Release45|Any CPU.ActiveCfg = Debug|Any CPU + {2C3C319C-AAB2-4064-9C8D-3F398C8F8EDB}.Release45|Any CPU.Build.0 = Debug|Any CPU {D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}.Debug|Any CPU.Build.0 = Debug|Any CPU {D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}.Release|Any CPU.ActiveCfg = Release|Any CPU {D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}.Release|Any CPU.Build.0 = Release|Any CPU + {D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}.Debug45|Any CPU.ActiveCfg = Debug|Any CPU + {D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}.Debug45|Any CPU.Build.0 = Debug|Any CPU + {D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}.Release45|Any CPU.ActiveCfg = Debug|Any CPU + {D34AD991-8EDF-4C2E-A8FE-57D2142B34C7}.Release45|Any CPU.Build.0 = Debug|Any CPU + {12D66A9B-F60F-4E22-A318-907B8B58B0D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {12D66A9B-F60F-4E22-A318-907B8B58B0D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12D66A9B-F60F-4E22-A318-907B8B58B0D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12D66A9B-F60F-4E22-A318-907B8B58B0D6}.Release|Any CPU.Build.0 = Release|Any CPU + {12D66A9B-F60F-4E22-A318-907B8B58B0D6}.Debug45|Any CPU.ActiveCfg = Debug|Any CPU + {12D66A9B-F60F-4E22-A318-907B8B58B0D6}.Debug45|Any CPU.Build.0 = Debug|Any CPU + {12D66A9B-F60F-4E22-A318-907B8B58B0D6}.Release45|Any CPU.ActiveCfg = Debug|Any CPU + {12D66A9B-F60F-4E22-A318-907B8B58B0D6}.Release45|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SCPAK/Engine/Collada.cs b/SCPAK/Engine/Collada.cs index 55c291f..b323528 100644 --- a/SCPAK/Engine/Collada.cs +++ b/SCPAK/Engine/Collada.cs @@ -1,777 +1,832 @@ -using System; -using System.IO; -using System.Collections.Generic; -using System.Xml.Linq; -using System.Linq; -using System.Globalization; -namespace Engine -{ - public static class Collada - { - // - // Static Methods - // - static T[] ExtendArray(T[] array, int extensionLength) - { - T[] array2 = new T[array.Length + extensionLength]; - Array.Copy(array, array2, array.Length); - return array2; - } - - static void IndexVertices(int vertexStride, byte[] vertices, out byte[] resultVertices, out byte[] resultIndices) - { - int num = vertices.Length / vertexStride; - Dictionary dictionary = new Dictionary(); - resultIndices = new byte[2 * num]; - for (int i = 0; i < num; i++) - { - Vertex key = new Vertex(vertices, i * vertexStride, vertexStride); - ushort num2; - if (!dictionary.TryGetValue(key, out num2)) - { - num2 = (ushort)dictionary.Count; - dictionary.Add(key, num2); - } - resultIndices[i * 2] = (byte)num2; - resultIndices[i * 2 + 1] = (byte)(num2 >> 8); - } - resultVertices = new byte[dictionary.Count * vertexStride]; - foreach (KeyValuePair current in dictionary) - { - Vertex key2 = current.Key; - ushort value = current.Value; - Array.Copy(key2.Data, key2.Start, resultVertices, (int)value * vertexStride, key2.Count); - } - } - - public static ModelData Load(Stream stream) - { - ModelData modelData = new ModelData(); - ColladaRoot colladaRoot = new ColladaRoot(XElement.Load(stream)); - if (colladaRoot.Scene.VisualScene.Nodes.Count > 1) - { - ModelBoneData modelBoneData = new ModelBoneData(); - modelData.Bones.Add(modelBoneData); - modelBoneData.ParentBoneIndex = -1; - modelBoneData.Name = string.Empty; - modelBoneData.Transform = Matrix.Identity; - using (List.Enumerator enumerator = colladaRoot.Scene.VisualScene.Nodes.GetEnumerator()) - { - while (enumerator.MoveNext()) - { - ColladaNode current = enumerator.Current; - LoadNode(modelData, modelBoneData, current, colladaRoot.Asset.Meter); - } - goto IL_F7; - } - } - foreach (ColladaNode current2 in colladaRoot.Scene.VisualScene.Nodes) - { - LoadNode(modelData, null, current2, colladaRoot.Asset.Meter); - } - IL_F7: - foreach (ModelBuffersData current3 in modelData.Buffers) - { - IndexVertices(current3.VertexDeclaration.VertexStride, current3.Vertices, out current3.Vertices, out current3.Indices); - } - return modelData; - } - - static ModelMeshData LoadGeometry(ModelData data, ModelBoneData parentBoneData, ColladaGeometry geometry) - { - ModelMeshData modelMeshData = new ModelMeshData(); - data.Meshes.Add(modelMeshData); - modelMeshData.Name = parentBoneData.Name; - modelMeshData.ParentBoneIndex = data.Bones.IndexOf(parentBoneData); - bool flag = false; - foreach (ColladaPolygons current in geometry.Mesh.Polygons) - { - ModelMeshPartData modelMeshPartData = LoadPolygons(data, current); - modelMeshData.MeshParts.Add(modelMeshPartData); - modelMeshData.BoundingBox = (flag ? BoundingBox.Union(modelMeshData.BoundingBox, modelMeshPartData.BoundingBox) : modelMeshPartData.BoundingBox); - flag = true; - } - return modelMeshData; - } - - static ModelBoneData LoadNode(ModelData data, ModelBoneData parentBoneData, ColladaNode node, float meter) - { - ModelBoneData modelBoneData = new ModelBoneData(); - data.Bones.Add(modelBoneData); - modelBoneData.ParentBoneIndex = ((parentBoneData != null) ? data.Bones.IndexOf(parentBoneData) : (-1)); - modelBoneData.Name = node.Name; - modelBoneData.Transform = node.Transform * Matrix.CreateScale(meter); - foreach (ColladaNode current in node.Nodes) - { - LoadNode(data, modelBoneData, current, 1f); - } - foreach (ColladaGeometry current2 in node.Geometries) - { - LoadGeometry(data, modelBoneData, current2); - } - return modelBoneData; - } - - static ModelMeshPartData LoadPolygons(ModelData data, ColladaPolygons polygons) - { - c__DisplayClass3_0 c__DisplayClass3_ = new c__DisplayClass3_0(); - ModelMeshPartData modelMeshPartData = new ModelMeshPartData(); - int num = 0; - Dictionary dictionary = new Dictionary(); - foreach (ColladaInput current in polygons.Inputs) - { - string str = (current.Set == 0) ? string.Empty : current.Set.ToString(CultureInfo.InvariantCulture); - if (current.Semantic == "POSITION") - { - dictionary[new VertexElement(num, VertexElementFormat.Vector3, "POSITION" + str)] = current; - num += 12; - } - else if (current.Semantic == "NORMAL") - { - dictionary[new VertexElement(num, VertexElementFormat.Vector3, "NORMAL" + str)] = current; - num += 12; - } - else if (current.Semantic == "TEXCOORD") - { - dictionary[new VertexElement(num, VertexElementFormat.Vector2, "TEXCOORD" + str)] = current; - num += 8; - } - else if (current.Semantic == "COLOR") - { - dictionary[new VertexElement(num, VertexElementFormat.NormalizedByte4, "COLOR" + str)] = current; - num += 4; - } - } - c__DisplayClass3_.vertexDeclaration = new VertexDeclaration(dictionary.Keys.ToArray()); - ModelBuffersData modelBuffersData = data.Buffers.FirstOrDefault(new Func(c__DisplayClass3_.b__0)); - if (modelBuffersData == null) - { - modelBuffersData = new ModelBuffersData(); - data.Buffers.Add(modelBuffersData); - modelBuffersData.VertexDeclaration = c__DisplayClass3_.vertexDeclaration; - } - modelMeshPartData.BuffersDataIndex = data.Buffers.IndexOf(modelBuffersData); - int num2 = polygons.P.Count / polygons.Inputs.Count; - List list = new List(); - if (polygons.VCount.Count == 0) - { - int num3 = 0; - for (int i = 0; i < num2 / 3; i++) - { - list.Add(num3); - list.Add(num3 + 2); - list.Add(num3 + 1); - num3 += 3; - } - } - else - { - int num4 = 0; - foreach (int current2 in polygons.VCount) - { - if (current2 == 3) - { - list.Add(num4); - list.Add(num4 + 2); - list.Add(num4 + 1); - num4 += 3; - } - else - { - if (current2 != 4) - { - throw new NotSupportedException("Collada polygons with less than 3 or more than 4 vertices are not supported."); - } - list.Add(num4); - list.Add(num4 + 2); - list.Add(num4 + 1); - list.Add(num4 + 2); - list.Add(num4); - list.Add(num4 + 3); - num4 += 4; - } - } - } - int vertexStride = modelBuffersData.VertexDeclaration.VertexStride; - int num5 = modelBuffersData.Vertices.Length; - modelBuffersData.Vertices = ExtendArray(modelBuffersData.Vertices, list.Count * vertexStride); - using (BinaryWriter binaryWriter = new BinaryWriter(new MemoryStream(modelBuffersData.Vertices, num5, list.Count * vertexStride))) - { - bool flag = false; - foreach (KeyValuePair current3 in dictionary) - { - VertexElement key = current3.Key; - ColladaInput value = current3.Value; - if (key.Semantic.StartsWith("POSITION")) - { - for (int j = 0; j < list.Count; j++) - { - float[] arg_3EF_0 = value.Source.Accessor.Source.Array; - int offset = value.Source.Accessor.Offset; - int stride = value.Source.Accessor.Stride; - int num6 = polygons.P[list[j] * polygons.Inputs.Count + value.Offset]; - binaryWriter.BaseStream.Position = (long)(j * vertexStride + key.Offset); - float num7 = arg_3EF_0[offset + stride * num6]; - float num8 = arg_3EF_0[offset + stride * num6 + 1]; - float num9 = arg_3EF_0[offset + stride * num6 + 2]; - modelMeshPartData.BoundingBox = (flag ? BoundingBox.Union(modelMeshPartData.BoundingBox, new Vector3(num7, num8, num9)) : new BoundingBox(num7, num8, num9, num7, num8, num9)); - flag = true; - binaryWriter.Write(num7); - binaryWriter.Write(num8); - binaryWriter.Write(num9); - } - } - else if (key.Semantic.StartsWith("NORMAL")) - { - for (int k = 0; k < list.Count; k++) - { - float[] arg_51E_0 = value.Source.Accessor.Source.Array; - int offset2 = value.Source.Accessor.Offset; - int stride2 = value.Source.Accessor.Stride; - int num10 = polygons.P[list[k] * polygons.Inputs.Count + value.Offset]; - binaryWriter.BaseStream.Position = (long)(k * vertexStride + key.Offset); - float num11 = arg_51E_0[offset2 + stride2 * num10]; - float num12 = arg_51E_0[offset2 + stride2 * num10 + 1]; - float num13 = arg_51E_0[offset2 + stride2 * num10 + 2]; - float num14 = 1f / MathUtils.Sqrt(num11 * num11 + num12 * num12 + num13 * num13); - binaryWriter.Write(num14 * num11); - binaryWriter.Write(num14 * num12); - binaryWriter.Write(num14 * num13); - } - } - else if (key.Semantic.StartsWith("TEXCOORD")) - { - for (int l = 0; l < list.Count; l++) - { - float[] array = value.Source.Accessor.Source.Array; - int offset3 = value.Source.Accessor.Offset; - int stride3 = value.Source.Accessor.Stride; - int num15 = polygons.P[list[l] * polygons.Inputs.Count + value.Offset]; - binaryWriter.BaseStream.Position = (long)(l * vertexStride + key.Offset); - binaryWriter.Write(array[offset3 + stride3 * num15]); - binaryWriter.Write(1f - array[offset3 + stride3 * num15 + 1]); - } - } - else - { - if (!key.Semantic.StartsWith("COLOR")) - { - throw new Exception(); - } - for (int m = 0; m < list.Count; m++) - { - float[] array2 = value.Source.Accessor.Source.Array; - int offset4 = value.Source.Accessor.Offset; - int stride4 = value.Source.Accessor.Stride; - int num16 = polygons.P[list[m] * polygons.Inputs.Count + value.Offset]; - binaryWriter.BaseStream.Position = (long)(m * vertexStride + key.Offset); - Color color = new Color(array2[offset4 + stride4 * num16], array2[offset4 + stride4 * num16 + 1], array2[offset4 + stride4 * num16 + 2], array2[offset4 + stride4 * num16 + 3]); - binaryWriter.Write(color.PackedValue); - } - } - } - } - modelMeshPartData.StartIndex = num5 / vertexStride; - modelMeshPartData.IndicesCount = list.Count; - return modelMeshPartData; - } - - // - // Nested Types - // - class Asset - { - public readonly float Meter = 1f; - - public Asset(XElement node) - { - XElement xElement = node.Element(ColladaRoot.Namespace + "unit"); - if (xElement != null) - { - XAttribute xAttribute = xElement.Attribute("meter"); - if (xAttribute != null) - { - Meter = float.Parse(xAttribute.Value, CultureInfo.InvariantCulture); - } - } - } - } - - sealed class c__DisplayClass3_0 - { - public VertexDeclaration vertexDeclaration; - - internal bool b__0(ModelBuffersData vd) - { - return vd.VertexDeclaration == vertexDeclaration; - } - } - - class ColladaAccessor - { - public ColladaFloatArray Source; - - public int Offset; - - public int Stride = 1; - - public ColladaAccessor(ColladaRoot collada, XElement node) - { - Source = (ColladaFloatArray)collada.ObjectsById[node.Attribute("source").Value.Substring(1)]; - XAttribute xAttribute = node.Attribute("offset"); - if (xAttribute != null) - { - Offset = int.Parse(xAttribute.Value, CultureInfo.InvariantCulture); - } - XAttribute xAttribute2 = node.Attribute("stride"); - if (xAttribute2 != null) - { - Stride = int.Parse(xAttribute2.Value, CultureInfo.InvariantCulture); - } - } - } - - class ColladaFloatArray : ColladaNameId - { - - [Serializable] - sealed class c - { - public static readonly ColladaFloatArray.c a = new ColladaFloatArray.c(); - - public static Func a__1_0; - - internal float b__1_0(string s) - { - return float.Parse(s, CultureInfo.InvariantCulture); - } - } - - public float[] Array; - - public ColladaFloatArray(ColladaRoot collada, XElement node) : base(collada, node, "") - { - IEnumerable arg_3A_0 = node.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); - Func arg_3A_1; - if ((arg_3A_1 = ColladaFloatArray.c.a__1_0) == null) - { - arg_3A_1 = (ColladaFloatArray.c.a__1_0 = new Func(ColladaFloatArray.c.a.b__1_0)); - } - Array = arg_3A_0.Select(arg_3A_1).ToArray(); - } - } - - class ColladaGeometry : ColladaNameId - { - public ColladaMesh Mesh; - - public ColladaGeometry(ColladaRoot collada, XElement node) : base(collada, node, "") - { - XElement xElement = node.Element(ColladaRoot.Namespace + "mesh"); - if (xElement != null) - { - Mesh = new ColladaMesh(collada, xElement); - } - } - } - - class ColladaInput - { - public int Offset; - - public string Semantic; - - public int Set; - - public ColladaSource Source; - - public ColladaInput(ColladaRoot collada, XElement node) - { - Offset = int.Parse(node.Attribute("offset").Value, CultureInfo.InvariantCulture); - Semantic = node.Attribute("semantic").Value; - XAttribute xAttribute = node.Attribute("set"); - if (xAttribute != null) - { - Set = int.Parse(xAttribute.Value, CultureInfo.InvariantCulture); - } - ColladaNameId colladaNameId = collada.ObjectsById[node.Attribute("source").Value.Substring(1)]; - if (colladaNameId is ColladaVertices) - { - ColladaVertices colladaVertices = (ColladaVertices)colladaNameId; - Source = colladaVertices.Source; - Semantic = colladaVertices.Semantic; - return; - } - Source = (ColladaSource)colladaNameId; - } - } - - class ColladaLibraryGeometries - { - public List Geometries = new List(); - - public ColladaLibraryGeometries(ColladaRoot collada, XElement node) - { - foreach (XElement current in node.Elements(ColladaRoot.Namespace + "geometry")) - { - Geometries.Add(new ColladaGeometry(collada, current)); - } - } - } - - class ColladaLibraryVisualScenes - { - public List VisualScenes = new List(); - - public ColladaLibraryVisualScenes(ColladaRoot collada, XElement node) - { - foreach (XElement current in node.Elements(ColladaRoot.Namespace + "visual_scene")) - { - VisualScenes.Add(new ColladaVisualScene(collada, current)); - } - } - } - - class ColladaMesh - { - public List Sources = new List(); - - public ColladaVertices Vertices; - - public List Polygons = new List(); - - public ColladaMesh(ColladaRoot collada, XElement node) - { - foreach (XElement current in node.Elements(ColladaRoot.Namespace + "source")) - { - Sources.Add(new ColladaSource(collada, current)); - } - XElement node2 = node.Element(ColladaRoot.Namespace + "vertices"); - Vertices = new ColladaVertices(collada, node2); - foreach (XElement current2 in node.Elements(ColladaRoot.Namespace + "polygons").Concat(node.Elements(ColladaRoot.Namespace + "polylist")).Concat(node.Elements(ColladaRoot.Namespace + "triangles"))) - { - Polygons.Add(new ColladaPolygons(collada, current2)); - } - } - } - - class ColladaNameId - { - public string Id; - - public string Name; - - public ColladaNameId(ColladaRoot collada, XElement node, string idPostfix = "") - { - XAttribute xAttribute = node.Attribute("id"); - if (xAttribute != null) - { - Id = xAttribute.Value + idPostfix; - collada.ObjectsById.Add(Id, this); - } - XAttribute xAttribute2 = node.Attribute("name"); - if (xAttribute2 != null) - { - Name = xAttribute2.Value; - } - } - } - - class ColladaNode : ColladaNameId - { - [Serializable] - sealed class c - { - public static readonly ColladaNode.c a = new ColladaNode.c(); - - public static Func a__3_0; - - public static Func a__3_1; - - public static Func a__3_2; - - public static Func a__3_3; - - internal float b__3_0(string s) - { - return float.Parse(s, CultureInfo.InvariantCulture); - } - - internal float b__3_1(string s) - { - return float.Parse(s, CultureInfo.InvariantCulture); - } - - internal float b__3_2(string s) - { - return float.Parse(s, CultureInfo.InvariantCulture); - } - - internal float b__3_3(string s) - { - return float.Parse(s, CultureInfo.InvariantCulture); - } - } - - public Matrix Transform = Matrix.Identity; - - public List Nodes = new List(); - - public List Geometries = new List(); - - public ColladaNode(ColladaRoot collada, XElement node) : base(collada, node, "") - { - foreach (XElement current in node.Elements()) - { - if (current.Name == ColladaRoot.Namespace + "matrix") - { - IEnumerable arg_91_0 = current.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); - Func arg_91_1; - if ((arg_91_1 = ColladaNode.c.a__3_0) == null) - { - arg_91_1 = (ColladaNode.c.a__3_0 = new Func(ColladaNode.c.a.b__3_0)); - } - float[] array = arg_91_0.Select(arg_91_1).ToArray(); - Transform = Matrix.Transpose(new Matrix(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7], array[8], array[9], array[10], array[11], array[12], array[13], array[14], array[15])) * Transform; - } - else if (current.Name == ColladaRoot.Namespace + "translate") - { - IEnumerable arg_13B_0 = current.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); - Func arg_13B_1; - if ((arg_13B_1 = ColladaNode.c.a__3_1) == null) - { - arg_13B_1 = (ColladaNode.c.a__3_1 = new Func(ColladaNode.c.a.b__3_1)); - } - float[] array2 = arg_13B_0.Select(arg_13B_1).ToArray(); - Transform = Matrix.CreateTranslation(array2[0], array2[1], array2[2]) * Transform; - } - else if (current.Name == ColladaRoot.Namespace + "rotate") - { - IEnumerable arg_1B2_0 = current.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); - Func arg_1B2_1; - if ((arg_1B2_1 = ColladaNode.c.a__3_2) == null) - { - arg_1B2_1 = (ColladaNode.c.a__3_2 = new Func(ColladaNode.c.a.b__3_2)); - } - float[] array3 = arg_1B2_0.Select(arg_1B2_1).ToArray(); - Transform = Matrix.CreateFromAxisAngle(new Vector3(array3[0], array3[1], array3[2]), MathUtils.DegToRad(array3[3])) * Transform; - } - else if (current.Name == ColladaRoot.Namespace + "scale") - { - IEnumerable arg_238_0 = current.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); - Func arg_238_1; - if ((arg_238_1 = ColladaNode.c.a__3_3) == null) - { - arg_238_1 = (ColladaNode.c.a__3_3 = new Func(ColladaNode.c.a.b__3_3)); - } - float[] array4 = arg_238_0.Select(arg_238_1).ToArray(); - Transform = Matrix.CreateScale(array4[0], array4[1], array4[2]) * Transform; - } - } - foreach (XElement current2 in node.Elements(ColladaRoot.Namespace + "node")) - { - Nodes.Add(new ColladaNode(collada, current2)); - } - foreach (XElement current3 in node.Elements(ColladaRoot.Namespace + "instance_geometry")) - { - Geometries.Add((ColladaGeometry)collada.ObjectsById[current3.Attribute("url").Value.Substring(1)]); - } - } - } - - class ColladaPolygons - { - [Serializable] - sealed class c - { - public static readonly ColladaPolygons.c a = new ColladaPolygons.c(); - - public static Func a__3_0; - - public static Func a__3_1; - - internal int b__3_0(string s) - { - return int.Parse(s, CultureInfo.InvariantCulture); - } - - internal int b__3_1(string s) - { - return int.Parse(s, CultureInfo.InvariantCulture); - } - } - - public List Inputs = new List(); - - public List VCount = new List(); - - public List P = new List(); - - public ColladaPolygons(ColladaRoot collada, XElement node) - { - foreach (XElement current in node.Elements(ColladaRoot.Namespace + "input")) - { - Inputs.Add(new ColladaInput(collada, current)); - } - foreach (XElement current2 in node.Elements(ColladaRoot.Namespace + "vcount")) - { - List arg_CC_0 = VCount; - IEnumerable arg_C7_0 = current2.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); - arg_CC_0.AddRange(arg_C7_0.Select(s => int.Parse(s, CultureInfo.InvariantCulture))); - } - foreach (XElement current3 in node.Elements(ColladaRoot.Namespace + "p")) - { - List arg_140_0 = P; - IEnumerable arg_13B_0 = current3.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); - Func arg_13B_1; - if ((arg_13B_1 = ColladaPolygons.c.a__3_1) == null) - { - arg_13B_1 = (ColladaPolygons.c.a__3_1 = new Func(ColladaPolygons.c.a.b__3_1)); - } - arg_140_0.AddRange(arg_13B_0.Select(arg_13B_1)); - } - } - } - - class ColladaRoot - { - public static readonly XNamespace Namespace = "http://www.collada.org/2005/11/COLLADASchema"; - - public readonly Dictionary ObjectsById = new Dictionary(); - - public readonly Asset Asset; - - public readonly List LibraryGeometries = new List(); - - public readonly List LibraryVisualScenes = new List(); - - public readonly ColladaScene Scene; - - public ColladaRoot(XElement node) - { - Asset = new Asset(node.Element(ColladaRoot.Namespace + "asset")); - foreach (XElement current in node.Elements(ColladaRoot.Namespace + "library_geometries")) - { - LibraryGeometries.Add(new ColladaLibraryGeometries(this, current)); - } - foreach (XElement current2 in node.Elements(ColladaRoot.Namespace + "library_visual_scenes")) - { - LibraryVisualScenes.Add(new ColladaLibraryVisualScenes(this, current2)); - } - Scene = new ColladaScene(this, node.Element(ColladaRoot.Namespace + "scene")); - } - } - - class ColladaScene - { - public ColladaVisualScene VisualScene; - - public ColladaScene(ColladaRoot collada, XElement node) - { - XElement xElement = node.Element(ColladaRoot.Namespace + "instance_visual_scene"); - VisualScene = (ColladaVisualScene)collada.ObjectsById[xElement.Attribute("url").Value.Substring(1) + "-ColladaVisualScene"]; - } - } - - class ColladaSource : ColladaNameId - { - public ColladaFloatArray FloatArray; - - public ColladaAccessor Accessor; - - public ColladaSource(ColladaRoot collada, XElement node) : base(collada, node, "") - { - XElement xElement = node.Element(ColladaRoot.Namespace + "float_array"); - if (xElement != null) - { - FloatArray = new ColladaFloatArray(collada, xElement); - } - XElement xElement2 = node.Element(ColladaRoot.Namespace + "technique_common"); - if (xElement2 != null) - { - XElement xElement3 = xElement2.Element(ColladaRoot.Namespace + "accessor"); - if (xElement3 != null) - { - Accessor = new ColladaAccessor(collada, xElement3); - } - } - } - } - - class ColladaVertices : ColladaNameId - { - public string Semantic; - - public ColladaSource Source; - - public ColladaVertices(ColladaRoot collada, XElement node) : base(collada, node, "") - { - XElement xElement = node.Element(ColladaRoot.Namespace + "input"); - Semantic = xElement.Attribute("semantic").Value; - Source = (ColladaSource)collada.ObjectsById[xElement.Attribute("source").Value.Substring(1)]; - } - } - - class ColladaVisualScene : ColladaNameId - { - public List Nodes = new List(); - - public ColladaVisualScene(ColladaRoot collada, XElement node) : base(collada, node, "-ColladaVisualScene") - { - foreach (XElement current in node.Elements(ColladaRoot.Namespace + "node")) - { - Nodes.Add(new ColladaNode(collada, current)); - } - } - } - - struct Vertex : IEquatable - { - public byte[] Data; - - public int Start; - - public int Count; - - int m_hashCode; - - public Vertex(byte[] data, int start, int count) - { - Data = data; - Start = start; - Count = count; - m_hashCode = 0; - for (int i = 0; i < Count; i++) - { - m_hashCode += (7919 * i + 977) * (int)Data[i + Start]; - } - } - - public bool Equals(Vertex other) - { - if (m_hashCode != other.m_hashCode || Data.Length != other.Data.Length) - { - return false; - } - for (int i = 0; i < Count; i++) - { - if (Data[i + Start] != other.Data[i + other.Start]) - { - return false; - } - } - return true; - } - - public override bool Equals(object obj) - { - return obj is Color && Equals((Color)obj); - } - - public override int GetHashCode() - { - return m_hashCode; - } - } - } -} +using System; +using System.IO; +using System.Collections.Generic; +using System.Xml.Linq; +using System.Linq; +using System.Globalization; +namespace Engine +{ + public static class Collada + { + // + // Static Methods + // + static T[] ExtendArray(T[] array, int extensionLength) + { + T[] array2 = new T[array.Length + extensionLength]; + Array.Copy(array, array2, array.Length); + return array2; + } + + static void IndexVertices(int vertexStride, byte[] vertices, out byte[] resultVertices, out byte[] resultIndices) + { + int num = vertices.Length / vertexStride; + Dictionary dictionary = new Dictionary(); + resultIndices = new byte[2 * num]; + for (int i = 0; i < num; i++) + { + Vertex key = new Vertex(vertices, i * vertexStride, vertexStride); + ushort num2; + if (!dictionary.TryGetValue(key, out num2)) + { + num2 = (ushort)dictionary.Count; + dictionary.Add(key, num2); + } + resultIndices[i * 2] = (byte)num2; + resultIndices[i * 2 + 1] = (byte)(num2 >> 8); + } + resultVertices = new byte[dictionary.Count * vertexStride]; + foreach (KeyValuePair current in dictionary) + { + Vertex key2 = current.Key; + ushort value = current.Value; + Array.Copy(key2.Data, key2.Start, resultVertices, (int)value * vertexStride, key2.Count); + } + } + + public static ModelData Load(Stream stream) + { + ModelData modelData = new ModelData(); + ColladaRoot colladaRoot = new ColladaRoot(XElement.Load(stream)); + if (colladaRoot.Scene.VisualScene.Nodes.Count > 1) + { + ModelBoneData modelBoneData = new ModelBoneData(); + modelData.Bones.Add(modelBoneData); + modelBoneData.ParentBoneIndex = -1; + modelBoneData.Name = string.Empty; + modelBoneData.Transform = Matrix.Identity; + using (List.Enumerator enumerator = colladaRoot.Scene.VisualScene.Nodes.GetEnumerator()) + { + while (enumerator.MoveNext()) + { + ColladaNode current = enumerator.Current; + LoadNode(modelData, modelBoneData, current, colladaRoot.Asset.Meter); + } + goto IL_F7; + } + } + foreach (ColladaNode current2 in colladaRoot.Scene.VisualScene.Nodes) + { + LoadNode(modelData, null, current2, colladaRoot.Asset.Meter); + } + IL_F7: + foreach (ModelBuffersData current3 in modelData.Buffers) + { + IndexVertices(current3.VertexDeclaration.VertexStride, current3.Vertices, out current3.Vertices, out current3.Indices); + } + if (colladaRoot.Asset.UpAxis == UpAxis.Z_UP) + { + ModelBoneData bone = modelData.Bones[0]; + while (bone.ParentBoneIndex != -1) + bone = modelData.Bones[bone.ParentBoneIndex]; + bone.Transform = new Matrix( + 1, 0, 0, 0, + 0, 0, -1, 0, + 0, 1, 0, 0, + 0, 0, 0, 1) * bone.Transform; + } + else if (colladaRoot.Asset.UpAxis == UpAxis.X_UP) + { + ModelBoneData bone = modelData.Bones[0]; + while (bone.ParentBoneIndex != -1) + bone = modelData.Bones[bone.ParentBoneIndex]; + bone.Transform = new Matrix( + 0, 1, 0, 0, + -1, 0, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1) * bone.Transform; + } + return modelData; + } + + static ModelMeshData LoadGeometry(ModelData data, ModelBoneData parentBoneData, ColladaGeometry geometry) + { + ModelMeshData modelMeshData = new ModelMeshData(); + data.Meshes.Add(modelMeshData); + modelMeshData.Name = parentBoneData.Name; + modelMeshData.ParentBoneIndex = data.Bones.IndexOf(parentBoneData); + bool flag = false; + foreach (ColladaPolygons current in geometry.Mesh.Polygons) + { + ModelMeshPartData modelMeshPartData = LoadPolygons(data, current); + modelMeshData.MeshParts.Add(modelMeshPartData); + modelMeshData.BoundingBox = (flag ? BoundingBox.Union(modelMeshData.BoundingBox, modelMeshPartData.BoundingBox) : modelMeshPartData.BoundingBox); + flag = true; + } + return modelMeshData; + } + + static ModelBoneData LoadNode(ModelData data, ModelBoneData parentBoneData, ColladaNode node, float meter) + { + ModelBoneData modelBoneData = new ModelBoneData(); + data.Bones.Add(modelBoneData); + modelBoneData.ParentBoneIndex = ((parentBoneData != null) ? data.Bones.IndexOf(parentBoneData) : (-1)); + modelBoneData.Name = node.Name; + modelBoneData.Transform = node.Transform * Matrix.CreateScale(meter); + foreach (ColladaNode current in node.Nodes) + { + LoadNode(data, modelBoneData, current, 1f); + } + foreach (ColladaGeometry current2 in node.Geometries) + { + LoadGeometry(data, modelBoneData, current2); + } + return modelBoneData; + } + + static ModelMeshPartData LoadPolygons(ModelData data, ColladaPolygons polygons) + { + c__DisplayClass3_0 c__DisplayClass3_ = new c__DisplayClass3_0(); + ModelMeshPartData modelMeshPartData = new ModelMeshPartData(); + int num = 0; + Dictionary dictionary = new Dictionary(); + foreach (ColladaInput current in polygons.Inputs) + { + string str = (current.Set == 0) ? string.Empty : current.Set.ToString(CultureInfo.InvariantCulture); + if (current.Semantic == "POSITION") + { + dictionary[new VertexElement(num, VertexElementFormat.Vector3, "POSITION" + str)] = current; + num += 12; + } + else if (current.Semantic == "NORMAL") + { + dictionary[new VertexElement(num, VertexElementFormat.Vector3, "NORMAL" + str)] = current; + num += 12; + } + else if (current.Semantic == "TEXCOORD") + { + dictionary[new VertexElement(num, VertexElementFormat.Vector2, "TEXCOORD" + str)] = current; + num += 8; + } + else if (current.Semantic == "COLOR") + { + dictionary[new VertexElement(num, VertexElementFormat.NormalizedByte4, "COLOR" + str)] = current; + num += 4; + } + } + c__DisplayClass3_.vertexDeclaration = new VertexDeclaration(dictionary.Keys.ToArray()); + ModelBuffersData modelBuffersData = data.Buffers.FirstOrDefault(new Func(c__DisplayClass3_.b__0)); + if (modelBuffersData == null) + { + modelBuffersData = new ModelBuffersData(); + data.Buffers.Add(modelBuffersData); + modelBuffersData.VertexDeclaration = c__DisplayClass3_.vertexDeclaration; + } + modelMeshPartData.BuffersDataIndex = data.Buffers.IndexOf(modelBuffersData); + int num2 = polygons.P.Count / polygons.InputCount; + List list = new List(); + if (polygons.VCount.Count == 0) + { + int num3 = 0; + for (int i = 0; i < num2 / 3; i++) + { + list.Add(num3); + list.Add(num3 + 2); + list.Add(num3 + 1); + num3 += 3; + } + } + else + { + int num4 = 0; + foreach (int current2 in polygons.VCount) + { + if (current2 == 3) + { + list.Add(num4); + list.Add(num4 + 2); + list.Add(num4 + 1); + num4 += 3; + } + else + { + if (current2 != 4) + { + throw new NotSupportedException("Collada polygons with less than 3 or more than 4 vertices are not supported."); + } + list.Add(num4); + list.Add(num4 + 2); + list.Add(num4 + 1); + list.Add(num4 + 2); + list.Add(num4); + list.Add(num4 + 3); + num4 += 4; + } + } + } + int vertexStride = modelBuffersData.VertexDeclaration.VertexStride; + int num5 = modelBuffersData.Vertices.Length; + modelBuffersData.Vertices = ExtendArray(modelBuffersData.Vertices, list.Count * vertexStride); + using (BinaryWriter binaryWriter = new BinaryWriter(new MemoryStream(modelBuffersData.Vertices, num5, list.Count * vertexStride))) + { + bool flag = false; + foreach (KeyValuePair current3 in dictionary) + { + VertexElement key = current3.Key; + ColladaInput value = current3.Value; + if (key.Semantic.StartsWith("POSITION")) + { + for (int j = 0; j < list.Count; j++) + { + float[] arg_3EF_0 = value.Source.Accessor.Source.Array; + int offset = value.Source.Accessor.Offset; + int stride = value.Source.Accessor.Stride; + int num6 = polygons.P[list[j] * polygons.InputCount + value.Offset]; + binaryWriter.BaseStream.Position = (long)(j * vertexStride + key.Offset); + float num7 = arg_3EF_0[offset + stride * num6]; + float num8 = arg_3EF_0[offset + stride * num6 + 1]; + float num9 = arg_3EF_0[offset + stride * num6 + 2]; + modelMeshPartData.BoundingBox = (flag ? BoundingBox.Union(modelMeshPartData.BoundingBox, new Vector3(num7, num8, num9)) : new BoundingBox(num7, num8, num9, num7, num8, num9)); + flag = true; + binaryWriter.Write(num7); + binaryWriter.Write(num8); + binaryWriter.Write(num9); + } + } + else if (key.Semantic.StartsWith("NORMAL")) + { + for (int k = 0; k < list.Count; k++) + { + float[] arg_51E_0 = value.Source.Accessor.Source.Array; + int offset2 = value.Source.Accessor.Offset; + int stride2 = value.Source.Accessor.Stride; + int num10 = polygons.P[list[k] * polygons.InputCount + value.Offset]; + binaryWriter.BaseStream.Position = (long)(k * vertexStride + key.Offset); + float num11 = arg_51E_0[offset2 + stride2 * num10]; + float num12 = arg_51E_0[offset2 + stride2 * num10 + 1]; + float num13 = arg_51E_0[offset2 + stride2 * num10 + 2]; + float num14 = 1f / MathUtils.Sqrt(num11 * num11 + num12 * num12 + num13 * num13); + binaryWriter.Write(num14 * num11); + binaryWriter.Write(num14 * num12); + binaryWriter.Write(num14 * num13); + } + } + else if (key.Semantic.StartsWith("TEXCOORD")) + { + for (int l = 0; l < list.Count; l++) + { + float[] array = value.Source.Accessor.Source.Array; + int offset3 = value.Source.Accessor.Offset; + int stride3 = value.Source.Accessor.Stride; + int num15 = polygons.P[list[l] * polygons.InputCount + value.Offset]; + binaryWriter.BaseStream.Position = (long)(l * vertexStride + key.Offset); + binaryWriter.Write(array[offset3 + stride3 * num15]); + binaryWriter.Write(1f - array[offset3 + stride3 * num15 + 1]); + } + } + else + { + if (!key.Semantic.StartsWith("COLOR")) + { + throw new Exception(); + } + for (int m = 0; m < list.Count; m++) + { + float[] array2 = value.Source.Accessor.Source.Array; + int offset4 = value.Source.Accessor.Offset; + int stride4 = value.Source.Accessor.Stride; + int num16 = polygons.P[list[m] * polygons.InputCount + value.Offset]; + binaryWriter.BaseStream.Position = (long)(m * vertexStride + key.Offset); + Color color = new Color(array2[offset4 + stride4 * num16], array2[offset4 + stride4 * num16 + 1], array2[offset4 + stride4 * num16 + 2], array2[offset4 + stride4 * num16 + 3]); + binaryWriter.Write(color.PackedValue); + } + } + } + } + modelMeshPartData.StartIndex = num5 / vertexStride; + modelMeshPartData.IndicesCount = list.Count; + return modelMeshPartData; + } + + // + // Nested Types + // + class Asset + { + public readonly float Meter = 1f; + public readonly UpAxis UpAxis = UpAxis.Z_UP; + + public Asset(XElement node) + { + XElement xElement = node.Element(ColladaRoot.Namespace + "unit"); + if (xElement != null) + { + XAttribute xAttribute = xElement.Attribute("meter"); + if (xAttribute != null) + { + Meter = float.Parse(xAttribute.Value, CultureInfo.InvariantCulture); + } + } + xElement = node.Element(ColladaRoot.Namespace + "up_axis"); + if (xElement != null) + { + switch (xElement.Value) + { + case "X_UP": + UpAxis = UpAxis.X_UP; + break; + case "Y_UP": + UpAxis = UpAxis.Y_UP; + break; + case "Z_UP": + UpAxis = UpAxis.Z_UP; + break; + } + } + } + } + + enum UpAxis + { + X_UP, + Y_UP, + Z_UP + } + + sealed class c__DisplayClass3_0 + { + public VertexDeclaration vertexDeclaration; + + internal bool b__0(ModelBuffersData vd) + { + return vd.VertexDeclaration == vertexDeclaration; + } + } + + class ColladaAccessor + { + public ColladaFloatArray Source; + + public int Offset; + + public int Stride = 1; + + public ColladaAccessor(ColladaRoot collada, XElement node) + { + Source = (ColladaFloatArray)collada.ObjectsById[node.Attribute("source").Value.Substring(1)]; + XAttribute xAttribute = node.Attribute("offset"); + if (xAttribute != null) + { + Offset = int.Parse(xAttribute.Value, CultureInfo.InvariantCulture); + } + XAttribute xAttribute2 = node.Attribute("stride"); + if (xAttribute2 != null) + { + Stride = int.Parse(xAttribute2.Value, CultureInfo.InvariantCulture); + } + } + } + + class ColladaFloatArray : ColladaNameId + { + + [Serializable] + sealed class c + { + public static readonly ColladaFloatArray.c a = new ColladaFloatArray.c(); + + public static Func a__1_0; + + internal float b__1_0(string s) + { + return float.Parse(s, CultureInfo.InvariantCulture); + } + } + + public float[] Array; + + public ColladaFloatArray(ColladaRoot collada, XElement node) : base(collada, node, "") + { + IEnumerable arg_3A_0 = node.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + Func arg_3A_1; + if ((arg_3A_1 = ColladaFloatArray.c.a__1_0) == null) + { + arg_3A_1 = (ColladaFloatArray.c.a__1_0 = new Func(ColladaFloatArray.c.a.b__1_0)); + } + Array = arg_3A_0.Select(arg_3A_1).ToArray(); + } + } + + class ColladaGeometry : ColladaNameId + { + public ColladaMesh Mesh; + + public ColladaGeometry(ColladaRoot collada, XElement node) : base(collada, node, "") + { + XElement xElement = node.Element(ColladaRoot.Namespace + "mesh"); + if (xElement != null) + { + Mesh = new ColladaMesh(collada, xElement); + } + } + } + + class ColladaInput + { + public int Offset; + + public string Semantic; + + public int Set; + + public ColladaSource Source; + + public ColladaInput(ColladaRoot collada, XElement node) + { + Offset = int.Parse(node.Attribute("offset").Value, CultureInfo.InvariantCulture); + Semantic = node.Attribute("semantic").Value; + XAttribute xAttribute = node.Attribute("set"); + if (xAttribute != null) + { + Set = int.Parse(xAttribute.Value, CultureInfo.InvariantCulture); + } + ColladaNameId colladaNameId = collada.ObjectsById[node.Attribute("source").Value.Substring(1)]; + if (colladaNameId is ColladaVertices) + { + ColladaVertices colladaVertices = (ColladaVertices)colladaNameId; + Source = colladaVertices.Source; + Semantic = colladaVertices.Semantic; + return; + } + Source = (ColladaSource)colladaNameId; + } + } + + class ColladaLibraryGeometries + { + public List Geometries = new List(); + + public ColladaLibraryGeometries(ColladaRoot collada, XElement node) + { + foreach (XElement current in node.Elements(ColladaRoot.Namespace + "geometry")) + { + Geometries.Add(new ColladaGeometry(collada, current)); + } + } + } + + class ColladaLibraryVisualScenes + { + public List VisualScenes = new List(); + + public ColladaLibraryVisualScenes(ColladaRoot collada, XElement node) + { + foreach (XElement current in node.Elements(ColladaRoot.Namespace + "visual_scene")) + { + VisualScenes.Add(new ColladaVisualScene(collada, current)); + } + } + } + + class ColladaMesh + { + public List Sources = new List(); + + public ColladaVertices Vertices; + + public List Polygons = new List(); + + public ColladaMesh(ColladaRoot collada, XElement node) + { + foreach (XElement current in node.Elements(ColladaRoot.Namespace + "source")) + { + Sources.Add(new ColladaSource(collada, current)); + } + XElement node2 = node.Element(ColladaRoot.Namespace + "vertices"); + Vertices = new ColladaVertices(collada, node2); + foreach (XElement current2 in node.Elements(ColladaRoot.Namespace + "polygons").Concat(node.Elements(ColladaRoot.Namespace + "polylist")).Concat(node.Elements(ColladaRoot.Namespace + "triangles"))) + { + Polygons.Add(new ColladaPolygons(collada, current2)); + } + } + } + + class ColladaNameId + { + public string Id; + + public string Name; + + public ColladaNameId(ColladaRoot collada, XElement node, string idPostfix = "") + { + XAttribute xAttribute = node.Attribute("id"); + if (xAttribute != null) + { + Id = xAttribute.Value + idPostfix; + collada.ObjectsById.Add(Id, this); + } + XAttribute xAttribute2 = node.Attribute("name"); + if (xAttribute2 != null) + { + Name = xAttribute2.Value; + } + } + } + + class ColladaNode : ColladaNameId + { + [Serializable] + sealed class c + { + public static readonly ColladaNode.c a = new ColladaNode.c(); + + public static Func a__3_0; + + public static Func a__3_1; + + public static Func a__3_2; + + public static Func a__3_3; + + internal float b__3_0(string s) + { + return float.Parse(s, CultureInfo.InvariantCulture); + } + + internal float b__3_1(string s) + { + return float.Parse(s, CultureInfo.InvariantCulture); + } + + internal float b__3_2(string s) + { + return float.Parse(s, CultureInfo.InvariantCulture); + } + + internal float b__3_3(string s) + { + return float.Parse(s, CultureInfo.InvariantCulture); + } + } + + public Matrix Transform = Matrix.Identity; + + public List Nodes = new List(); + + public List Geometries = new List(); + + public ColladaNode(ColladaRoot collada, XElement node) : base(collada, node, "") + { + foreach (XElement current in node.Elements()) + { + if (current.Name == ColladaRoot.Namespace + "matrix") + { + IEnumerable arg_91_0 = current.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + Func arg_91_1; + if ((arg_91_1 = ColladaNode.c.a__3_0) == null) + { + arg_91_1 = (ColladaNode.c.a__3_0 = new Func(ColladaNode.c.a.b__3_0)); + } + float[] array = arg_91_0.Select(arg_91_1).ToArray(); + Transform = Matrix.Transpose(new Matrix(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7], array[8], array[9], array[10], array[11], array[12], array[13], array[14], array[15])) * Transform; + } + else if (current.Name == ColladaRoot.Namespace + "translate") + { + IEnumerable arg_13B_0 = current.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + Func arg_13B_1; + if ((arg_13B_1 = ColladaNode.c.a__3_1) == null) + { + arg_13B_1 = (ColladaNode.c.a__3_1 = new Func(ColladaNode.c.a.b__3_1)); + } + float[] array2 = arg_13B_0.Select(arg_13B_1).ToArray(); + Transform = Matrix.CreateTranslation(array2[0], array2[1], array2[2]) * Transform; + } + else if (current.Name == ColladaRoot.Namespace + "rotate") + { + IEnumerable arg_1B2_0 = current.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + Func arg_1B2_1; + if ((arg_1B2_1 = ColladaNode.c.a__3_2) == null) + { + arg_1B2_1 = (ColladaNode.c.a__3_2 = new Func(ColladaNode.c.a.b__3_2)); + } + float[] array3 = arg_1B2_0.Select(arg_1B2_1).ToArray(); + Transform = Matrix.CreateFromAxisAngle(new Vector3(array3[0], array3[1], array3[2]), MathUtils.DegToRad(array3[3])) * Transform; + } + else if (current.Name == ColladaRoot.Namespace + "scale") + { + IEnumerable arg_238_0 = current.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + Func arg_238_1; + if ((arg_238_1 = ColladaNode.c.a__3_3) == null) + { + arg_238_1 = (ColladaNode.c.a__3_3 = new Func(ColladaNode.c.a.b__3_3)); + } + float[] array4 = arg_238_0.Select(arg_238_1).ToArray(); + Transform = Matrix.CreateScale(array4[0], array4[1], array4[2]) * Transform; + } + } + foreach (XElement current2 in node.Elements(ColladaRoot.Namespace + "node")) + { + Nodes.Add(new ColladaNode(collada, current2)); + } + foreach (XElement current3 in node.Elements(ColladaRoot.Namespace + "instance_geometry")) + { + Geometries.Add((ColladaGeometry)collada.ObjectsById[current3.Attribute("url").Value.Substring(1)]); + } + } + } + + class ColladaPolygons + { + [Serializable] + sealed class c + { + public static readonly ColladaPolygons.c a = new ColladaPolygons.c(); + + public static Func a__3_1; + + internal int b__3_0(string s) + { + return int.Parse(s, CultureInfo.InvariantCulture); + } + + internal int b__3_1(string s) + { + return int.Parse(s, CultureInfo.InvariantCulture); + } + } + + public readonly int InputCount; + + public List Inputs = new List(); + + public List VCount = new List(); + + public List P = new List(); + + public ColladaPolygons(ColladaRoot collada, XElement node) + { + foreach (XElement current in node.Elements(ColladaRoot.Namespace + "input")) + { + Inputs.Add(new ColladaInput(collada, current)); + } + int count = 0; + foreach (ColladaInput i in Inputs) + { + if (i.Offset > count) + count = i.Offset; + } + InputCount = count + 1; + foreach (XElement current2 in node.Elements(ColladaRoot.Namespace + "vcount")) + { + List arg_CC_0 = VCount; + IEnumerable arg_C7_0 = current2.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + arg_CC_0.AddRange(arg_C7_0.Select(s => int.Parse(s, CultureInfo.InvariantCulture))); + } + foreach (XElement current3 in node.Elements(ColladaRoot.Namespace + "p")) + { + List arg_140_0 = P; + IEnumerable arg_13B_0 = current3.Value.Split((char[])null, StringSplitOptions.RemoveEmptyEntries); + Func arg_13B_1; + if ((arg_13B_1 = ColladaPolygons.c.a__3_1) == null) + { + arg_13B_1 = (ColladaPolygons.c.a__3_1 = new Func(ColladaPolygons.c.a.b__3_1)); + } + arg_140_0.AddRange(arg_13B_0.Select(arg_13B_1)); + } + } + } + + class ColladaRoot + { + public static readonly XNamespace Namespace = "http://www.collada.org/2005/11/COLLADASchema"; + + public readonly Dictionary ObjectsById = new Dictionary(); + + public readonly Asset Asset; + + public readonly List LibraryGeometries = new List(); + + public readonly List LibraryVisualScenes = new List(); + + public readonly ColladaScene Scene; + + public ColladaRoot(XElement node) + { + if (node.GetDefaultNamespace() != Namespace) + throw new NotSupportedException("given collada viersion is not supported: " + node.GetDefaultNamespace()); + Asset = new Asset(node.Element(ColladaRoot.Namespace + "asset")); + foreach (XElement current in node.Elements(ColladaRoot.Namespace + "library_geometries")) + { + LibraryGeometries.Add(new ColladaLibraryGeometries(this, current)); + } + foreach (XElement current2 in node.Elements(ColladaRoot.Namespace + "library_visual_scenes")) + { + LibraryVisualScenes.Add(new ColladaLibraryVisualScenes(this, current2)); + } + Scene = new ColladaScene(this, node.Element(ColladaRoot.Namespace + "scene")); + } + } + + class ColladaScene + { + public ColladaVisualScene VisualScene; + + public ColladaScene(ColladaRoot collada, XElement node) + { + XElement xElement = node.Element(ColladaRoot.Namespace + "instance_visual_scene"); + VisualScene = (ColladaVisualScene)collada.ObjectsById[xElement.Attribute("url").Value.Substring(1) + "-ColladaVisualScene"]; + } + } + + class ColladaSource : ColladaNameId + { + public ColladaFloatArray FloatArray; + + public ColladaAccessor Accessor; + + public ColladaSource(ColladaRoot collada, XElement node) : base(collada, node, "") + { + XElement xElement = node.Element(ColladaRoot.Namespace + "float_array"); + if (xElement != null) + { + FloatArray = new ColladaFloatArray(collada, xElement); + } + XElement xElement2 = node.Element(ColladaRoot.Namespace + "technique_common"); + if (xElement2 != null) + { + XElement xElement3 = xElement2.Element(ColladaRoot.Namespace + "accessor"); + if (xElement3 != null) + { + Accessor = new ColladaAccessor(collada, xElement3); + } + } + } + } + + class ColladaVertices : ColladaNameId + { + public string Semantic; + + public ColladaSource Source; + + public ColladaVertices(ColladaRoot collada, XElement node) : base(collada, node, "") + { + XElement xElement = node.Element(ColladaRoot.Namespace + "input"); + Semantic = xElement.Attribute("semantic").Value; + Source = (ColladaSource)collada.ObjectsById[xElement.Attribute("source").Value.Substring(1)]; + } + } + + class ColladaVisualScene : ColladaNameId + { + public List Nodes = new List(); + + public ColladaVisualScene(ColladaRoot collada, XElement node) : base(collada, node, "-ColladaVisualScene") + { + foreach (XElement current in node.Elements(ColladaRoot.Namespace + "node")) + { + Nodes.Add(new ColladaNode(collada, current)); + } + } + } + + struct Vertex : IEquatable + { + public byte[] Data; + + public int Start; + + public int Count; + + int m_hashCode; + + public Vertex(byte[] data, int start, int count) + { + Data = data; + Start = start; + Count = count; + m_hashCode = 0; + for (int i = 0; i < Count; i++) + { + m_hashCode += (7919 * i + 977) * (int)Data[i + Start]; + } + } + + public bool Equals(Vertex other) + { + if (m_hashCode != other.m_hashCode || Data.Length != other.Data.Length) + { + return false; + } + for (int i = 0; i < Count; i++) + { + if (Data[i + Start] != other.Data[i + other.Start]) + { + return false; + } + } + return true; + } + + public override bool Equals(object obj) + { + return obj is Color && Equals((Color)obj); + } + + public override int GetHashCode() + { + return m_hashCode; + } + } + } +} diff --git a/SCPAK/Engine/ColladaExporter.cs b/SCPAK/Engine/ColladaExporter.cs index 498d4d1..b0681a4 100644 --- a/SCPAK/Engine/ColladaExporter.cs +++ b/SCPAK/Engine/ColladaExporter.cs @@ -6,7 +6,7 @@ namespace Engine { - public class ColladaEx + public class ColladaExporter { public const string COLLADA = "http://www.collada.org/2005/11/COLLADASchema"; public const string INSTANCE = "http://www.w3.org/2001/XMLSchema-instance"; @@ -17,7 +17,19 @@ public class ColladaEx XElement root; XElement visualScene; - public ColladaEx() + public static void Import(Stream input, Stream output) + { + ModelContentWriter.Write(output, Collada.Load(input), Vector3.One); + } + + public static void Export(Stream input, Stream output) + { + var exporter = new ColladaExporter(); + exporter.AddModel(ModelContentReader.Read(input, out bool keepTags)); + exporter.Save(output); + } + + public ColladaExporter() { document = new XDocument( new XDeclaration("1.0", "UTF-8", null) @@ -51,9 +63,9 @@ public ColladaEx() document.Add(root); } - public void Save(Stream path) + public void Save(Stream stream) { - document.Save(path); + document.Save(stream); } public void AddModel(ModelData model) diff --git a/SCPAK/PakData.cs b/SCPAK/PakData.cs index d9d74dd..fba120f 100644 --- a/SCPAK/PakData.cs +++ b/SCPAK/PakData.cs @@ -11,9 +11,11 @@ namespace SCPAK internal class PakData { public static Stream _PakData(string fileName, string typeName) - { + { +#if !DEBUG try { +#endif MemoryStream memoryStream = new MemoryStream(); FileStream fileStream; switch (typeName) @@ -80,11 +82,14 @@ public static Stream _PakData(string fileName, string typeName) } fileStream.Dispose(); memoryStream.Position = 0L; - return memoryStream; - }catch(Exception e) + return memoryStream; +#if !DEBUG + } + catch (Exception e) { - throw new Exception("文件写入错误 :"+fileName+"\t类型 :"+typeName+"\n具体错误信息 :"+e.Message); + throw new Exception("文件写入错误 :" + fileName + "\t类型 :" + typeName, e); } +#endif } private static void TextWriter(MemoryStream memoryStream, FileStream fileStream) { @@ -97,7 +102,7 @@ private static bool IsPowerOf2(long x) { return x > 0L && (x & x - 1L) == 0L; } - private static void PngWriter(MemoryStream memoryStream, FileStream fileStream,bool modelpng = false) + private static void PngWriter(MemoryStream memoryStream, FileStream fileStream, bool modelpng = false) { PngReader pngReader = new PngReader(fileStream); EngineBinaryWriter binaryWriter = new EngineBinaryWriter(memoryStream, false); @@ -132,7 +137,7 @@ private static void PngWriter(MemoryStream memoryStream, FileStream fileStream,b list.Add(image); modelpng = true; } - if(modelpng) goto IL_00; + if (modelpng) goto IL_00; binaryWriter.Write(image.Width); binaryWriter.Write(image.Height); binaryWriter.Write(1); @@ -150,7 +155,7 @@ private static void PngWriter(MemoryStream memoryStream, FileStream fileStream,b } } return; - IL_00: + IL_00: binaryWriter.Write(list[0].Width); binaryWriter.Write(list[0].Height); binaryWriter.Write(list.Count); @@ -162,7 +167,7 @@ private static void PngWriter(MemoryStream memoryStream, FileStream fileStream,b } } } - private static void SoundWriter(MemoryStream memoryStream,FileStream fileStream) + private static void SoundWriter(MemoryStream memoryStream, FileStream fileStream) { BinaryReader binaryReader = new BinaryReader(fileStream); binaryReader.BaseStream.Position = 22L; @@ -186,11 +191,11 @@ private static void SoundWriter(MemoryStream memoryStream,FileStream fileStream) private static void FontWriter(MemoryStream memoryStream, FileStream fileStream) { - EngineBinaryWriter binaryWriter = new EngineBinaryWriter(memoryStream,false); - StreamReader streamReader = new StreamReader(fileStream,Encoding.UTF8); + EngineBinaryWriter binaryWriter = new EngineBinaryWriter(memoryStream, false); + StreamReader streamReader = new StreamReader(fileStream, Encoding.UTF8); int num = int.Parse(streamReader.ReadLine()); binaryWriter.Write(num); - for(int i = 0; i < num; i++) + for (int i = 0; i < num; i++) { string[] data = streamReader.ReadLine().Split('\t'); binaryWriter.Write(char.Parse(data[0])); diff --git a/SCPAK/SCPAK.csproj b/SCPAK/SCPAK.csproj index ac5acf8..2531ea4 100644 --- a/SCPAK/SCPAK.csproj +++ b/SCPAK/SCPAK.csproj @@ -30,9 +30,6 @@ 4 - - .\PngCs.dll - @@ -41,6 +38,9 @@ + + PngCs.dll + @@ -75,6 +75,9 @@ + + + + - - - + android:layout_height="match_parent" + android:id="@+id/Main_ListView" + android:dividerHeight="1dp" /> \ No newline at end of file diff --git a/SCPaker/SCPaker/Resources/menu/menu.xml b/SCPaker/SCPaker/Resources/menu/menu.xml index a3378a9..ad9b98e 100644 --- a/SCPaker/SCPaker/Resources/menu/menu.xml +++ b/SCPaker/SCPaker/Resources/menu/menu.xml @@ -1,16 +1,8 @@ - - - - - - + + + + + + + \ No newline at end of file diff --git a/SCPaker/SCPaker/Resources/values/Strings.xml b/SCPaker/SCPaker/Resources/values/Strings.xml index e3f6890..b7ab5d7 100644 --- a/SCPaker/SCPaker/Resources/values/Strings.xml +++ b/SCPaker/SCPaker/Resources/values/Strings.xml @@ -1,6 +1,5 @@ - Hello World, Click Me! SCPaker 点击PAK文件解包,长按文件夹打包PAK! diff --git a/SCPaker/SCPaker/Resources/values/Styles.xml b/SCPaker/SCPaker/Resources/values/Styles.xml index 0ce65bd..c941c87 100644 --- a/SCPaker/SCPaker/Resources/values/Styles.xml +++ b/SCPaker/SCPaker/Resources/values/Styles.xml @@ -1,13 +1,8 @@  - - \ No newline at end of file diff --git a/SCPaker/SCPaker/SCPaker.csproj b/SCPaker/SCPaker/SCPaker.csproj index eda56d6..c751f7d 100644 --- a/SCPaker/SCPaker/SCPaker.csproj +++ b/SCPaker/SCPaker/SCPaker.csproj @@ -16,7 +16,7 @@ Resources\Resource.Designer.cs Off false - v5.0 + v7.1 Properties\AndroidManifest.xml @@ -89,6 +89,37 @@ Designer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -104,38 +135,11 @@ - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - Designer diff --git a/UpgradeLog.htm b/UpgradeLog.htm new file mode 100644 index 0000000..5d41277 Binary files /dev/null and b/UpgradeLog.htm differ