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