Пример #1
0
        /// <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);
        }