Exemplo n.º 1
0
        public DrawElement(FileReader reader, BIN_Parser header)
        {
            MaterialIndex   = reader.ReadInt16();
            ShapeBatchIndex = reader.ReadInt16();

            Material = header.ReadSection <Material>(reader, MaterialIndex);
            Batch    = header.ReadSection <ShapeBatch>(reader, ShapeBatchIndex);
        }
Exemplo n.º 2
0
 public void Write(FileWriter writer, BIN_Parser header)
 {
     writer.Write(Width);
     writer.Write(Height);
     writer.Write((byte)Format);
     writer.Write(Unknown);
     writer.Write((ushort)0);
     writer.Write(uint.MaxValue);
 }
Exemplo n.º 3
0
 public void Write(FileWriter writer, BIN_Parser header)
 {
     writer.Write(TextureIndex);
     writer.Write(PaletteIndex);
     writer.Write(WrapS);
     writer.Write(WrapT);
     writer.Write(Unknown);
     writer.Write(new byte[12]); //padding
 }
Exemplo n.º 4
0
 public Sampler(FileReader reader, BIN_Parser header)
 {
     TextureIndex = reader.ReadInt16();
     PaletteIndex = reader.ReadInt16();
     WrapS        = reader.ReadByte();
     WrapT        = reader.ReadByte();
     Unknown      = reader.ReadUInt16();
     Texture      = header.ReadSection <Texture>(reader, TextureIndex);
 }
Exemplo n.º 5
0
 public void Write(FileWriter writer, BIN_Parser header)
 {
     writer.Write(DynamicLighting);
     writer.Write(Unknown2);
     writer.Write(Unknown3);
     writer.Write(AmbientColor);
     writer.Write((byte)0);
     writer.Write(SamplerIndices);
     writer.Write(Unknown4);
     writer.Write(Unknown5);
     writer.Write(Padding);
 }
Exemplo n.º 6
0
 public void Write(FileWriter writer, BIN_Parser header)
 {
     writer.Write(TriangleCount);
     writer.Write(DisplayListSize);
     writer.Write((uint)AttributeFlags);
     writer.Write(NormalsFlag);
     writer.Write(PositionsFlag);
     writer.Write(TexCoordFlag);
     writer.Write(NbtFlag);
     writer.Write(0);
     writer.Write(0);
     writer.Write(0);
 }
Exemplo n.º 7
0
        public Texture(FileReader reader, BIN_Parser header)
        {
            Width   = reader.ReadUInt16();
            Height  = reader.ReadUInt16();
            Format  = (Decode_Gamecube.TextureFormats)reader.ReadByte();
            Unknown = reader.ReadByte();
            reader.ReadUInt16(); //padding
            uint imageOffset = reader.ReadUInt32();

            using (reader.TemporarySeek(header.TextureOffset + imageOffset, System.IO.SeekOrigin.Begin)) {
                var size = Decode_Gamecube.GetDataSize(Format, Width, Height);
                ImageData = reader.ReadBytes(size);
            }
        }
Exemplo n.º 8
0
        public ShapeBatch(FileReader reader, BIN_Parser header)
        {
            TriangleCount   = reader.ReadUInt16();
            DisplayListSize = reader.ReadUInt16();
            AttributeFlags  = (GXAttributes)reader.ReadUInt32();
            NormalsFlag     = reader.ReadByte();
            PositionsFlag   = reader.ReadByte();
            TexCoordFlag    = reader.ReadByte();
            NbtFlag         = reader.ReadByte();
            uint dataOffset = reader.ReadUInt32();

            reader.SeekBegin(header.ShapeBatchOffset + dataOffset);
            ParsePacketData(reader, header);
        }
Exemplo n.º 9
0
        public SceneGraphNode(FileReader reader, int index, BIN_Parser header)
        {
            Index            = index;
            ParentIndex      = reader.ReadInt16();
            FirstChildIndex  = reader.ReadInt16();
            NextSiblingIndex = reader.ReadInt16();
            PrevSiblingIndex = reader.ReadInt16();
            reader.ReadByte();
            RenderFlags = (GraphObjectRenderFlags)reader.ReadByte();
            reader.ReadInt16();
            Scale       = reader.ReadVec3();
            Rotate      = reader.ReadVec3();
            Translate   = reader.ReadVec3();
            BoundingMin = reader.ReadVec3();
            BoundingMax = reader.ReadVec3();
            Unknown     = reader.ReadSingle();
            ushort drawElementCount = reader.ReadUInt16();

            reader.ReadUInt16(); //padding
            uint drawElementOffset = reader.ReadUInt32();

            if (drawElementCount > 0)
            {
                for (int i = 0; i < drawElementCount; i++)
                {
                    reader.SeekBegin(header.SceneGraphOffset + drawElementOffset + (i * 4));
                    DrawnParts.Add(new DrawElement(reader, header));
                }
            }

            if (FirstChildIndex >= 0)
            {
                AddChild(header.ReadSection <SceneGraphNode>(reader, FirstChildIndex));
            }
            if (NextSiblingIndex >= 0)
            {
                if (Parent != null)
                {
                    Parent.AddChild(header.ReadSection <SceneGraphNode>(reader, NextSiblingIndex));
                }
                else
                {
                    AddChild(header.ReadSection <SceneGraphNode>(reader, NextSiblingIndex));
                }
            }
        }
Exemplo n.º 10
0
        public Material(FileReader reader, BIN_Parser header)
        {
            DynamicLighting = reader.ReadByte();
            Unknown2        = reader.ReadByte();
            Unknown3        = reader.ReadByte();
            AmbientColor    = reader.ReadColor8RGBA();
            reader.ReadByte(); //padding
            SamplerIndices = reader.ReadInt16s(8);
            Unknown4       = reader.ReadInt16();
            Unknown5       = reader.ReadInt16();
            Padding        = reader.ReadBytes(12);

            for (int i = 0; i < 8; i++)
            {
                if (SamplerIndices[i] != -1)
                {
                    Samplers.Add(header.ReadSection <Sampler>(reader, SamplerIndices[i]));
                }
            }
        }
Exemplo n.º 11
0
 public void Write(FileWriter writer, BIN_Parser header)
 {
     writer.Write(ParentIndex);
     writer.Write(FirstChildIndex);
     writer.Write(NextSiblingIndex);
     writer.Write(PrevSiblingIndex);
     writer.Write((byte)0);
     writer.Write((byte)RenderFlags);
     writer.Write((ushort)0);
     writer.Write(Scale);
     writer.Write(Rotate);
     writer.Write(Translate);
     writer.Write(BoundingMin);
     writer.Write(BoundingMax);
     writer.Write(Unknown);
     writer.Write((ushort)DrawnParts.Count);
     writer.Write((ushort)0);
     writer.Write(0);
     writer.Write(new byte[56]);
 }
Exemplo n.º 12
0
            public void Write(ShapeBatch batch, FileWriter writer, BIN_Parser header)
            {
                writer.Write(OpCode);
                writer.Write((ushort)Vertices.Length);
                for (int i = 0; i < Vertices.Length; i++)
                {
                    writer.Write(Vertices[i].PositionIndex);
                    if (batch.AttributeFlags.HasFlag(GXAttributes.Normal))
                    {
                        writer.Write(Vertices[i].NormalIndex);
                        if (batch.NbtFlag != 0)
                        {
                            writer.Write(Vertices[i].BinormalIndex);
                            writer.Write(Vertices[i].TangentIndex);
                        }
                    }

                    if (batch.AttributeFlags.HasFlag(GXAttributes.Color0))
                    {
                        writer.Write(Vertices[i].Color0Index);
                    }

                    if (batch.AttributeFlags.HasFlag(GXAttributes.Color1))
                    {
                        writer.Write(Vertices[i].Color1Index);
                    }

                    for (int t = 0; t < batch.TexCoordFlag; t++)
                    {
                        if (batch.AttributeFlags.HasFlag((GXAttributes)(1 << (13 + t))))
                        {
                            writer.Write(Vertices[i].TexCoordIndex[t]);
                        }
                    }
                }
            }
Exemplo n.º 13
0
        private void ParsePacketData(FileReader reader, BIN_Parser header)
        {
            long pos = reader.Position;

            while (reader.Position < pos + (DisplayListSize * 0x20))
            {
                byte opCode = reader.ReadByte();
                if (opCode == 0)
                {
                    continue;
                }

                PacketData packet = new PacketData();
                packet.OpCode = opCode;
                Packets.Add(packet);

                ushort vertexCount = reader.ReadUInt16();
                packet.Vertices = new VertexGroup[vertexCount];
                for (int i = 0; i < vertexCount; i++)
                {
                    VertexGroup group = new VertexGroup();
                    group.PositionIndex = reader.ReadInt16();
                    if (AttributeFlags.HasFlag(GXAttributes.Normal))
                    {
                        group.NormalIndex = reader.ReadInt16();
                        if (NbtFlag != 0)
                        {
                            group.BinormalIndex = reader.ReadInt16();
                            group.TangentIndex  = reader.ReadInt16();
                        }
                    }

                    if (AttributeFlags.HasFlag(GXAttributes.Color0))
                    {
                        group.Color0Index = reader.ReadInt16();
                    }

                    if (AttributeFlags.HasFlag(GXAttributes.Color1))
                    {
                        group.Color1Index = reader.ReadInt16();
                    }

                    for (int t = 0; t < TexCoordFlag; t++)
                    {
                        if (AttributeFlags.HasFlag((GXAttributes)(1 << (13 + t))))
                        {
                            group.TexCoordIndex[t] = reader.ReadInt16();
                        }
                    }

                    //Parse data

                    using (reader.TemporarySeek(header.PositionOffset + (group.PositionIndex * 6), System.IO.SeekOrigin.Begin))
                    {
                        group.Position = new Vector3(
                            (float)reader.ReadInt16(),
                            (float)reader.ReadInt16(),
                            (float)reader.ReadInt16());
                    }

                    if (group.NormalIndex != -1)
                    {
                        using (reader.TemporarySeek(header.NormalOffset + (group.NormalIndex * 12), System.IO.SeekOrigin.Begin))
                        {
                            group.Normal = new Vector3(
                                (float)reader.ReadSingle(),
                                (float)reader.ReadSingle(),
                                (float)reader.ReadSingle());
                        }
                    }

                    if (group.TangentIndex != -1)
                    {
                        using (reader.TemporarySeek(header.NormalOffset + (group.TangentIndex * 12), System.IO.SeekOrigin.Begin))
                        {
                            group.Tangent = new Vector3(
                                reader.ReadSingle(),
                                reader.ReadSingle(),
                                reader.ReadSingle());
                        }
                    }

                    if (group.BinormalIndex != -1)
                    {
                        using (reader.TemporarySeek(header.NormalOffset + (group.BinormalIndex * 12), System.IO.SeekOrigin.Begin))
                        {
                            group.Binormal = new Vector3(
                                reader.ReadSingle(),
                                reader.ReadSingle(),
                                reader.ReadSingle());
                        }
                    }

                    if (group.TexCoordIndex[0] != -1)
                    {
                        using (reader.TemporarySeek(header.TexCoordOffset + (group.TexCoordIndex[0] * 8), System.IO.SeekOrigin.Begin))
                        {
                            //Flip UVs
                            group.Texcoord = new Vector2(
                                (float)reader.ReadSingle(),
                                (float)reader.ReadSingle());
                        }
                    }

                    packet.Vertices[i] = group;
                }
            }
        }
Exemplo n.º 14
0
 public void Write(FileWriter writer, BIN_Parser header)
 {
     writer.Write(MaterialIndex);
     writer.Write(ShapeBatchIndex);
 }
Exemplo n.º 15
0
 public void Load(Stream stream)
 {
     Header = new BIN_Parser(stream);
 }