Пример #1
0
        public void read(FileData f)
        {
            base.read(f);

            f.skip(1);
            x = f.readFloat();
            y = f.readFloat();
        }
Пример #2
0
 public override void Read(FileData f)
 {
     x1 = f.readFloat();
     y1 = f.readFloat();
     x2 = f.readFloat();
     y2 = f.readFloat();
     f.skip(0x6);
 }
Пример #3
0
        public void read(FileData f)
        {
            base.read(f);

            f.skip(1);
            left   = f.readFloat();
            right  = f.readFloat();
            top    = f.readFloat();
            bottom = f.readFloat();
        }
Пример #4
0
                public void Read(FileData d)
                {
                    hash = d.readInt();
                    unk1 = d.readInt();

                    int s = d.readByte();

                    name = d.readString(d.pos(), -1);
                    d.skip(s);
                    d.align(4);

                    d.skip(8);

                    offset = d.readInt();
                    size   = d.readInt();

                    for (int i = 0; i < param.Length; i++)
                    {
                        param[i] = d.readFloat();
                    }

                    offsets = new int[d.readInt()];
                    for (int i = 0; i < offsets.Length; i++)
                    {
                        offsets[i] = d.readInt();
                    }

                    unkvalues = new float[d.readInt()];
                    for (int i = 0; i < unkvalues.Length; i++)
                    {
                        unkvalues[d.readInt()] = d.readFloat();
                    }

                    List <int> une = new List <int>();

                    while (true)
                    {
                        int i = d.readInt();
                        une.Add(i);
                        if (i == -1)
                        {
                            break;
                        }
                    }
                    unkending = une.ToArray();

                    end = new int[3 + (int)Math.Ceiling((double)((unk1 >> 8) & 0xFF) / 4)];

                    for (int i = 0; i < end.Length; i++)
                    {
                        end[i] = d.readInt();
                    }

                    //Console.WriteLine(id + " " + name + " " + offset.ToString("x"));
                }
Пример #5
0
        public void read(FileData f)
        {
            base.read(f);

            flag1 = Convert.ToBoolean(f.readByte());
            flag2 = Convert.ToBoolean(f.readByte());
            flag3 = Convert.ToBoolean(f.readByte());
            flag4 = Convert.ToBoolean(f.readByte());

            f.skip(1);
            int vertCount = f.readInt();

            for (int i = 0; i < vertCount; i++)
            {
                f.skip(1);
                Vector2D temp = new Vector2D();
                temp.x = f.readFloat();
                temp.y = f.readFloat();
                verts.Add(temp);
            }

            f.skip(1);
            int normalCount = f.readInt();

            for (int i = 0; i < normalCount; i++)
            {
                f.skip(1);
                Vector2D temp = new Vector2D();
                temp.x = f.readFloat();
                temp.y = f.readFloat();
                normals.Add(temp);
            }

            f.skip(1);
            int cliffCount = f.readInt();

            for (int i = 0; i < cliffCount; i++)
            {
                CollisionCliff temp = new CollisionCliff();
                temp.read(f);
                cliffs.Add(temp);
            }

            f.skip(1);
            int materialCount = f.readInt();

            for (int i = 0; i < materialCount; i++)
            {
                f.skip(1);
                CollisionMat temp = new CollisionMat();
                temp.material = f.read(0xC);//Temporary, will work on fleshing out material more later

                materials.Add(temp);
            }
        }
Пример #6
0
 public Entry Read(FileData f)
 {
     subaction = f.readUShort();
     f.readUShort();//skip padding
     startFrame = f.readUShort();
     lastFrame  = f.readUShort();
     xmin       = f.readFloat();
     xmax       = f.readFloat();
     ymin       = f.readFloat();
     ymax       = f.readFloat();
     return(this);
 }
Пример #7
0
        public Vector2D angle; //Someone figure out what these angles do

        public void read(FileData f)
        {
            base.read(f);

            f.skip(1);
            pos     = new Vector2D();
            pos.x   = f.readFloat();
            pos.y   = f.readFloat();
            angle   = new Vector2D();
            angle.x = f.readFloat();
            angle.y = f.readFloat();
        }
Пример #8
0
        public override void Read(string filename)
        {
            FileData file = new FileData(filename);
            if (file != null)
            {
                file.Endian = Endianness.Little;
                Endian = Endianness.Little;
                string magic = file.readString(0, 4);
                if (magic == "VBN ")
                {
                    file.Endian = Endianness.Big;
                    Endian = Endianness.Big;
                }

                file.seek(4);

                unk_1 = (short)file.readShort();
                unk_2 = (short)file.readShort();
                totalBoneCount = (UInt32)file.readInt();
                boneCountPerType[0] = (UInt32)file.readInt();
                boneCountPerType[1] = (UInt32)file.readInt();
                boneCountPerType[2] = (UInt32)file.readInt();
                boneCountPerType[3] = (UInt32)file.readInt();

                for (int i = 0; i < totalBoneCount; i++)
                {
                    Bone temp = new Bone(this);
                    temp.boneName = file.readString(file.pos(), -1).ToCharArray();
                    file.skip(64);
                    temp.boneType = (UInt32)file.readInt();
                    temp.parentIndex = file.readInt();
                    temp.boneId = (UInt32)file.readInt();
                    temp.position = new float[3];
                    temp.rotation = new float[3];
                    temp.scale = new float[3];
                    bones.Add(temp);
                }

                for (int i = 0; i < bones.Count; i++)
                {
                    bones[i].position[0] = file.readFloat();
                    bones[i].position[1] = file.readFloat();
                    bones[i].position[2] = file.readFloat();
                    bones[i].rotation[0] = file.readFloat();
                    bones[i].rotation[1] = file.readFloat();
                    bones[i].rotation[2] = file.readFloat();
                    bones[i].scale[0] = file.readFloat();
                    bones[i].scale[1] = file.readFloat();
                    bones[i].scale[2] = file.readFloat();
                    Bone temp = bones[i];
                    //Debug.Write(temp.parentIndex);
                    //if (temp.parentIndex != 0x0FFFFFFF && temp.parentIndex > -1)
                    //    bones[temp.parentIndex].children.Add(i);
                    bones[i] = temp;
                }
                reset();
            }
        }
Пример #9
0
 public Entry Read(FileData f)
 {
     attackId = (ushort)f.readShort();
     unk      = (ushort)f.readShort();
     start    = (ushort)f.readShort();
     end      = (ushort)f.readShort();
     xmin     = f.readFloat();
     xmax     = f.readFloat();
     ymin     = f.readFloat();
     ymax     = f.readFloat();
     return(this);
 }
Пример #10
0
        public void read(FileData f)
        {
            base.read(f);

            f.skip(1);
            type = f.readInt(); //always 4?

            x = f.readFloat();
            y = f.readFloat();
            z = f.readFloat();
            f.skip(0x10);
        }
Пример #11
0
        public void read(FileData f)
        {
            f.skip(0x2);        //x01 03

            type = f.readInt(); //First set of sections = type 1, second set = type 3. No difference in structure but type 3 seems to have non-zero for z and unk
            x    = f.readFloat();
            y    = f.readFloat();
            z    = f.readFloat(); //0 unless type 3
            unk  = f.readFloat(); //0 unless type 3

            f.skip(0x2);          //x01 01
            f.readInt();          //Only seen this as 0, probably a count
        }
Пример #12
0
        public override void Read(FileData f)
        {
            f.skip(0x12);
            int pointCount = f.readInt();

            for (int i = 0; i < pointCount; i++)
            {
                f.skip(1);//seperator char
                points.Add(new Vector2D()
                {
                    x = f.readFloat(), y = f.readFloat()
                });
            }
        }
Пример #13
0
        public override void Read(string filename)
        {
            FileData buf = new FileData(filename);

            buf.Endian = Endianness.Little;

            buf.seek(0x06);

            short numAtlases    = buf.readShort();
            short numTextures   = buf.readShort();
            short flagsOffset   = buf.readShort();
            short entriesOffset = buf.readShort();
            short stringsOffset = buf.readShort();


            buf.seek(flagsOffset);
            for (int i = 0; i < numAtlases; i++)
            {
                atlases.Add((AtlasFlag)buf.readInt());
            }

            buf.seek(entriesOffset);
            for (int i = 0; i < numTextures; i++)
            {
                Texture entry       = new Texture();
                int     nameOffset  = buf.readInt();
                int     nameOffset2 = buf.readInt();

                // I have yet to see this.
                if (nameOffset != nameOffset2)
                {
                    throw new NotImplementedException("texlist name offsets don't match?");
                }

                buf.seek(stringsOffset + nameOffset);
                entry.name = buf.readString();

                entry.topLeft  = new Vector2(buf.readFloat(), buf.readFloat());
                entry.botRight = new Vector2(buf.readFloat(), buf.readFloat());

                entry.width   = buf.readShort();
                entry.height  = buf.readShort();
                entry.atlasId = buf.readShort();

                textures.Add(entry);

                buf.skip(0x02); // Padding.
            }
        }
Пример #14
0
        public static double readVal(FileData d, int valueFormat)
        {
            int scale = (int)Math.Pow(2, valueFormat & 0x1F);

            d.Endian = System.IO.Endianness.Little;

            switch (valueFormat & 0xF0)
            {
            case 0x00:
                return(d.readFloat());

            case 0x20:
                return(unchecked ((short)d.readShort()) / (double)scale);

            case 0x40:
                return(d.readShort() / (double)scale);

            case 0x60:
                return(unchecked ((sbyte)d.readByte()) / (double)scale);

            case 0x80:
                return(d.readByte() / (double)scale);

            default:
                return(0);
            }
        }
Пример #15
0
        public void read(FileData f)
        {
            int nameOff = f.readInt();

            unknown    = f.readInt();
            valueCount = f.readInt();
            int frameCount = f.readInt();

            unknown2 = f.readShort();
            unknown3 = f.readShort();
            int dataOff = f.readInt();

            f.seek(nameOff);
            name = f.readString();
            f.seek(dataOff);
            for (int i = 0; i < frameCount; i++)
            {
                frame temp = new frame();
                //temp.size = valueCount;
                temp.values = new float[valueCount];
                for (int j = 0; j < valueCount; j++)
                {
                    temp.values[j] = f.readFloat();
                }
                frames.Add(temp);
            }
        }
Пример #16
0
 public void Read(FileData f)
 {
     type   = f.readInt();
     format = f.readInt();
     scale  = f.readFloat();
     Text   = ((_3DSGPU.VertexAttribute)type).ToString() + "_" + format;
 }
Пример #17
0
 public void Read(FileData f)
 {
     unk0            = (uint)f.readInt();
     unk1            = (uint)f.readInt();
     unk2            = (uint)f.readInt();
     maxCharacterId  = (uint)f.readInt();
     unk4            = f.readInt();
     maxCharacterId2 = (uint)f.readInt();
     maxDepth        = (ushort)f.readShort();
     unk7            = (ushort)f.readShort();
     framerate       = f.readFloat();
     width           = f.readFloat();
     height          = f.readFloat();
     unk8            = (uint)f.readInt();
     unk9            = (uint)f.readInt();
 }
Пример #18
0
        public void read(FileData f)
        {
            f.skip(1);
            f.skip(0x16);// unknown data

            f.skip(1);
            points = new List <Vector2D>();
            int vertCount = f.readInt();

            for (int j = 0; j < vertCount; j++)
            {
                f.skip(1);
                Vector2D point = new Vector2D();
                point.x = f.readFloat();
                point.y = f.readFloat();
                points.Add(point);
            }
        }
Пример #19
0
        public void read(FileData f)
        {
            base.read(f);

            f.readByte();
            type = f.readInt(); //3 = rect, 4 = path
            if ((type != 3) && (type != 4))
            {
                throw new NotImplementedException($"Unknown general shape type {type} at offset {f.pos()-4}");
            }

            x1 = f.readFloat();
            y1 = f.readFloat();
            x2 = f.readFloat();
            y2 = f.readFloat();

            f.skip(1);
            f.skip(1);
            int pointCount = f.readInt();

            for (int i = 0; i < pointCount; i++)
            {
                f.skip(1);
                points.Add(new Vector2D()
                {
                    x = f.readFloat(), y = f.readFloat()
                });
            }
        }
Пример #20
0
        public void read(FileData f)
        {
            f.skip(0xC);

            f.skip(1);
            name = f.readString(f.pos(), 0x38);
            f.skip(0x38);

            f.skip(1);
            subname = f.readString(f.pos(), 0x40);
            f.skip(0x40);

            f.skip(1);
            for (int i = 0; i < 3; i++)
            {
                startPos[i] = f.readFloat();
            }
            useStartPos = Convert.ToBoolean(f.readByte());

            f.skip(1);
            unk1 = f.readInt(); //Some kind of count? Only seen it as 0 so I don't know what it's for

            //Not sure what this is for, but it seems like an x,y,z followed by a hash
            f.skip(1);
            for (int i = 0; i < 3; i++)
            {
                unk2[i] = f.readFloat();
            }
            unk3 = f.readInt();

            f.skip(1);
            boneName = new char[0x40];
            for (int i = 0; i < 0x40; i++)
            {
                boneName[i] = (char)f.readByte();
            }
        }
Пример #21
0
                public void Read(FileData d)
                {
                    hash = d.readInt();
                    unk1 = d.readInt();

                    int s = d.readByte();

                    name = d.readString(d.pos(), s - 1);
                    d.skip(s);
                    d.align(4);
                    data = new float[0x2c];
                    for (int i = 0; i < 0x2c; i++)
                    {
                        data[i] = d.readFloat();
                    }
                }
Пример #22
0
            public void ReadDescription(FileData d)
            {
                int count = d.readInt();

                type   = new int[count];
                format = new int[count];
                scale  = new float[count];

                for (int i = 0; i < count; i++)
                {
                    type[i]   = d.readInt();
                    format[i] = d.readInt();
                    scale[i]  = d.readFloat();
                }

                length = d.readInt();
            }
Пример #23
0
        private static float readType(FileData d, int format, float scale)
        {
            switch (format)
            {
            case 0:
                return(d.readFloat() * scale);

            case 1:
                return(d.readByte() * scale);

            case 2:
                return(d.readSByte() * scale);

            case 3:
                return(d.readShort() * scale);
            }
            return(0);
        }
Пример #24
0
            private float ReadType(FileData d)
            {
                switch (format)
                {
                case 0:
                    return(d.readFloat() * scale);

                case 1:
                    return(d.readByte() * scale);

                case 2:
                    return((sbyte)d.readByte() * scale);

                case 3:
                    return((short)d.readShort() * scale);
                }
                return(0);
            }
Пример #25
0
        public override void Read(string filename)
        {
            FileData f = new FileData(filename);

            f.Endian = Endianness.Big;
            f.seek(4);
            if (f.readUInt() != Magic)
            {
                return;
            }

            f.seek(0);
            uint bom = f.readUInt();

            if (bom == 0xFFFE0000)
            {
                Endian = Endianness.Little;
            }
            else if (bom == 0x0000FEFF)
            {
                Endian = Endianness.Big;
            }
            else
            {
                return;
            }
            f.Endian = Endian;

            f.seek(8);
            f.readInt(); // Always 0
            int frameCount = f.readInt();

            for (int i = 0; i < frameCount; i++)
            {
                pathFrame temp;
                temp.qx = f.readFloat();
                temp.qy = f.readFloat();
                temp.qz = f.readFloat();
                temp.qw = f.readFloat();
                temp.x  = f.readFloat();
                temp.y  = f.readFloat();
                temp.z  = f.readFloat();
                Frames.Add(temp);
            }
        }
Пример #26
0
 public void Read(FileData f)
 {
     CharacterId       = f.readInt();
     unk1              = f.readInt();
     placeholderTextId = f.readInt();
     unk2              = f.readInt();
     strokeColorId     = f.readInt();
     unk3              = f.readInt();
     unk4              = f.readInt();
     unk5              = f.readInt();
     alignment         = (TextAlignment)f.readShort();
     unk6              = f.readShort();
     unk7              = f.readInt();
     unk8              = f.readInt();
     size              = f.readFloat();
     unk9              = f.readInt();
     unk10             = f.readInt();
     unk11             = f.readInt();
     unk12             = f.readInt();
 }
Пример #27
0
        public override void Read(string filename)
        {
            FileData f = new FileData(filename);

            byte[] magic      = f.read(0xC);;
            int    frameCount = f.readInt();

            for (int i = 0; i < frameCount; i++)
            {
                pathFrame temp;
                temp.qx = f.readFloat();
                temp.qy = f.readFloat();
                temp.qz = f.readFloat();
                temp.qw = f.readFloat();
                temp.x  = f.readFloat();
                temp.y  = f.readFloat();
                temp.z  = f.readFloat();
                Frames.Add(temp);
            }
        }
Пример #28
0
        public override void Read(string filename)
        {
            bchHeader header = new bchHeader();
            FileData  f      = new FileData(filename);

            f.Endian = System.IO.Endianness.Little;

            f.skip(4);
            header.backwardCompatibility = f.readByte();
            header.forwardCompatibility  = f.readByte();
            header.version = f.readUShort();

            header.mainHeaderOffset  = f.readInt();
            header.stringTableOffset = f.readInt();
            header.gpuCommandsOffset = f.readInt();
            header.dataOffset        = f.readInt();
            if (header.backwardCompatibility > 0x20)
            {
                header.dataExtendedOffset = f.readInt();
            }
            header.relocationTableOffset = f.readInt();

            header.mainHeaderLength  = f.readInt();
            header.stringTableLength = f.readInt();
            header.gpuCommandsLength = f.readInt();
            header.dataLength        = f.readInt();
            if (header.backwardCompatibility > 0x20)
            {
                header.dataExtendedLength = f.readInt();
            }
            header.relocationTableLength = f.readInt();

            header.uninitializedDataSectionLength        = f.readInt();
            header.uninitializedDescriptionSectionLength = f.readInt();

            if (header.backwardCompatibility > 7)
            {
                header.flags        = f.readUShort();
                header.addressCount = f.readUShort();
            }

            // Relocation table
            for (int i = 0; i < header.relocationTableLength; i += 4)
            {
                f.seek(header.relocationTableOffset + i);
                int  val  = f.readInt();
                int  off  = val & 0x1FFFFFF;
                byte flag = (byte)(val >> 25);

                switch (flag)
                {
                case 0:
                    f.seek((off * 4) + header.mainHeaderOffset);
                    f.writeInt((off * 4) + header.mainHeaderOffset, f.readInt() + header.mainHeaderOffset);
                    break;

                case 1:
                    f.seek(off + header.mainHeaderOffset);
                    f.writeInt((off) + header.mainHeaderOffset, f.readInt() + header.stringTableOffset);
                    break;

                case 2:
                    f.seek((off * 4) + header.mainHeaderOffset);
                    f.writeInt((off * 4) + header.mainHeaderOffset, f.readInt() + header.gpuCommandsOffset);
                    break;

                case 0xc:
                    f.seek((off * 4) + header.mainHeaderOffset);
                    f.writeInt((off * 4) + header.mainHeaderOffset, f.readInt() + header.dataOffset);
                    break;
                }

                f.seek((off * 4) + header.gpuCommandsOffset);
                if (header.backwardCompatibility < 6)
                {
                    switch (flag)
                    {
                    case 0x23: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break;     //Texture

                    case 0x25: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break;     //Vertex

                    //case 0x26: f.writeInt((off * 4) + header.gpuCommandsOffset, ((f.readInt() + header.dataOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode
                    case 0x27: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataOffset) & 0x7fffffff); break;     //Index 8 bits mode
                    }
                }
                else if (header.backwardCompatibility < 8)
                {
                    switch (flag)
                    {
                    case 0x24: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break;     //Texture

                    case 0x26: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break;     //Vertex

                    //case 0x27: writer.Write(((peek(input) + header.dataOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode
                    case 0x28: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataOffset) & 0x7fffffff); break;     //Index 8 bits mode
                    }
                }
                else if (header.backwardCompatibility < 0x21)
                {
                    switch (flag)
                    {
                    case 0x25: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break;     //Texture

                    case 0x27: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break;     //Vertex

                    //case 0x28: writer.Write(((peek(input) + header.dataOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode
                    case 0x29: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataOffset) & 0x7fffffff); break;     //Index 8 bits mode
                    }
                }
                else
                {
                    switch (flag)
                    {
                    case 0x25: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break;     //Texture

                    case 0x26: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break;     //Vertex relative to Data Offset

                    //case 0x27: writer.Write(((peek(input) + header.dataOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode relative to Data Offset
                    case 0x28: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataOffset) & 0x7fffffff); break; //Index 8 bits mode relative to Data Offset

                    case 0x2b: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataExtendedOffset); break;        //Vertex relative to Data Extended Offset

                    //case 0x2c: writer.Write(((peek(input) + header.dataExtendedOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode relative to Data Extended Offset
                    case 0x2d: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataExtendedOffset) & 0x7fffffff); break;     //Index 8 bits mode relative to Data Extended Offset
                    }
                }
            }


            // Content Header
            f.seek(header.mainHeaderOffset);
            bchContentHeader content = new bchContentHeader();

            {
                content.modelsPointerTableOffset        = f.readInt();
                content.modelsPointerTableEntries       = f.readInt();
                content.modelsNameOffset                = f.readInt();
                content.materialsPointerTableOffset     = f.readInt();
                content.materialsPointerTableEntries    = f.readInt();
                content.materialsNameOffset             = f.readInt();
                content.shadersPointerTableOffset       = f.readInt();
                content.shadersPointerTableEntries      = f.readInt();
                content.shadersNameOffset               = f.readInt();
                content.texturesPointerTableOffset      = f.readInt();
                content.texturesPointerTableEntries     = f.readInt();
                content.texturesNameOffset              = f.readInt();
                content.materialsLUTPointerTableOffset  = f.readInt();
                content.materialsLUTPointerTableEntries = f.readInt();
                content.materialsLUTNameOffset          = f.readInt();
                content.lightsPointerTableOffset        = f.readInt();
                content.lightsPointerTableEntries       = f.readInt();
                content.lightsNameOffset                = f.readInt();
                content.camerasPointerTableOffset       = f.readInt();
                content.camerasPointerTableEntries      = f.readInt();
                content.camerasNameOffset               = f.readInt();
                content.fogsPointerTableOffset          = f.readInt();
                content.fogsPointerTableEntries         = f.readInt();
                content.fogsNameOffset = f.readInt();
                content.skeletalAnimationsPointerTableOffset    = f.readInt();
                content.skeletalAnimationsPointerTableEntries   = f.readInt();
                content.skeletalAnimationsNameOffset            = f.readInt();
                content.materialAnimationsPointerTableOffset    = f.readInt();
                content.materialAnimationsPointerTableEntries   = f.readInt();
                content.materialAnimationsNameOffset            = f.readInt();
                content.visibilityAnimationsPointerTableOffset  = f.readInt();
                content.visibilityAnimationsPointerTableEntries = f.readInt();
                content.visibilityAnimationsNameOffset          = f.readInt();
                content.lightAnimationsPointerTableOffset       = f.readInt();
                content.lightAnimationsPointerTableEntries      = f.readInt();
                content.lightAnimationsNameOffset           = f.readInt();
                content.cameraAnimationsPointerTableOffset  = f.readInt();
                content.cameraAnimationsPointerTableEntries = f.readInt();
                content.cameraAnimationsNameOffset          = f.readInt();
                content.fogAnimationsPointerTableOffset     = f.readInt();
                content.fogAnimationsPointerTableEntries    = f.readInt();
                content.fogAnimationsNameOffset             = f.readInt();
                content.scenePointerTableOffset             = f.readInt();
                content.scenePointerTableEntries            = f.readInt();
                content.sceneNameOffset = f.readInt();
            }


            //Skeletal animation
            for (int index1 = 0; index1 < content.skeletalAnimationsPointerTableEntries; index1++)
            {
                f.seek(content.skeletalAnimationsPointerTableOffset + (index1 * 4));
                int dataOffset = f.readInt();
                f.seek(dataOffset);


                string skeletalAnimationName = f.readString(f.readInt(), -1);
                int    animationFlags        = f.readInt();
                //int skeletalAnimationloopMode = f.readByte();  //pas ça du tout
                float skeletalAnimationframeSize = f.readFloat();
                int   boneTableOffset            = f.readInt();
                int   boneTableEntries           = f.readInt();
                int   metaDataPointerOffset      = f.readInt();

                //Debug.WriteLine("Animation Name: " + skeletalAnimationName);
                //Debug.WriteLine("BonetableOffset: " + boneTableOffset.ToString("X"));
                //Debug.WriteLine("BonetableEntry: " + boneTableEntries.ToString("X"));

                for (int i = 0; i < boneTableEntries; i++)
                {
                    f.seek(boneTableOffset + (i * 4));
                    int offset = f.readInt();

                    OSkeletalAnimationBone bone = new OSkeletalAnimationBone();

                    f.seek(offset);
                    bone.name = f.readString(f.readInt(), -1);
                    Console.WriteLine("Bone Name: " + bone.name);
                    int animationTypeFlags = f.readInt();
                    int flags = f.readInt();

                    OSegmentType segmentType = (OSegmentType)((animationTypeFlags >> 16) & 0xf);
                    switch (segmentType)
                    {
                    case OSegmentType.transform:
                        f.seek(offset + 0x18);

                        int notExistMask = 0x80000;
                        int constantMask = 0x200;

                        for (int j = 0; j < 2; j++)
                        {
                            for (int axis = 0; axis < 3; axis++)
                            {
                                bool notExist = (flags & notExistMask) > 0;
                                bool constant = (flags & constantMask) > 0;

                                OAnimationKeyFrameGroup frame = new OAnimationKeyFrameGroup();
                                frame.exists = !notExist;
                                if (frame.exists)
                                {
                                    if (constant)
                                    {
                                        frame.interpolation = OInterpolationMode.linear;
                                        frame.keyFrames.Add(new OAnimationKeyFrame(f.readFloat(), 0));
                                    }
                                    else
                                    {
                                        int frameOffset = f.readInt();
                                        int position    = f.pos();
                                        f.seek(frameOffset);
                                        //getAnimationKeyFrame(input, frame);
                                        f.seek(position);
                                    }
                                }
                                else
                                {
                                    f.seek(f.pos() + 0x04);
                                }

                                if (j == 0)
                                {
                                    switch (axis)
                                    {
                                    case 0: bone.rotationX = frame; break;

                                    case 1: bone.rotationY = frame; break;

                                    case 2: bone.rotationZ = frame; break;
                                    }
                                }
                                else
                                {
                                    switch (axis)
                                    {
                                    case 0: bone.translationX = frame; break;

                                    case 1: bone.translationY = frame; break;

                                    case 2: bone.translationZ = frame; break;
                                    }
                                }

                                notExistMask <<= 1;
                                constantMask <<= 1;
                            }

                            constantMask <<= 1;
                        }

                        break;

                    case OSegmentType.transformQuaternion:
                        bone.isFrameFormat = true;

                        int scaleOffset       = f.readInt();
                        int rotationOffset    = f.readInt();
                        int translationOffset = f.readInt();

                        if ((flags & 0x20) == 0)
                        {
                            bone.scale.exists = true;
                            f.seek(scaleOffset);

                            if ((flags & 4) > 0)
                            {
                                bone.scale.vector.Add(new Vector4(
                                                          f.readFloat(),
                                                          f.readFloat(),
                                                          f.readFloat(),
                                                          0));
                            }
                            else
                            {
                                bone.scale.startFrame = f.readFloat();
                                bone.scale.endFrame   = f.readFloat();

                                int scaleFlags      = f.readInt();
                                int scaleDataOffset = f.readInt();
                                int scaleEntries    = f.readInt();

                                f.seek(scaleDataOffset);
                                for (int j = 0; j < scaleEntries; j++)
                                {
                                    bone.scale.vector.Add(new Vector4(
                                                              f.readFloat(),
                                                              f.readFloat(),
                                                              f.readFloat(),
                                                              0));
                                }
                            }
                        }

                        if ((flags & 0x10) == 0)
                        {
                            bone.rotationQuaternion.exists = true;
                            f.seek(rotationOffset);

                            if ((flags & 2) > 0)
                            {
                                bone.rotationQuaternion.vector.Add(new Vector4(
                                                                       f.readFloat(),
                                                                       f.readFloat(),
                                                                       f.readFloat(),
                                                                       f.readFloat()));
                            }
                            else
                            {
                                bone.rotationQuaternion.startFrame = f.readFloat();
                                bone.rotationQuaternion.endFrame   = f.readFloat();

                                int rotationFlags      = f.readInt();
                                int rotationDataOffset = f.readInt();
                                int rotationEntries    = f.readInt();

                                f.seek(rotationDataOffset);
                                for (int j = 0; j < rotationEntries; j++)
                                {
                                    bone.rotationQuaternion.vector.Add(new Vector4(
                                                                           f.readFloat(),
                                                                           f.readFloat(),
                                                                           f.readFloat(),
                                                                           f.readFloat()));
                                }
                            }
                        }

                        if ((flags & 8) == 0)
                        {
                            bone.translation.exists = true;
                            f.seek(translationOffset);

                            if ((flags & 1) > 0)
                            {
                                bone.translation.vector.Add(new Vector4(
                                                                f.readFloat(),
                                                                f.readFloat(),
                                                                f.readFloat(),
                                                                0));
                            }
                            else
                            {
                                bone.translation.startFrame = f.readFloat();
                                bone.translation.endFrame   = f.readFloat();

                                int translationFlags      = f.readInt();
                                int translationDataOffset = f.readInt();
                                int translationEntries    = f.readInt();

                                f.seek(translationDataOffset);
                                for (int j = 0; j < translationEntries; j++)
                                {
                                    bone.translation.vector.Add(new Vector4(
                                                                    f.readFloat(),
                                                                    f.readFloat(),
                                                                    f.readFloat(),
                                                                    0));
                                }
                            }
                        }

                        break;

                    case OSegmentType.transformMatrix:
                        bone.isFullBakedFormat = true;

                        f.readInt();
                        f.readInt();
                        int matrixOffset = f.readInt();
                        int entries      = f.readInt();

                        f.seek(matrixOffset);
                        for (int j = 0; j < entries; j++)
                        {
                            /*OMatrix transform = new OMatrix();
                             * transform.M11 = f.readFloat();
                             * transform.M21 = f.readFloat();
                             * transform.M31 = f.readFloat();
                             * transform.M41 = f.readFloat();
                             *
                             * transform.M12 = f.readFloat();
                             * transform.M22 = f.readFloat();
                             * transform.M32 = f.readFloat();
                             * transform.M42 = f.readFloat();
                             *
                             * transform.M13 = f.readFloat();
                             * transform.M23 = f.readFloat();
                             * transform.M33 = f.readFloat();
                             * transform.M43 = f.readFloat();
                             *
                             * bone.transform.Add(transform);*/
                        }

                        break;

                    default: throw new Exception(string.Format("BCH: Unknow Segment Type {0} on Skeletal Animation bone {1}! STOP!", segmentType, bone.name));
                    }

                    //skeletalAnimation.bone.Add(bone);
                }
            }

            //Shaders (unused for now, until someone wants to add them)
            for (int index = 0; index < content.shadersPointerTableEntries; index++)
            {
                f.seek(content.shadersPointerTableOffset + (index * 4));
                int dataOffset = f.readInt();
                f.seek(dataOffset);

                int shaderDataOffset = f.readInt();
                int shaderDataLength = f.readInt();
            }

            // Textures
            // WIP Section
            for (int index = 0; index < content.texturesPointerTableEntries; index++)
            {
                f.seek(content.texturesPointerTableOffset + (index * 4));
                int dOffset = f.readInt();
                f.seek(dOffset);

                int textureCommandsOffset    = f.readInt();
                int textureCommandsWordCount = f.readInt();

                f.seek(f.pos() + 0x14);
                String textureName = f.readString(f.readInt(), -1);
                f.seek(textureCommandsOffset);
                BCH_Texture tex = new BCH_Texture();
                textures.Add(textureName, tex);

                tex.Height = f.readUShort();
                tex.Width  = f.readUShort();
                f.skip(12);
                int doffset = f.readInt();
                f.skip(4);
                tex.type = f.readInt();
                tex.data = f.getSection(doffset, f.size() - doffset);

                tex.texture = _3DS.DecodeImage(tex.data, tex.Width, tex.Height, (_3DS.Tex_Formats)tex.type);
                //Texture texture = new Texture2D(tex.texture);
                //tex.display = texture.Id;
            }

            // Model data

            for (int modelIndex = 0; modelIndex < content.modelsPointerTableEntries; modelIndex++)
            {
                f.seek(content.modelsPointerTableOffset + (modelIndex * 4));
                int objectsHeaderOffset = f.readInt();

                // Objects
                f.seek(objectsHeaderOffset);
                BCH_Model model = new BCH_Model();
                models.Add(model);

                model.flags                     = f.readByte();
                model.skeletonScaleType         = f.readByte();
                model.silhouetteMaterialEntries = f.readUShort();

                model.worldTransform = new Matrix4(f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat()
                                                   , f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat()
                                                   , f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat()
                                                   , 0, 0, 0, 1);

                int materialsTableOffset  = f.readInt();
                int materialsTableEntries = f.readInt();
                int materialsNameOffset   = f.readInt();
                int verticesTableOffset   = f.readInt();
                int verticesTableEntries  = f.readInt();
                f.skip(0x28);
                int    skeletonOffset              = f.readInt();
                int    skeletonEntries             = f.readInt();
                int    skeletonNameOffset          = f.readInt();
                int    objectsNodeVisibilityOffset = f.readInt();
                int    objectsNodeCount            = f.readInt();
                String name = f.readString(f.readInt(), -1);
                int    objectsNodeNameEntries = f.readInt();
                int    objectsNodeNameOffset  = f.readInt();
                f.readInt(); //0x0
                int metaDataPointerOffset = f.readInt();

                f.seek(objectsNodeVisibilityOffset);
                int nodeVisibility = f.readInt();

                string[] objectName = new string[objectsNodeNameEntries];
                f.seek(objectsNodeNameOffset);
                int rootReferenceBit = f.readInt(); //Radix tree
                int rootLeftNode     = f.readUShort();
                int rootRightNode    = f.readUShort();
                int rootNameOffset   = f.readInt();

                for (int i = 0; i < objectsNodeNameEntries; i++)
                {
                    int   referenceBit = f.readInt();
                    short leftNode     = f.readShort();
                    short rightNode    = f.readShort();
                    objectName[i] = f.readString(f.readInt(), -1);
                }

                // Materials
                // NOTE: MATERIALS AND OBJECT SECTIONS ARE REALLY MESSY ATM

                String[] materialNames = new String[materialsTableEntries];
                for (int index = 0; index < materialsTableEntries; index++)
                {
                    f.seek(materialsTableOffset + (index * 0x2c));

                    int materialParametersOffset = f.readInt();
                    f.readInt();
                    f.readInt();
                    f.readInt();
                    int textureCommandsOffset    = f.readInt();
                    int textureCommandsWordCount = f.readInt();

                    int materialMapperOffset = f.readInt();
                    materialNames[index] = f.readString(f.readInt(), -1);
                }

                // Object Descriptions...
                // Assumes MBN is already loaded for now
                f.seek(verticesTableOffset);
                List <objDes> objDescriptors = new List <objDes>();
                if (mbn == null)
                {
                    mbn = new Smash_Forge.MBN();
                    for (int index = 0; index < verticesTableEntries; index++)
                    {
                        mbn.mesh.Add(new MBN.Mesh());
                    }
                    mbn.PreRender();
                }
                for (int index = 0; index < mbn.mesh.Count; index++)
                {
                    int i = f.readUShort();
                    if (index > mbn.mesh.Count)
                    {
                        break;
                    }
                    if (i > materialNames.Length)
                    {
                        break;
                    }
                    mbn.mesh[index].texId = textures[materialNames[i]].display;
                    Console.WriteLine("Tex index" + mbn.mesh[index].texId);
                    f.skip(2); // flags
                    int nameId = f.readUShort();
                    mbn.mesh[index].Text = objectName[nameId];

                    // node visibility TODO: finish...
                    mbn.mesh[index].Checked = ((nodeVisibility & (1 << nameId)) > 0);

                    mbn.mesh[index].renderPriority = f.readUShort();

                    objDes des = new objDes();
                    objDescriptors.Add(des);
                    des.vshAttBufferCommandOffset = f.readInt();
                    des.vshAttBufferCommandCount  = f.readInt();
                    des.faceOffset = f.readInt();
                    des.faceCount  = f.readInt();
                    des.vshAttBufferCommandOffsetEx = f.readInt();
                    des.vshAttBufferCommandCountEx  = f.readInt();

                    f.skip(12);  // center vector
                    f.skip(4);   // flagsOffset
                    f.skip(4);   // 0?
                    f.readInt(); //bbOffsets[i]
                }

                //Skeleton
                f.seek(skeletonOffset);
                for (int index = 0; index < skeletonEntries; index++)
                {
                    Bone bone      = new Bone(model.skeleton);
                    int  boneFlags = f.readInt();
                    bone.parentIndex = f.readShort();
                    short boneSpace = f.readShort();
                    bone.scale       = new float[3];
                    bone.rotation    = new float[3];
                    bone.position    = new float[3];
                    bone.scale[0]    = f.readFloat();
                    bone.scale[1]    = f.readFloat();
                    bone.scale[2]    = f.readFloat();
                    bone.rotation[0] = f.readFloat();
                    bone.rotation[1] = f.readFloat();
                    bone.rotation[2] = f.readFloat();
                    bone.position[0] = f.readFloat();
                    bone.position[1] = f.readFloat();
                    bone.position[2] = f.readFloat();

                    // bone matrix... not really needed to be stored per say
                    f.skip(4 * 4 * 3);

                    bone.Text = f.readString(f.readInt(), -1);

                    f.skip(4); // Meta data
                    bones.bones.Add(bone);


                    model.skeleton.bones.Add(bone);
                }
                model.skeleton.reset();
                model.skeleton.update();
            }
        }
Пример #29
0
        public override void Read(string filename)
        {
            FileData d = new FileData(filename);

            FilePath = filename;
            d.Endian = Endianness.Little; // characters are little
            d.seek(8);                    // skip magic and version?
            int count = d.readInt();      // entry count

            for (int i = 0; i < count; i++)
            {
                SBEntry sb = new SBEntry()
                {
                    hash     = (uint)d.readInt(),
                    param1_1 = d.readFloat(),
                    param1_2 = d.readInt(),
                    param1_3 = d.readInt(),
                    param2_1 = d.readFloat(),
                    param2_2 = d.readFloat(),
                    param2_3 = d.readInt(),
                    rx1      = d.readFloat(),
                    rx2      = d.readFloat(),
                    ry1      = d.readFloat(),
                    ry2      = d.readFloat(),
                    rz1      = d.readFloat(),
                    rz2      = d.readFloat()
                };

                for (int j = 0; j < 8; j++)
                {
                    sb.boneHashes[j] = (uint)d.readInt();
                }

                for (int j = 0; j < 4; j++)
                {
                    sb.unks1[j] = d.readFloat();
                }

                for (int j = 0; j < 6; j++)
                {
                    sb.unks2[j] = d.readFloat();
                }

                sb.factor = d.readFloat();

                for (int j = 0; j < 3; j++)
                {
                    sb.ints[j] = d.readInt();
                }

                bones.Add(sb);

                /*Console.WriteLine(sb.hash.ToString("x"));
                 * Console.WriteLine(d.readFloat() + " " + d.readInt() + " " + d.readInt());
                 * Console.WriteLine(d.readFloat() + " " + d.readInt() + " " + d.readInt());
                 *
                 * //28 floats?
                 * Console.WriteLine(d.readFloat() + " " + d.readFloat());
                 * Console.WriteLine(d.readFloat() + " " + d.readFloat());
                 * Console.WriteLine(d.readFloat() + " " + d.readFloat());
                 * Console.WriteLine(d.readFloat() + " " + d.readFloat() + " " + d.readFloat() + " " + d.readFloat());
                 * Console.WriteLine(d.readFloat() + " " + d.readFloat() + " " + d.readFloat() + " " + d.readFloat());
                 *
                 * Console.WriteLine(d.readFloat() + " " + d.readFloat() + " " + d.readFloat() + " " + d.readFloat());
                 * Console.WriteLine(d.readFloat() + " " + d.readFloat() + " " + d.readFloat() + " " + d.readFloat());
                 *
                 * Console.WriteLine(d.readFloat() + " " + d.readFloat());
                 * Console.WriteLine(d.readInt() +  " " + d.readInt());
                 * Console.WriteLine(d.readInt() + " " + d.readInt());
                 * Console.WriteLine();*/
            }
        }
Пример #30
0
        public override void Read(string filename)
        {
            FileData f = new FileData(filename);

            //Header
            f.skip(0x4);
            version    = f.readInt();
            frameCount = f.readInt();
            if (version == 4)
            {
                frameDuration = 1;
            }
            else if (version == 5)
            {
                frameDuration = f.readInt();
            }
            else
            {
                throw new NotImplementedException($"Unknown light.bin version {version}");
            }

            int[] offsets = new int[6];
            for (int i = 0; i < 6; i++)
            {
                offsets[i] = f.readInt();
            }

            //RGB properties
            for (int i = 0; i < 5; i++)
            {
                RgbProperty temp = new RgbProperty();

                temp.enabled = (offsets[i + 1] != 0);
                if (temp.enabled)
                {
                    f.seek(offsets[i + 1]);
                    for (int j = 0; j < frameCount; j++)
                    {
                        byte[] frame = new byte[3];
                        for (int k = 0; k < 3; k++)
                        {
                            frame[k] = (byte)f.readByte();
                        }
                        temp.frames.Add(frame);
                    }
                }

                rgbProperties.Add(temp);
            }

            //Light data
            f.seek(offsets[0]);
            for (int i = 0; i < frameCount; i++)
            {
                LightFrame temp = new LightFrame();

                for (int j = 0; j < 17; j++)
                {
                    for (int k = 0; k < 4; k++)
                    {
                        temp.lightSets[j].lights[k].enabled = f.readInt();
                        for (int l = 0; l < 3; l++)
                        {
                            temp.lightSets[j].lights[k].angle[l] = f.readFloat();
                        }
                        temp.lightSets[j].lights[k].colorHue = f.readFloat();
                        temp.lightSets[j].lights[k].colorSat = f.readFloat();
                        temp.lightSets[j].lights[k].colorVal = f.readFloat();
                    }
                    temp.lightSets[j].fog.unknown = (byte)f.readByte();
                    for (int k = 0; k < 3; k++)
                    {
                        temp.lightSets[j].fog.color[k] = (byte)f.readByte();
                    }
                }
                temp.effect.unknown = (byte)f.readByte();
                for (int j = 0; j < 3; j++)
                {
                    temp.effect.color[j] = (byte)f.readByte();
                }
                for (int j = 0; j < 3; j++)
                {
                    temp.effect.position[j] = f.readFloat();
                }

                lightFrames.Add(temp);
            }
        }