Ejemplo n.º 1
0
    public static void DecodeGeoLayout(ROM SM64ROM, uint offset, bool ColourBuffer)
    {
        for (uint i = offset; i < SM64ROM.getEndROMAddr();)
        {
            if (SM64ROM.getByte(i) > 0x20)
            {
                return;
            }
            uint segaddr;
            switch (SM64ROM.getByte(i))
            {
            case 0:
                increment = 8;
                break;

            case 1:;
                return;

            case 2:
                JumpAddr = SM64ROM.readSegmentAddr(SM64ROM.ReadFourBytes(i + 4));
                GeoLayouts.DecodeGeoLayout(SM64ROM, JumpAddr, ColourBuffer);
                if (SM64ROM.getByte(i + 1) == 0)
                {
                    return;
                }
                increment = 8;
                break;

            case 3:
                return;

            case 4:
                //open node
                increment = 4;
                break;

            case 5:
                //close node
                increment = 4;
                break;

            case 8:
                increment = 12;
                break;

            case 9:
                increment = 4;
                break;

            case 0x0A:
                if (SM64ROM.getByte(i + 1) > 0)
                {
                    increment = 12;
                }
                else
                {
                    increment = 8;
                }
                break;

            case 0x0B:
                increment = 4;
                break;

            case 0x0C:
                increment = 4;
                break;

            case 0x0D:
                increment = 8;
                break;

            case 0x0E:
                increment = 8;
                break;

            case 0x0F:
                increment = 0x14;
                break;

            case 0x10:
                //rotate
                increment = 16;
                break;

            case 0x13:
                //Load DL with rotation
                increment = 12;
                if (SM64ROM.getByte(i + 8) == 0)
                {
                    break;
                }
                drawlayer = SM64ROM.getByte(i + 1);
                if (drawlayer > (4 - Convert.ToInt32(LevelScripts.IsRomManager)) && !GeoLayouts.OpaqueRendered)
                {
                    break;
                }
                if (drawlayer <= (4 - Convert.ToInt32(LevelScripts.IsRomManager)) && GeoLayouts.OpaqueRendered)
                {
                    break;
                }
                segaddr = SM64ROM.ReadFourBytes(i + 8);
                DecideBufferAndAddr(SM64ROM.getByte(i + 1), segaddr, ColourBuffer);
                if (F3D.Culling)
                {
                    F3D.GeoMode |= 0x022000;                  //Generate geomode for vector lighting and backface culling
                }
                else
                {
                    F3D.GeoMode |= 0x020000;      //If culling is off, only generate vector lighting
                }
                F3D.ParseF3DDL(SM64ROM, segaddr, ColourBuffer);
                break;

            case 0x14:
                //billboard
                increment = 8;
                break;

            case 0x15:
                //Load DL
                increment = 8;
                segaddr   = SM64ROM.ReadFourBytes(i + 4);
                if (ModelsList.Contains(segaddr))
                {
                    break;
                }
                drawlayer = SM64ROM.getByte(i + 1);
                if (drawlayer >= (4 - Convert.ToInt32(LevelScripts.IsRomManager)))
                {
                    ExtAlphaDLPointer = i;
                }
                if (drawlayer > (4 - Convert.ToInt32(LevelScripts.IsRomManager)) && !GeoLayouts.OpaqueRendered)
                {
                    break;
                }
                if (drawlayer <= (4 - Convert.ToInt32(LevelScripts.IsRomManager)) && GeoLayouts.OpaqueRendered)
                {
                    break;
                }
                DecideBufferAndAddr(SM64ROM.ReadEightBytes(i), segaddr, ColourBuffer);
                if (F3D.Culling)
                {
                    F3D.GeoMode |= 0x022000;                 //Generate geomode for vector lighting and backface culling
                }
                else
                {
                    F3D.GeoMode |= 0x020000;      //If culling is off, only generate vector lighting
                }
                F3D.ParseF3DDL(SM64ROM, segaddr, ColourBuffer);
                Array.Resize(ref ModelsList, ModelsList.Length + 1);
                ModelsList[ModelsList.Length - 1] = segaddr;
                if (!Textures.FirstTexLoad)
                {
                    break;
                }
                Array.Resize(ref ExtDLPointers[drawlayer], ExtDLPointers[drawlayer].Length + 1); //Increase size by one to add
                ExtDLPointers[drawlayer][ExtDLPointers[drawlayer].Length - 1] = i;               //set last index to addr
                break;

            case 0x16:
                increment = 8;
                break;

            case 0x17:
                increment = 4;
                break;

            case 0x18:
                increment = 8;
                break;

            case 0x19:
                increment = 8;
                break;

            case 0x1A:
                increment = 8;
                break;

            case 0x1D:
                //scale, can be 12 length in rare occurence
                increment = 8;
                break;

            case 0x1E:
                increment = 8;
                break;

            case 0x1F:
                increment = 16;
                break;

            case 0x20:
                increment = 4;
                break;
            }
            if (Textures.FirstTexLoad && ROMManager.debug) // Debug TXT
            {
                Array.Resize(ref LevelScripts.DebugScript, LevelScripts.DebugScript.Length + 1);
                LevelScripts.DebugScript[LevelScripts.DebugScript.Length - 1] = i.ToString("x") + ": ";
                for (uint j = i; j < i + increment; j++)
                {
                    LevelScripts.DebugScript[LevelScripts.DebugScript.Length - 1] += SM64ROM.getByte(j).ToString("x") + " ";
                }
            }
            i += increment;
        }
    }
Ejemplo n.º 2
0
    public static void DecodeGeoLayout(ROM SM64ROM, uint offset, bool ColourBuffer)
    {
        for (uint i = offset; i < SM64ROM.getEndROMAddr();)
        {
            if (SM64ROM.getByte(i) > 0x20)
            {
                return;
            }
            uint segaddr;
            switch (SM64ROM.getByte(i))
            {
            case 0:
                increment = 8;
                break;

            case 1:;
                return;

            case 2:
                JumpAddr = SM64ROM.readSegmentAddr(SM64ROM.ReadFourBytes(i + 4));
                GeoLayouts.DecodeGeoLayout(SM64ROM, JumpAddr, ColourBuffer);
                if (SM64ROM.getByte(i + 1) == 0)
                {
                    return;
                }
                increment = 8;
                break;

            case 3:
                return;

            case 4:
                //open node
                increment = 4;
                break;

            case 5:
                //close node
                increment = 4;
                break;

            case 8:
                increment = 12;
                break;

            case 9:
                increment = 4;
                break;

            case 0x0A:
                if (SM64ROM.getByte(i + 1) > 0)
                {
                    increment = 12;
                }
                else
                {
                    increment = 8;
                }
                break;

            case 0x0B:
                increment = 4;
                break;

            case 0x0C:
                increment = 4;
                break;

            case 0x0D:
                increment = 8;
                break;

            case 0x0E:
                increment = 8;
                break;

            case 0x0F:
                increment = 0x14;
                break;

            case 0x10:
                //rotate
                increment = 16;
                break;

            case 0x13:
                //Load DL with rotation
                increment = 12;
                if (SM64ROM.getByte(i + 8) == 0)
                {
                    break;
                }
                drawlayer = SM64ROM.getByte(i + 1);
                if (drawlayer > 4 && !GeoLayouts.OpaqueRendered)
                {
                    break;
                }
                if (drawlayer <= 4 && GeoLayouts.OpaqueRendered)
                {
                    break;
                }
                segaddr = SM64ROM.ReadFourBytes(i + 8);
                DecideBufferAndAddr(SM64ROM.getByte(i + 1), segaddr, ColourBuffer);
                F3D.ParseF3DDL(SM64ROM, segaddr, ColourBuffer);
                break;

            case 0x14:
                //billboard
                increment = 8;
                break;

            case 0x15:
                //Load DL
                increment = 8;
                drawlayer = SM64ROM.getByte(i + 1);
                if (drawlayer >= 4)
                {
                    ExtAlphaDLPointer = i;
                }
                if (drawlayer > 4 && !GeoLayouts.OpaqueRendered)
                {
                    break;
                }
                if (drawlayer <= 4 && GeoLayouts.OpaqueRendered)
                {
                    break;
                }
                segaddr = SM64ROM.ReadFourBytes(i + 4);
                DecideBufferAndAddr(SM64ROM.ReadEightBytes(i), segaddr, ColourBuffer);
                F3D.ParseF3DDL(SM64ROM, segaddr, ColourBuffer);
                if (!Textures.FirstTexLoad)
                {
                    break;
                }
                Array.Resize(ref ExtDLPointers[drawlayer], ExtDLPointers[drawlayer].Length + 1); //Increase size by one to add
                ExtDLPointers[drawlayer][ExtDLPointers[drawlayer].Length - 1] = i;               //set last index to addr
                break;

            case 0x16:
                increment = 8;
                break;

            case 0x17:
                increment = 4;
                break;

            case 0x18:
                increment = 8;
                break;

            case 0x19:
                increment = 8;
                break;

            case 0x1A:
                increment = 8;
                break;

            case 0x1D:
                //scale, can be 12 length in rare occurence
                increment = 8;
                break;

            case 0x1E:
                increment = 8;
                break;

            case 0x1F:
                increment = 16;
                break;

            case 0x20:
                increment = 4;
                break;
            }

            /*if(Textures.FirstTexLoad)using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"e:\test4.txt", true)) //Debug Txt
             * {
             *  file.Write(i.ToString("x") + ": ");
             *  for (uint j = i; j < i + increment; j++)
             *  {
             *      file.Write(SM64ROM.getByte(j).ToString("x") + " ");
             *  }
             *  file.WriteLine("\n");
             *  file.Close();
             * }*/
            i += increment;
        }
    }