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; } }
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; } }