public void ToBinaryData(BinaryData data, int dataPos, int BankRomStart, int BankRamStart) { data.Position = dataPos; // Update all Pointers int newBankStart = dataPos - BankRomStart + BankRamStart; int tdif = newBankStart - Fast3DBankStart; foreach (Geopointer geop in DLPointers) { var geopointerSegBank = geop.SegPointer >> 24; if (geopointerSegBank == Fast3DBankStart >> 24) { var ende = false; Position = geop.SegPointer - Fast3DBankStart; do { var switchExpr = ReadByte(); switch (switchExpr) { case 0xB8: { ende = true; break; } case 0x3: case 0x4: case 0x6: case 0xFD: { base.Position += 3; var sd = new BinaryStreamData(this); int p = sd.ReadInt32(); p += tdif; base.Position -= 4; sd.Write(p); break; } default: { base.Position += 7; break; } } }while (!ende && base.Position < base.Length); geop.SegPointer += tdif; } } // Write Fast3D foreach (byte b in base.ToArray()) { data.Write(b); } Fast3DBankStart = newBankStart; }
public void ReadFromSeg(RomManager rommgr, SegmentedBank seg, ObjectModelConfig config) { Stream s; BinaryData data; Levelscript.Clear(); CurSeg = seg; s = seg.ReadDataIfNull(rommgr); data = new BinaryStreamData(s); // Get configuration Config = config; // Read Levelscript Levelscript.Read(rommgr, seg.BankAddress, LevelscriptCommandTypes.JumpBack, new Dictionary <byte, SegmentedBank>() { { seg.BankID, seg } }); // Parse Levelscript & Load Models for (int i = 0, loopTo = Levelscript.Count - 1; i <= loopTo; i++) { LevelscriptCommand cmd = (LevelscriptCommand)Levelscript[i]; switch (cmd.CommandType) { case LevelscriptCommandTypes.LoadPolygonWithGeo: var obj = new CustomModel() { Config = config.GetCustomObjectConfig(i) }; // Load Model ID & Geolayout Offset obj.ModelID = clLoadPolygonWithGeo.GetModelID(cmd); int geoAddr = clLoadPolygonWithGeo.GetSegAddress(cmd); obj.GeolayoutBankOffset = geoAddr & 0xFFFFFF; if (geoAddr >> 24 == seg.BankID) { // Load Model Offset & Length data.Position = obj.GeolayoutBankOffset - 0x10; obj.ModelBankOffset = data.ReadInt32(); int f3d_length = data.ReadInt32(); int colOffset = data.ReadInt32(); int colPointer = colOffset | seg.BankAddress; obj.CollisionPointer = colPointer; // Load Geolayout obj.Geolayout = new Geolayout.Geolayout(Geolayout.Geolayout.NewScriptCreationMode.None); obj.Geolayout.Read(rommgr, geoAddr); // Load Model obj.Model = new Model.ObjectModel(); obj.Model.FromBinaryData(data, 0, seg.BankAddress, obj.ModelBankOffset, f3d_length, obj.Geolayout.Geopointers.ToArray(), colPointer); // Add Object to list Models.Add(obj); } break; } } }