Exemple #1
0
        public void Read(BinaryReader reader, MT7Node node)
        {
            m_node = node;

            Offset     = (uint)reader.BaseStream.Position;
            Identifier = reader.ReadUInt32();
            Unknown    = reader.ReadUInt32();

            m_node.Center = new Vector3()
            {
                X = reader.ReadSingle(),
                Y = reader.ReadSingle(),
                Z = reader.ReadSingle()
            };
            m_node.Radius = reader.ReadSingle();

            FirstEntryOffset = reader.ReadUInt32();
            Size             = reader.ReadUInt32();
            uint offsetVertices = Size * 4 + (uint)reader.BaseStream.Position - 4;

            //Read vertices first
            reader.BaseStream.Seek(offsetVertices, SeekOrigin.Begin);
            vertUnknown1 = reader.ReadUInt32();
            vertUnknown2 = reader.ReadUInt32();
            vertSize     = reader.ReadUInt16();
            vertUnknown3 = reader.ReadUInt16();
            verticesSize = reader.ReadUInt32();

            VertexFormat vertexFormat = Vertex.GetFormat(vertSize);

            for (uint i = 0; i < verticesSize; i += vertSize)
            {
                Vector3 pos = new Vector3();
                pos.X = reader.ReadSingle();
                pos.Y = reader.ReadSingle();
                pos.Z = reader.ReadSingle();
                m_node.VertexPositions.Add(pos);

                if (vertSize > 12)
                {
                    Vector3 norm = new Vector3();
                    norm.X = reader.ReadSingle();
                    norm.Y = reader.ReadSingle();
                    norm.Z = reader.ReadSingle();
                    m_node.VertexNormals.Add(norm);

                    if (vertSize > 24)
                    {
                        Vector2 uv = new Vector2();
                        uv.X = reader.ReadSingle();
                        uv.Y = reader.ReadSingle();
                        m_node.VertexUVs.Add(uv);
                    }
                }
            }

            //Read faces
            reader.BaseStream.Seek(Offset + (FirstEntryOffset + 6) * 4, SeekOrigin.Begin);
            XB01Group group = new XB01Group(reader);

            Groups.Add(group);
            XB01_Tex     currentTexture = null;
            XB01_TexAttr currentTexAttr = null;

            while (reader.BaseStream.Position < offsetVertices - 8)
            {
                uint zeroCheck = reader.ReadUInt32();
                if (zeroCheck != 0)
                {
                    reader.BaseStream.Seek(-4, SeekOrigin.Current);
                }
                else
                {
                    if (reader.BaseStream.Position >= group.Offset + group.Size)
                    {
                        group = new XB01Group(reader);
                        Groups.Add(group);
                    }
                    else
                    {
                        continue;
                    }
                }

                byte type = reader.ReadByte();
                reader.BaseStream.Seek(-1, SeekOrigin.Current);

                XB01Entry entry;
                switch (type)
                {
                case 0x00:
                    entry = new XB01_Zero(reader);
                    group.Entries.Add(entry);
                    break;

                case 0x04:
                    entry = new XB01_Floats(reader);
                    group.Entries.Add(entry);
                    break;

                case 0x0B:
                    currentTexture = new XB01_Tex(reader);
                    group.Entries.Add(currentTexture);
                    break;

                case 0x0D:
                    currentTexAttr = new XB01_TexAttr(reader);
                    group.Entries.Add(currentTexAttr);
                    break;

                case 0x10:
                    XB01_Strip strip = new XB01_Strip(reader);
                    MeshFace   face  = new MeshFace
                    {
                        TextureIndex = currentTexture.Textures[0],
                        Type         = PrimitiveType.Triangles,
                        Wrap         = currentTexAttr.Wrap,
                        Transparent  = currentTexAttr.Transparent,
                        Unlit        = currentTexAttr.Unlit
                    };

                    face.PositionIndices.AddRange(strip.VertIndices);
                    if (vertSize > 12)
                    {
                        face.NormalIndices.AddRange(strip.VertIndices);
                        if (vertSize > 24)
                        {
                            face.UVIndices.AddRange(strip.VertIndices);
                        }
                    }

                    m_node.Faces.Add(face);
                    group.Entries.Add(strip);
                    break;

                default:
                    entry = new XB01_Unknown(reader);
                    group.Entries.Add(entry);
                    break;
                }
            }
        }
 public void SetMT7Node(MT7Node node)
 {
     m_node = node;
 }
Exemple #3
0
 public XB01(BinaryReader reader, MT7Node node)
 {
     Read(reader, node);
 }