예제 #1
0
        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;
        }
예제 #2
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;
                }
            }
        }