diff --git a/Marathon/Formats/Ninja/Chunks/ObjectChunk.cs b/Marathon/Formats/Ninja/Chunks/ObjectChunk.cs index e8adde71..e4863ee5 100644 --- a/Marathon/Formats/Ninja/Chunks/ObjectChunk.cs +++ b/Marathon/Formats/Ninja/Chunks/ObjectChunk.cs @@ -46,6 +46,11 @@ void WalkNodes(int in_parentIndex, int in_depth) WalkNodes(0, result + 1); + // No file ever ends up with a MaxNodeDepth of 0. + // Marathon writing a 0 is what leads to some files having a single byte that is inaccurate to the original file. + if (result == 0) + result = 1; + return result; } } diff --git a/Marathon/Formats/Ninja/Flags/VertexFormat.cs b/Marathon/Formats/Ninja/Flags/VertexFormat.cs index f67e3d4a..aebb372e 100644 --- a/Marathon/Formats/Ninja/Flags/VertexFormat.cs +++ b/Marathon/Formats/Ninja/Flags/VertexFormat.cs @@ -17,9 +17,10 @@ public enum VertexFormat : uint NND_VTXTYPE_XB_BINORMAL = 0x100U, // TODO: might be 0x40? NND_VTXTYPE_XB_MTX_INDEX4 = 0x400U, NND_VTXTYPE_XB_WEIGHT3 = 0x7000U, - NND_VTXTYPE_XB_TEXCOORD = 0x10000U, - NND_VTXTYPE_XB_PNCT = NND_VTXTYPE_XB_POSITION | NND_VTXTYPE_XB_NORMAL | NND_VTXTYPE_XB_COLOR | NND_VTXTYPE_XB_TEXCOORD, - NND_VTXTYPE_XB_PW4INCT = NND_VTXTYPE_XB_POSITION | NND_VTXTYPE_XB_WEIGHT3 | NND_VTXTYPE_XB_MTX_INDEX4 | NND_VTXTYPE_XB_NORMAL | NND_VTXTYPE_XB_COLOR | NND_VTXTYPE_XB_TEXCOORD, - NND_VTXTYPE_XB_PW4INCTAB = NND_VTXTYPE_XB_POSITION | NND_VTXTYPE_XB_WEIGHT3 | NND_VTXTYPE_XB_MTX_INDEX4 | NND_VTXTYPE_XB_NORMAL | NND_VTXTYPE_XB_COLOR | NND_VTXTYPE_XB_TEXCOORD | NND_VTXTYPE_XB_TANGENT | NND_VTXTYPE_XB_BINORMAL, + NND_VTXTYPE_XB_SINGLETEXCOORD = 0x10000U, + NND_VTXTYPE_XB_DOUBLETEXCOORD = 0x20000U, + NND_VTXTYPE_XB_PNCT = NND_VTXTYPE_XB_POSITION | NND_VTXTYPE_XB_NORMAL | NND_VTXTYPE_XB_COLOR | NND_VTXTYPE_XB_SINGLETEXCOORD, + NND_VTXTYPE_XB_PW4INCT = NND_VTXTYPE_XB_POSITION | NND_VTXTYPE_XB_WEIGHT3 | NND_VTXTYPE_XB_MTX_INDEX4 | NND_VTXTYPE_XB_NORMAL | NND_VTXTYPE_XB_COLOR | NND_VTXTYPE_XB_SINGLETEXCOORD, + NND_VTXTYPE_XB_PW4INCTAB = NND_VTXTYPE_XB_POSITION | NND_VTXTYPE_XB_WEIGHT3 | NND_VTXTYPE_XB_MTX_INDEX4 | NND_VTXTYPE_XB_NORMAL | NND_VTXTYPE_XB_COLOR | NND_VTXTYPE_XB_SINGLETEXCOORD | NND_VTXTYPE_XB_TANGENT | NND_VTXTYPE_XB_BINORMAL, } } diff --git a/Marathon/Formats/Ninja/Types/Vertex.cs b/Marathon/Formats/Ninja/Types/Vertex.cs index cf822c9d..d7a1bb38 100644 --- a/Marathon/Formats/Ninja/Types/Vertex.cs +++ b/Marathon/Formats/Ninja/Types/Vertex.cs @@ -13,7 +13,7 @@ public class Vertex public Vector3? Weight { get; set; } - public byte[] MatrixIndices { get; set; } = new byte[4]; + public byte[]? MatrixIndices { get; set; } public Vector3? Normal { get; set; } @@ -54,7 +54,7 @@ public void Read(BinaryObjectReaderEx in_reader, VertexList in_vertexList) if (in_vertexList.Format.HasFlag(VertexFormat.NND_VTXTYPE_XB_COLOR2)) VertexColourB = in_reader.ReadObject>(); - for (int i = 0; i < (uint)in_vertexList.Format / (uint)VertexFormat.NND_VTXTYPE_XB_TEXCOORD; i++) + for (int i = 0; i < (uint)in_vertexList.Format / (uint)VertexFormat.NND_VTXTYPE_XB_SINGLETEXCOORD; i++) { TextureCoordinates ??= []; TextureCoordinates.Add(in_reader.Read()); diff --git a/Marathon/Formats/Ninja/Types/VertexList.cs b/Marathon/Formats/Ninja/Types/VertexList.cs index cd7e9cc2..f0f8ed7c 100644 --- a/Marathon/Formats/Ninja/Types/VertexList.cs +++ b/Marathon/Formats/Ninja/Types/VertexList.cs @@ -183,7 +183,17 @@ public VertexFormat GetVertexFormat() result |= VertexFormat.NND_VTXTYPE_XB_COLOR2; if (Vertices[0].TextureCoordinates != null) - result |= VertexFormat.NND_VTXTYPE_XB_TEXCOORD; + { + if (Vertices[0].TextureCoordinates.Count == 1) + result |= VertexFormat.NND_VTXTYPE_XB_SINGLETEXCOORD; + if (Vertices[0].TextureCoordinates.Count == 2) + result |= VertexFormat.NND_VTXTYPE_XB_DOUBLETEXCOORD; + if (Vertices[0].TextureCoordinates.Count == 3) + { + result |= VertexFormat.NND_VTXTYPE_XB_SINGLETEXCOORD; + result |= VertexFormat.NND_VTXTYPE_XB_DOUBLETEXCOORD; + } + } if (Vertices[0].Tangent != null) result |= VertexFormat.NND_VTXTYPE_XB_TANGENT;