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; }
public XB01(BinaryReader reader, MT7Node node) { Read(reader, node); }