/// <summary> /// Create a new TMD object by reading from a binary stream. /// </summary> /// <param name="b">The binary stream.</param> /// <param name="fixp">The FixP flag, from the TMD header.</param> /// <param name="objTableTop">The address of the start of the TMD's object table.</param> public TMDObject(BinaryReader b, bool fixp, uint objTableTop) { VerticesAddress = b.ReadUInt32(); NumVertices = b.ReadUInt32(); NormalsAddress = b.ReadUInt32(); NumNormals = b.ReadUInt32(); PrimitivesAddress = b.ReadUInt32(); NumPrimitives = b.ReadUInt32(); Scale = b.ReadInt32(); Primitives = new TMDPrimitivePacket[NumPrimitives]; Vertices = new Vec3[NumVertices]; Normals = new TMDNormal[NumNormals]; uint cachedEndPos = (uint)b.BaseStream.Position; b.BaseStream.Seek(fixp ? PrimitivesAddress : PrimitivesAddress + objTableTop, SeekOrigin.Begin); for (int i = 0; i < NumPrimitives; i++) { Primitives[i] = new TMDPrimitivePacket(b); } b.BaseStream.Seek(fixp ? VerticesAddress : VerticesAddress + objTableTop, SeekOrigin.Begin); for (int i = 0; i < NumVertices; i++) { Vertices[i] = new Vec3(b); } b.BaseStream.Seek(fixp ? NormalsAddress : NormalsAddress + objTableTop, SeekOrigin.Begin); for (int i = 0; i < NumNormals; i++) { Normals[i] = new TMDNormal(b); } b.BaseStream.Seek(cachedEndPos, SeekOrigin.Begin); }
private bool tmdPrimitivePacketEquals(TMDPrimitivePacket x, TMDPrimitivePacket y) { if (x.Flags != y.Flags) { return(false); } if (x.Options != y.Options) { return(false); } if (x.Type != y.Type) { return(false); } if (x.ILen != y.ILen) { return(false); } if (x.OLen != y.OLen) { return(false); } if (!x.PacketData.Vertices.SequenceEqual(y.PacketData.Vertices)) { return(false); } if (x.SpriteSize != y.SpriteSize) { return(false); } return(true); }
private int tmdPrimitivePacketHashCode(TMDPrimitivePacket p) { var hashCode = p.Flags.GetHashCode(); hashCode = (hashCode * 397) ^ p.Options.GetHashCode(); hashCode = (hashCode * 397) ^ p.Type.GetHashCode(); hashCode = (hashCode * 397) ^ p.ILen.GetHashCode(); hashCode = (hashCode * 397) ^ p.OLen.GetHashCode(); hashCode = (hashCode * 397) ^ p.PacketData.Vertices.Length.GetHashCode(); ITMDColoredPrimitivePacket coloredPacket = p.PacketData as ITMDColoredPrimitivePacket; if (coloredPacket != null) { foreach (var col in coloredPacket.Colors) { hashCode = (hashCode * 397) ^ col.GetHashCode(); } } ITMDLitPrimitivePacket litPacket = p.PacketData as ITMDLitPrimitivePacket; if (litPacket != null) { foreach (var norm in litPacket.Normals) { hashCode = (hashCode * 397) ^ norm.GetHashCode(); } } ITMDTexturedPrimitivePacket texturedPacket = p.PacketData as ITMDTexturedPrimitivePacket; if (texturedPacket != null) { hashCode = (hashCode * 397) ^ texturedPacket.Texture.TexturePageNumber.GetHashCode(); hashCode = (hashCode * 397) ^ texturedPacket.Texture.ColorMode.GetHashCode(); hashCode = (hashCode * 397) ^ texturedPacket.Texture.AlphaBlendRate.GetHashCode(); hashCode = (hashCode * 397) ^ texturedPacket.ColorLookup.XPosition.GetHashCode(); hashCode = (hashCode * 397) ^ texturedPacket.ColorLookup.YPosition.GetHashCode(); foreach (var uv in texturedPacket.UVs) { hashCode = (hashCode * 397) ^ uv.GetHashCode(); } } foreach (var vert in p.PacketData.Vertices) { hashCode = (hashCode * 397) ^ vert.GetHashCode(); } hashCode = (hashCode * 397) ^ p.SpriteSize.GetHashCode(); return(hashCode); }