Example #1
0
        private void Form1_Load(object sender, EventArgs e)
        {
            bool flip = false;
            GTFS fs   = new GTFS("bed.3ds");

            while (fs.Position < fs.Length)
            {
                uint id   = GT.ReadUInt16(fs, 2, flip);
                uint next = GT.ReadUInt32(fs, 4, flip);

                if (id == 0x4D4D)
                {
                    Console.WriteLine("Main Chunk");
                    uint fileSize = next;
                }
                else if (id == 0x0002)
                {
                    Console.WriteLine("M3D Version / 3DS-Version");
                    int version = GT.ReadInt32(fs, 4, flip);
                }
                else if (id == 0x3D33)
                {
                    Console.WriteLine("Unknown");
                    fs.Position += next;
                }
                else if (id == 0x3D3D)
                {
                    Console.WriteLine("3D Editor Chunk");
                }
                else if (id == 0x3D3E)
                {
                    int version = GT.ReadInt32(fs, 4, flip);
                    Console.WriteLine("Mesh version");
                }
                else if (id == 0x4000)
                {
                    Console.WriteLine("Object Block");
                    string name = GT.ReadASCIItoNull(fs, fs.Position, flip);
                    fs.Position += name.Length + 1;
                }
                else if (id == 0x4100)
                {
                    Console.WriteLine("Triangular mesh");
                }
                else if (id == 0x4110)
                {
                    Console.WriteLine("Vertices List");
                    int vertexnumber = GT.ReadInt16(fs, 2, flip);
                    for (int i = 0; i < vertexnumber; i++)
                    {
                        float v1 = GT.ReadFloat(fs, 4, flip);
                        float v2 = GT.ReadFloat(fs, 4, flip);
                        float v3 = GT.ReadFloat(fs, 4, flip);
                    }
                }
                else if (id == 0x4120)
                {
                    Console.WriteLine("Faces description");
                    int facenumber = GT.ReadInt16(fs, 2, flip);
                    for (int i = 0; i < facenumber; i++)
                    {
                        int vA       = GT.ReadInt16(fs, 2, flip);
                        int vB       = GT.ReadInt16(fs, 2, flip);
                        int vC       = GT.ReadInt16(fs, 2, flip);
                        int faceFlag = GT.ReadInt16(fs, 2, flip);
                    }
                }
                else if (id == 0x4130)
                {
                    Console.WriteLine("Faces material list");
                    string name = GT.ReadASCIItoNull(fs, fs.Position, flip);
                    fs.Position += name.Length + 1;
                    int entries = GT.ReadInt16(fs, 2, flip);
                    for (int i = 0; i < entries; i++)
                    {
                        int face = GT.ReadInt16(fs, 2, flip);
                    }
                }
                else if (id == 0x4140)
                {
                    Console.WriteLine("Mapping coordinates list for each vertex");
                    int vertnum = GT.ReadInt16(fs, 2, flip);
                    for (int i = 0; i < vertnum; i++)
                    {
                        float uC = GT.ReadFloat(fs, 4, flip);
                        float vC = GT.ReadFloat(fs, 4, flip);
                    }
                }
                else if (id == 0x4150)
                {
                    Console.WriteLine("Smoothing groups list");
                    //List of Int, one per face
                    uint _numOfFaces = (next - 4) / 4;
                    for (uint i = 0; i < _numOfFaces; i++)
                    {
                        int s = GT.ReadInt32(fs, 4, flip);
                    }
                }
                else if (id == 0x4160)
                {
                    Console.WriteLine("Local coordinate system");
                    float x1x = GT.ReadFloat(fs, 4, flip);
                    float x1y = GT.ReadFloat(fs, 4, flip);
                    float x1z = GT.ReadFloat(fs, 4, flip);

                    float x2x = GT.ReadFloat(fs, 4, flip);
                    float x2y = GT.ReadFloat(fs, 4, flip);
                    float x2z = GT.ReadFloat(fs, 4, flip);

                    float x3x = GT.ReadFloat(fs, 4, flip);
                    float x3y = GT.ReadFloat(fs, 4, flip);
                    float x3z = GT.ReadFloat(fs, 4, flip);

                    float ox = GT.ReadFloat(fs, 4, flip);
                    float oy = GT.ReadFloat(fs, 4, flip);
                    float oz = GT.ReadFloat(fs, 4, flip);
                }
                else if (id == 0xAFFF)
                {
                    Console.WriteLine("Material editor chunk");
                }
                else if (id == 0xA000)
                {
                    Console.WriteLine("Material name");
                    string name = GT.ReadASCIItoNull(fs, fs.Position, flip);
                    Console.WriteLine("> " + name);
                    fs.Position += name.Length + 1;
                }
                else if (id == 0xA010)
                {
                    Console.WriteLine("Material ambient color");
                }
                else if (id == 0xA020)
                {
                    Console.WriteLine("Diffuse color");
                }
                else if (id == 0xA030)
                {
                    Console.WriteLine("Material specular color");
                }
                else if (id == 0xA040)
                {
                    Console.WriteLine("Material shininess percent");
                }
                else if (id == 0xA041)
                {
                    Console.WriteLine("Material shininess strength percent");
                }
                else if (id == 0xA050)
                {
                    Console.WriteLine("Transparency percent");
                }
                else if (id == 0xA052)
                {
                    Console.WriteLine("Transparency falloff percent");
                }
                else if (id == 0xA053)
                {
                    Console.WriteLine("Reflection blur percent");
                }
                else if (id == 0xA084)
                {
                    Console.WriteLine("Self Illumination");
                    uint u1 = GT.ReadUInt32(fs, 4, flip);
                    uint u2 = GT.ReadUInt32(fs, 4, flip);
                }
                else if (id == 0xA087)
                {
                    Console.WriteLine("Wire thickness");
                    float wire = GT.ReadFloat(fs, 4, flip);
                }
                else if (id == 0xA08A)
                {
                    Console.WriteLine("In tranc / Transparency fall off IN");
                }
                else if (id == 0xA100)
                {
                    Console.WriteLine("Render type");
                    uint type = GT.ReadUInt16(fs, 2, flip);
                    //Unsigned Short [1=flat 2=gour. 3=phong 4=metal]
                }
                else if (id == 0xA200)
                {
                    Console.WriteLine("Texture map 1");
                    uint u1 = GT.ReadUInt32(fs, 4, flip);
                    uint u2 = GT.ReadUInt32(fs, 4, flip);
                }
                else if (id == 0xA300)
                {
                    Console.WriteLine("Mapping filename");
                    string name = GT.ReadASCIItoNull(fs, fs.Position, flip);
                    Console.WriteLine("> " + name);
                    fs.Position += name.Length + 1;
                }
                else if (id == 0xA351)
                {
                    Console.WriteLine("Mapping parameters");
                    uint u1 = GT.ReadUInt16(fs, 2, flip);
                }
                else if (id == 0xA353)
                {
                    Console.WriteLine("Mapping parameters");
                    uint u1 = GT.ReadUInt32(fs, 4, flip);
                }
                else if (id == 0xA354)
                {
                    Console.WriteLine("V scale");
                    float vS = GT.ReadFloat(fs, 4, flip);
                }
                else if (id == 0xA356)
                {
                    Console.WriteLine("U scale");
                    float uS = GT.ReadFloat(fs, 4, flip);
                }
                else if (id == 0xB000)
                {
                    Console.WriteLine("Keyframer chunk");
                    fs.Position += next - 4;
                }
                else if (id == 0x0011)
                {
                    Console.WriteLine("byte RGB");
                    byte r = GT.ReadByte(fs);
                    byte g = GT.ReadByte(fs);
                    byte b = GT.ReadByte(fs);
                }
                else if (id == 0x0030)
                {
                    Console.WriteLine("percent (int format)");
                    uint percent = GT.ReadUInt16(fs, 2, flip);
                }
                else if (id == 0x0100)
                {
                    Console.WriteLine("One unit");
                    float f = GT.ReadFloat(fs, 4, flip);
                }
                else
                {
                    long pos = fs.Position;
                    uint idd = id;
                    Console.WriteLine();
                }
            }
        }
Example #2
0
        public static List <string> Open(string file, string outdir)
        {
            GTFS fs = new GTFS(file);

            byte[] bHeader = GT.ReadBytes(fs, 4, false);
            bool   flip    = false;

            List <Pack> pack = new List <Pack>();

            if (bHeader[1] == 0x38)
            {
                long lOffsetTail        = GT.ReadUInt32(fs, 4, flip);
                long lNumResources      = GT.ReadUInt32(fs, 4, flip);
                long lOffsetStringTable = GT.ReadUInt32(fs, 4, flip);
                long lOffsetStringSize  = GT.ReadUInt32(fs, 4, flip);

                string hoho = GT.ReadASCII(fs, 12, flip);

                fs.Position = lOffsetTail;
                for (int i = 0; i < lNumResources; i++)
                {
                    long lOffsetFileName = GT.ReadUInt32(fs, 4, flip);
                    long lFileSize       = GT.ReadUInt32(fs, 4, flip);
                    long lOffsetFile     = GT.ReadUInt32(fs, 4, flip);

                    long   lStart  = lOffsetStringTable + lOffsetFileName;
                    string sString = GT.ReadASCIItoNull(fs, lStart, flip);

                    pack.Add(new Pack(sString, lOffsetFile, lFileSize));
                }
            }
            else if (bHeader[1] == 0x34)
            {
                long lOffsetTail = GT.ReadUInt32(fs, 4, flip);
                long lTailSize   = GT.ReadUInt32(fs, 4, flip);
                long lReserved   = GT.ReadUInt32(fs, 4, flip);

                fs.Position = lOffsetTail;
                long lNumResources = lTailSize / 60;
                for (int i = 0; i < lNumResources; i++)
                {
                    long last = fs.Position;

                    string sString = GT.ReadASCIItoNull(fs, fs.Position, flip);

                    fs.Position = last + 48;

                    long   lOffsetFile = GT.ReadUInt32(fs, 4, flip);
                    long   lFileSize   = GT.ReadUInt32(fs, 4, flip);
                    byte[] bFReserved  = GT.ReadBytes(fs, 4, false);

                    pack.Add(new Pack(sString, lOffsetFile, lFileSize));
                }
            }
            else
            {
                MessageBox.Show("Is " + file + " a TS2 Pak file?");
            }

            List <string> listFiles = new List <string>();

            foreach (Pack pf in pack)
            {
                pf.WriteOut(fs, outdir);
                listFiles.Add(pf.Filename);
            }
            return(listFiles);
        }
Example #3
0
        public static List <string> Open(string file, string outdir)
        {
            GTFS fs = new GTFS(file);

            byte[] bHeader = GT.ReadBytes(fs, 4, false);
            bool   flip    = false;

            List <Pack> pack = new List <Pack>();

            if (bHeader[1] == 0x35)   //P5CK (TS:FP GC)

            {
                bool isGamecube = false;
                Dictionary <string, string> c2n = new Dictionary <string, string>();
                string filec2n = file.ToLower().Replace(".pak", ".c2n");
                if (File.Exists(filec2n))
                {
                    isGamecube = true;

                    GTFS cs = new GTFS(filec2n);

                    while (true)
                    {
                        byte[] ox = GT.ReadBytes(cs, 2, flip);

                        if (ox[0] == 0x30 && ox[1] == 0x78)
                        {
                            string sAddress = GT.ReadASCII(cs, 8, flip);
                            byte[] blank    = GT.ReadBytes(cs, 2, flip);
                            string sString  = GT.ReadASCIItoNull(cs, cs.Position, flip, 0x0A);
                            cs.Position += sString.Length + 1;

                            if (!c2n.ContainsKey(sAddress))
                            {
                                c2n.Add(sAddress, sString);
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                //---

                long lOffsetTail = GT.ReadUInt32(fs, 4, flip);
                long lTailSize   = GT.ReadUInt32(fs, 4, flip);
                long lReserved   = GT.ReadUInt32(fs, 4, flip);

                long lNumResources = lTailSize / 16;

                fs.Position = lOffsetTail;
                for (int i = 0; i < lNumResources; i++)
                {
                    byte[] bOff1       = GT.ReadBytes(fs, 4, true);
                    long   lOffsetFile = GT.ReadUInt32(fs, 4, flip); //PS2

                    long lFileSizePS2 = GT.ReadUInt32(fs, 4, flip);
                    long lFileSizeGC  = GT.ReadUInt32(fs, 4, flip);

                    string sMemory = BitConverter.ToString(bOff1).Replace("-", "").ToLower();

                    long lFileSize = (isGamecube ? lFileSizeGC : lFileSizePS2);

                    string sString;
                    if (c2n.ContainsKey(sMemory)) // Should only be used for GC
                    {
                        sString = c2n[sMemory];
                    }
                    else // Should only be used for PS2
                    {
                        sString = sMemory;
                    }

                    //Console.WriteLine(sMemory + "," + lOffsetFile + "," + lFileSize);

                    pack.Add(new Pack(sString, lOffsetFile, lFileSize));
                }
            }
            else
            {
                throw new Exception();
            }

            List <string> listFiles = new List <string>();

            foreach (Pack pf in pack)
            {
                pf.WriteOut(fs, outdir);
                listFiles.Add(pf.Filename);
            }
            return(listFiles);
        }