Esempio n. 1
0
    public static AMesh Load(Stream stream)
    {
        AMesh result = new AMesh();

        result.Header       = MemoryUtils.ReadStruct <AMeshHeader>(stream);
        result.MaterialName = MemoryUtils.ReadAnsiString(stream);



        bool tangents = (result.Header.Flags & AMeshFlags.HaveTangents) != AMeshFlags.None;

        if (tangents)
        {
            result.Tangent = new List <AVector4>();

            for (ushort i = 0; i < result.Header.VerticesCount; ++i)
            {
                result.Position.Add(MemoryUtils.ReadStruct <AVector3>(stream));
                result.UV0.Add(MemoryUtils.ReadStruct <AVector2>(stream));
                result.Normal.Add(MemoryUtils.ReadStruct <AVector3>(stream));
                result.Tangent.Add(MemoryUtils.ReadStruct <AVector4>(stream));
            }
        }
        else
        {
            for (ushort i = 0; i < result.Header.VerticesCount; ++i)
            {
                result.Position.Add(MemoryUtils.ReadStruct <AVector3>(stream));
                result.Normal.Add(MemoryUtils.ReadStruct <AVector3>(stream));
                result.UV0.Add(MemoryUtils.ReadStruct <AVector2>(stream));
            }
        }



        var          indices = new List <ushort>();
        BinaryReader reader  = new BinaryReader(stream);

        for (ushort i = 0; i < result.Header.PolygonsCount; ++i)
        {
            for (ushort j = 0; j < 3; ++j)
            {
                indices.Add(reader.ReadUInt16());
            }
        }


        result.Indices = indices.ToArray();

        return(result);
    }