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; } } }
public void ReadFromSeg(RomManager rommgr, byte bankID, ObjectModelConfig config) { ReadFromSeg(rommgr, rommgr.GetSegBank(bankID), config); }