Exemplo n.º 1
0
            public PathHeader(ROMHandler.ROMHandler rom, uint adr, int number)
            {
                ROM        = rom;
                Address    = adr;
                PathNumber = number;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null)
                {
                    return;
                }

                WaypointCount   = BitConverter.ToUInt32(segdata, (int)(adr & 0xFFFFFF));
                WaypointAddress = Endian.SwapUInt32(BitConverter.ToUInt32(segdata, (int)(adr & 0xFFFFFF) + 4));

                byte[] psegdata = (byte[])ROM.SegmentMapping[(byte)(WaypointAddress >> 24)];
                if (WaypointCount == 0 || WaypointCount > 0xFF || psegdata == null || (WaypointAddress & 0xFFFFFF) >= psegdata.Length)
                {
                    return;
                }

                Points = new List <Waypoint>();
                for (int i = 0; i < WaypointCount; i++)
                {
                    Points.Add(new Waypoint(ROM, (uint)(WaypointAddress + (i * 6))));
                }
            }
Exemplo n.º 2
0
            public OvlSections(ROMHandler.ROMHandler rom, ROMHandler.DMATableEntry dma, uint vstart)
            {
                byte[] ovl = new byte[dma.PEnd - dma.PStart];
                Buffer.BlockCopy(rom.Data, (int)dma.PStart, ovl, 0, ovl.Length);

                int indent, secaddr;

                indent  = (int)Endian.SwapUInt32(BitConverter.ToUInt32(ovl, ovl.Length - 4));
                secaddr = (ovl.Length - indent);

                text   = new byte[Endian.SwapUInt32(BitConverter.ToUInt32(ovl, secaddr))];
                textVA = vstart;
                Buffer.BlockCopy(ovl, (int)textVA, text, 0, text.Length);

                data   = new byte[Endian.SwapUInt32(BitConverter.ToUInt32(ovl, secaddr + 4))];
                dataVA = (uint)(textVA + text.Length);
                Buffer.BlockCopy(ovl, (int)dataVA, data, 0, data.Length);

                rodata   = new byte[Endian.SwapUInt32(BitConverter.ToUInt32(ovl, secaddr + 8))];
                rodataVA = (uint)(dataVA + data.Length);
                Buffer.BlockCopy(ovl, (int)rodataVA, rodata, 0, rodata.Length);

                bss   = new byte[Endian.SwapUInt32(BitConverter.ToUInt32(ovl, secaddr + 12))];
                bssVA = (uint)(rodataVA + rodata.Length);
                Buffer.BlockCopy(ovl, (int)bssVA, bss, 0, bss.Length);
            }
Exemplo n.º 3
0
        public F3DEX2Interpreter(ROMHandler.ROMHandler rom)
        {
            ROM        = rom;
            ActiveGLDL = new Stack <OpenGLHelpers.DisplayListEx>();

            InitializeParser();
            InitializeMacros();

            LastTriList = new List <SimpleTriangle>();

            VertexBuffer = new Vertex[32];
            rdphalf1     = GeometryMode = OtherModeH = LastComb0 = LastComb1 = 0;
            OtherModeL   = SimpleF3DEX2.OtherModeL.Empty;
            mtxstack     = new Stack <Matrix4d>();
            mtxstack.Push(Matrix4d.Identity);

            Textures    = new Texture[2];
            Textures[0] = new Texture();
            Textures[1] = new Texture();
            palette     = new Color4[256];
            texcache    = new List <TextureCache>();
            activetex   = 0;
            multitex    = false;
            ScaleS      = new float[2];
            ScaleT      = new float[2];

            InitCombiner();
        }
Exemplo n.º 4
0
        public F3DEX2Interpreter(ROMHandler.ROMHandler rom)
        {
            ROM = rom;
            ActiveGLDL = new Stack<OpenGLHelpers.DisplayListEx>();

            InitializeParser();
            InitializeMacros();

            LastTriList = new List<SimpleTriangle>();

            VertexBuffer = new Vertex[32];
            rdphalf1 = GeometryMode = OtherModeH = LastComb0 = LastComb1 = 0;
            OtherModeL = SimpleF3DEX2.OtherModeL.Empty;
            mtxstack = new Stack<Matrix4d>();
            mtxstack.Push(Matrix4d.Identity);

            Textures = new Texture[2];
            Textures[0] = new Texture();
            Textures[1] = new Texture();
            palette = new Color4[256];
            texcache = new List<TextureCache>();
            activetex = 0;
            multitex = false;
            ScaleS = new float[2];
            ScaleT = new float[2];

            InitCombiner();
        }
Exemplo n.º 5
0
            public RoomInfoClass(ROMHandler.ROMHandler rom, IHeaderParent parent, int num, uint s = 0, uint e = 0)
            {
                ROM = rom;
                Start = s;
                End = e;
                Parent = parent;
                Number = (ulong)num;

                if (Start != 0 && End != 0 && Start < rom.Data.Length && End < rom.Data.Length)
                {
                    ROMHandler.DMATableEntry dma = ROM.Files.Find(x => x.PStart == Start);
                    if (dma != null) DMAFilename = dma.Name;

                    Data = new byte[End - Start];
                    Array.Copy(ROM.Data, Start, Data, 0, End - Start);

                    if ((Description = (ROM.XMLRoomNames.Names[Start] as string)) == null)
                    {
                        ROMHandler.ISceneTableEntry parentste = (parent as ROMHandler.ISceneTableEntry);
                        if (parentste.IsNameExternal())
                        {
                            Description = string.Format("Room {0}", (Number + 1));
                        }
                        else
                        {
                            if (dma != null)
                                Description = DMAFilename;
                            else
                                Description = string.Format("S{0:X}-E{1:X}", Start, End);
                        }
                    }

                    Load();
                }
            }
Exemplo n.º 6
0
            public Polygon(ROMHandler.ROMHandler rom, uint adr, int number, Collision colheader)
            {
                ROM     = rom;
                Address = adr;
                Number  = number;
                ParentCollisionHeader = colheader;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null)
                {
                    return;
                }

                PolygonType                  = Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr & 0xFFFFFF)));
                NormalXDirection             = Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 0x8));
                NormalYDirection             = Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 0xA));
                NormalZDirection             = Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 0xC));
                CollisionPlaneDistFromOrigin = Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 0xE));

                /* Read vertex IDs & fetch vertices */
                VertexIDs = new ushort[3];
                Vertices  = new Vector3d[3];
                for (int i = 0; i < 3; i++)
                {
                    ushort vidx = (ushort)(Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr & 0xFFFFFF) + 0x2 + (i * 2))) & 0xFFF);
                    VertexIDs[i] = vidx;
                    Vertices[i]  = ParentCollisionHeader.Vertices[vidx];
                }
            }
Exemplo n.º 7
0
 public Generic(ROMHandler.ROMHandler rom, IHeaderParent parent, HeaderLoader.CommandTypeIDs cmdid)
 {
     ROM     = rom;
     InROM   = false;
     Command = cmdid;
     Offset  = -1;
     Data    = ulong.MaxValue;
     Parent  = parent;
 }
Exemplo n.º 8
0
            public Entry(ROMHandler.ROMHandler rom, uint adr)
            {
                ROM = rom;
                Address = adr;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null) return;

                Number = Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr & 0xFFFFFF)));
            }
Exemplo n.º 9
0
            public Entry(ROMHandler.ROMHandler rom, uint adr)
            {
                ROM     = rom;
                Address = adr;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null)
                {
                    return;
                }

                Number = Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr & 0xFFFFFF)));
            }
Exemplo n.º 10
0
            public RoomInfoClass(ROMHandler.ROMHandler rom, IHeaderParent parent, string fn)
            {
                ROM    = rom;
                Parent = parent;

                System.IO.FileStream fs = new System.IO.FileStream(fn, System.IO.FileMode.Open);
                Data = new byte[fs.Length];
                fs.Read(Data, 0, (int)fs.Length);
                fs.Close();

                Description = System.IO.Path.GetFileNameWithoutExtension(fn);

                Load();
            }
Exemplo n.º 11
0
            public PolygonType(ROMHandler.ROMHandler rom, uint adr, int number)
            {
                ROM     = rom;
                Address = adr;
                Number  = number;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null)
                {
                    return;
                }

                Raw = Endian.SwapUInt64(BitConverter.ToUInt64(segdata, (int)(adr & 0xFFFFFF)));
            }
Exemplo n.º 12
0
            public Waypoint(ROMHandler.ROMHandler rom, uint adr)
            {
                ROM     = rom;
                Address = adr;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null)
                {
                    return;
                }

                X = (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF)));
                Y = (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 2));
                Z = (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 4));
            }
Exemplo n.º 13
0
            public Entry(ROMHandler.ROMHandler rom, uint adr, int no, bool isspawn, bool istrans)
            {
                ROM = rom;
                Address = adr;
                NumberInList = no;
                IsSpawnPoint = isspawn;
                IsTransitionActor = istrans;

                /* Load raw data */
                RawData = new byte[16];
                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null) return;
                Buffer.BlockCopy(segdata, (int)(adr & 0xFFFFFF), RawData, 0, RawData.Length);

                /* Find definition, internal name */
                RefreshVariables();
            }
Exemplo n.º 14
0
        public Generic(ROMHandler.ROMHandler rom, IHeaderParent parent, byte seg, ref int ofs)
        {
            ROM     = rom;
            Command = (HeaderLoader.CommandTypeIDs)((byte[])rom.SegmentMapping[seg])[ofs];
            Offset  = ofs;
            Data    = Endian.SwapUInt64(BitConverter.ToUInt64(((byte[])rom.SegmentMapping[seg]), ofs));
            Parent  = parent;
            ofs    += 8;

            if (parent is HeaderCommands.Rooms.RoomInfoClass && (parent as HeaderCommands.Rooms.RoomInfoClass).Parent is SceneTableEntryOcarina)
            {
                ISceneTableEntry ste = ((parent as HeaderCommands.Rooms.RoomInfoClass).Parent as ISceneTableEntry);
                InROM = ste.IsInROM();
            }
            else if (parent is ISceneTableEntry)
            {
                InROM = (parent as ISceneTableEntry).IsInROM();
            }
        }
Exemplo n.º 15
0
            public Entry(ROMHandler.ROMHandler rom, uint adr)
            {
                ROM = rom;
                Address = adr;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null) return;

                adr &= 0xFFFFFF;

                AmbientColor = Color.FromArgb(segdata[adr], segdata[adr + 1], segdata[adr + 2]);
                Diffuse1Direction = new Vector4(((sbyte)segdata[adr + 3] / 255.0f), ((sbyte)segdata[adr + 4] / 255.0f), ((sbyte)segdata[adr + 5] / 255.0f), 0.0f);
                Diffuse1Color = Color.FromArgb(segdata[adr + 6], segdata[adr + 7], segdata[adr + 8]);
                Diffuse2Direction = new Vector4(((sbyte)segdata[adr + 9] / 255.0f), ((sbyte)segdata[adr + 10] / 255.0f), ((sbyte)segdata[adr + 11] / 255.0f), 0.0f);
                Diffuse2Color = Color.FromArgb(segdata[adr + 12], segdata[adr + 13], segdata[adr + 14]);
                FogColor = Color.FromArgb(segdata[adr + 15], segdata[adr + 16], segdata[adr + 17]);
                FogStart = (ushort)(Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr + 18))) & 0x3FF);
                DrawDistance = Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr + 20)));
            }
Exemplo n.º 16
0
            public RoomInfoClass(ROMHandler.ROMHandler rom, IHeaderParent parent, int num, uint s = 0, uint e = 0)
            {
                ROM    = rom;
                Start  = s;
                End    = e;
                Parent = parent;
                Number = (ulong)num;

                if (Start != 0 && End != 0 && Start < rom.Data.Length && End < rom.Data.Length)
                {
                    ROMHandler.DMATableEntry dma = ROM.Files.Find(x => x.PStart == Start);
                    if (dma != null)
                    {
                        DMAFilename = dma.Name;
                    }

                    Data = new byte[End - Start];
                    Array.Copy(ROM.Data, Start, Data, 0, End - Start);

                    if ((Description = (ROM.XMLRoomNames.Names[Start] as string)) == null)
                    {
                        ROMHandler.ISceneTableEntry parentste = (parent as ROMHandler.ISceneTableEntry);
                        if (parentste.IsNameExternal())
                        {
                            Description = string.Format("Room {0}", (Number + 1));
                        }
                        else
                        {
                            if (dma != null)
                            {
                                Description = DMAFilename;
                            }
                            else
                            {
                                Description = string.Format("S{0:X}-E{1:X}", Start, End);
                            }
                        }
                    }

                    Load();
                }
            }
Exemplo n.º 17
0
            public Entry(ROMHandler.ROMHandler rom, uint adr, int no, bool isspawn, bool istrans)
            {
                ROM               = rom;
                Address           = adr;
                NumberInList      = no;
                IsSpawnPoint      = isspawn;
                IsTransitionActor = istrans;

                /* Load raw data */
                RawData = new byte[16];
                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null)
                {
                    return;
                }
                Buffer.BlockCopy(segdata, (int)(adr & 0xFFFFFF), RawData, 0, RawData.Length);

                /* Find definition, internal name */
                RefreshVariables();
            }
Exemplo n.º 18
0
            public PathHeader(ROMHandler.ROMHandler rom, uint adr, int number)
            {
                ROM = rom;
                Address = adr;
                PathNumber = number;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null) return;

                WaypointCount = BitConverter.ToUInt32(segdata, (int)(adr & 0xFFFFFF));
                WaypointAddress = Endian.SwapUInt32(BitConverter.ToUInt32(segdata, (int)(adr & 0xFFFFFF) + 4));

                byte[] psegdata = (byte[])ROM.SegmentMapping[(byte)(WaypointAddress >> 24)];
                if (WaypointCount == 0 || WaypointCount > 0xFF || psegdata == null || (WaypointAddress & 0xFFFFFF) >= psegdata.Length) return;

                Points = new List<Waypoint>();
                for (int i = 0; i < WaypointCount; i++)
                {
                    Points.Add(new Waypoint(ROM, (uint)(WaypointAddress + (i * 6))));
                }
            }
Exemplo n.º 19
0
            public Entry(ROMHandler.ROMHandler rom, uint adr)
            {
                ROM     = rom;
                Address = adr;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null)
                {
                    return;
                }

                adr &= 0xFFFFFF;

                AmbientColor      = Color.FromArgb(segdata[adr], segdata[adr + 1], segdata[adr + 2]);
                Diffuse1Direction = new Vector4(((sbyte)segdata[adr + 3] / 255.0f), ((sbyte)segdata[adr + 4] / 255.0f), ((sbyte)segdata[adr + 5] / 255.0f), 0.0f);
                Diffuse1Color     = Color.FromArgb(segdata[adr + 6], segdata[adr + 7], segdata[adr + 8]);
                Diffuse2Direction = new Vector4(((sbyte)segdata[adr + 9] / 255.0f), ((sbyte)segdata[adr + 10] / 255.0f), ((sbyte)segdata[adr + 11] / 255.0f), 0.0f);
                Diffuse2Color     = Color.FromArgb(segdata[adr + 12], segdata[adr + 13], segdata[adr + 14]);
                FogColor          = Color.FromArgb(segdata[adr + 15], segdata[adr + 16], segdata[adr + 17]);
                FogStart          = (ushort)(Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr + 18))) & 0x3FF);
                DrawDistance      = Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr + 20)));
            }
Exemplo n.º 20
0
        public Vertex(ROMHandler.ROMHandler rom, byte[] raw, uint adr, Matrix4d mtx)
        {
            ROM = rom;

            Address = adr;
            adr    &= 0xFFFFFF;

            Position = new Vector3d(
                (double)Endian.SwapInt16(BitConverter.ToInt16(raw, (int)adr)),
                (double)Endian.SwapInt16(BitConverter.ToInt16(raw, (int)(adr + 2))),
                (double)Endian.SwapInt16(BitConverter.ToInt16(raw, (int)(adr + 4))));

            Position = Vector3d.Transform(Position, mtx);

            TexCoord = new Vector2d(
                (float)(Endian.SwapInt16(BitConverter.ToInt16(raw, (int)(adr + 8)))) * General.Fixed2Float[5],
                (float)(Endian.SwapInt16(BitConverter.ToInt16(raw, (int)(adr + 10)))) * General.Fixed2Float[5]);

            TexCoord.Normalize();

            Colors  = new byte[] { raw[adr + 12], raw[adr + 13], raw[adr + 14], raw[adr + 15] };
            Normals = new sbyte[] { (sbyte)raw[adr + 12], (sbyte)raw[adr + 13], (sbyte)raw[adr + 14] };
        }
Exemplo n.º 21
0
            public Waterbox(ROMHandler.ROMHandler rom, uint adr, int number, Collision colheader)
            {
                ROM     = rom;
                Address = adr;
                Number  = number;
                ParentCollisionHeader = colheader;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null)
                {
                    return;
                }

                Position = new Vector3d(
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF))),
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)((adr & 0xFFFFFF) + 2))),
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)((adr & 0xFFFFFF) + 4))));

                SizeXZ = new Vector2d(
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)((adr & 0xFFFFFF) + 6))),
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)((adr & 0xFFFFFF) + 8))));

                RoomPropRaw = (Endian.SwapUInt32(BitConverter.ToUInt32(segdata, (int)((adr & 0xFFFFFF) + 12))) & 0xFFFFFF);
            }
Exemplo n.º 22
0
        public MIPSEvaluator(ROMHandler.ROMHandler rom, ROMHandler.DMATableEntry dma, uint ramadr, RegisterHookDelegate reghook = null, ushort var = 0)
        {
            BaseAddress = ramadr;

            Registers = new uint[32];
            Stack     = new uint[256 * MIPS.SafetyVal];
            StackPos  = (int)(128 * MIPS.SafetyVal);

            Sections = new OvlSections(rom, dma, 0);

            MemoryMap = new List <MemoryRegion>();
            MemoryMap.Add(new MemoryRegion(Sections.text, ramadr + Sections.textVA));
            MemoryMap.Add(new MemoryRegion(Sections.data, ramadr + Sections.dataVA));
            MemoryMap.Add(new MemoryRegion(Sections.rodata, ramadr + Sections.rodataVA));
            MemoryMap.Add(new MemoryRegion(Sections.bss, ramadr + Sections.bssVA));

            RegisterHook = reghook;

            SpecialOps = new List <SpecialOp>();
            SpecialOps.Add(new SpecialOp(MIPS.LH((uint)MIPS.Register.R0, 0x1C, (uint)MIPS.Register.A0), MIPS.LH((uint)MIPS.Register.R0, 0x1C, (uint)MIPS.Register.A0), var));
            SpecialOps.Add(new SpecialOp(MIPS.LH((uint)MIPS.Register.R0, 0x1C, (uint)MIPS.Register.S0), MIPS.LH((uint)MIPS.Register.R0, 0x1C, (uint)MIPS.Register.A0), var));

            Watches = new List <uint>();
        }
Exemplo n.º 23
0
 public Rooms(ROMHandler.ROMHandler rom, IHeaderParent parent, string fn)
     : base(rom, parent, HeaderLoader.CommandTypeIDs.Rooms)
 {
     RoomInformation = new List <RoomInfoClass>();
     RoomInformation.Add(new RoomInfoClass(rom, parent, fn));
 }
Exemplo n.º 24
0
        public GameActor(ROMHandler.ROMHandler rom, ActorTableEntry ate)
        {
            ROM     = rom;
            ATEntry = ate;

            /* General stuff */
            HierarchyAddresses = new List <AddressClass>();
            AnimationAddresses = new List <AddressClass>();
            Hierarchies        = new List <LimbClass[]>();
            HierarchyMatrices  = new List <byte[]>();
            GlobalTranslation  = Vector3d.Zero;

            /* Object list */
            ObjectsUsed = new List <ObjectTableEntry>();
            ObjectsUsed.Add(ROM.Objects[1]);
            ObjectsUsed.Add(ROM.Objects[2]);
            ObjectsUsed.Add(ROM.Objects[3]);
            ObjectsUsed.Add(ROM.Objects[ATEntry.ObjectNumber]);

            /* Display list list */
            DisplayLists = new List <DisplayListEx>();

            /* Numbers */
            TotalFrames = CurrentHierarchy = CurrentAnimation = CurrentFrame = 0;

            /* Temp DL address list */
            List <uint> dladrs = new List <uint>();

            /* MIPS evaluation of overlay */
            if (ATEntry.StartAddress != 0)
            {
                DMATableEntry ovldma = ROM.Files.Find(x => x.VStart == ATEntry.StartAddress);
                if (ovldma != null)
                {
                    try
                    {
                        /* Create evaluator and begin */
                        //LogWriter = System.IO.File.CreateText("E:\\temp\\sorata\\log.txt");
                        MIPS = new MIPSEvaluator(rom, ovldma, ATEntry.RAMStartAddress, new MIPSEvaluator.RegisterHookDelegate(RegisterChecker), 0);
                        MIPS.BeginEvaluation();
                        //LogWriter.Close();

                        /* Parse results for DL addresses & additional objects */
                        foreach (MIPSEvaluator.Result res in MIPS.Results)
                        {
                            if (res.TargetAddress == (FunctionDisplayList1 & 0xFFFFFF) && res.Arguments[1] != 0)
                            {
                                dladrs.Add(res.Arguments[1]);
                            }
                            else if (res.TargetAddress == (FunctionDisplayList2 & 0xFFFFFF) && res.Arguments[3] != 0)
                            {
                                dladrs.Add(res.Arguments[3]);
                            }
                            else if (res.TargetAddress == (FunctionDisplayList3 & 0xFFFFFF) && res.Arguments[0] != 0)
                            {
                                dladrs.Add(res.Arguments[0]);
                            }

                            if (res.TargetAddress == (FunctionObjectNumber & 0xFFFFFF) && res.Arguments[1] != 0 && (ushort)res.Arguments[1] < ROM.ObjectCount)
                            {
                                ObjectsUsed.Add(ROM.Objects[(ushort)res.Arguments[1]]);
                            }
                        }

                        /* Log results with address arguments in segments 0x04, 0x05 or 0x06 */
                        //LogSuspiciousResults();
                    }
                    catch (Exception ex)
                    {
                        System.Windows.Forms.MessageBox.Show("Exception in MIPS evaluator!\n\n" + ex.ToString() + "\n\nPlease notify the developers of this error!", "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
                    }
                }
            }

            /* If no hierarchy/animation addresses found, use addresses from MIPS evaluation if any */
            if (MIPS != null && (HierarchyAddresses.Count == 0 || AnimationAddresses.Count == 0))
            {
                foreach (MIPSEvaluator.Result res in MIPS.Results)
                {
                    if (res.TargetAddress == (FunctionHierarchyAnim1 & 0xFFFFFF) ||
                        res.TargetAddress == (FunctionHierarchyAnim2 & 0xFFFFFF))
                    {
                        HierarchyAddresses.Add(new AddressClass(res.Arguments[2]));
                        AnimationAddresses.Add(new AddressClass(res.Arguments[3]));
                    }
                }
            }

            /* Remove garbage zeroes from address results */
            HierarchyAddresses.RemoveAll(x => x.Address == 0);
            AnimationAddresses.RemoveAll(x => x.Address == 0);

            /* Parse objects & scan for hierarchies and animations if needed */
            for (int i = 0; i < ObjectsUsed.Count; i++)
            {
                if (ObjectsUsed[i].DMA != null)
                {
                    byte seg = (byte)(ObjectsUsed[i].DMA.AssumedSegment == 0 ? 0x06 : ObjectsUsed[i].DMA.AssumedSegment);

                    byte[] loadsegdata = new byte[ObjectsUsed[i].DMA.PEnd - ObjectsUsed[i].DMA.PStart];
                    Buffer.BlockCopy(rom.Data, (int)ObjectsUsed[i].DMA.PStart, loadsegdata, 0, loadsegdata.Length);

                    ROM.SegmentMapping.Remove((byte)0x06);
                    ROM.SegmentMapping.Add((byte)0x06, loadsegdata);

                    if (seg == 0x06 /* && HierarchyAddresses.Count == 0*/)
                    {
                        ScanForHierarchies(seg);
                    }
                    if (seg == 0x06 /* && AnimationAddresses.Count == 0*/)
                    {
                        ScanForAnimations(seg);
                    }
                }
            }

            /* Hackish RAM segment generation for facial textures */
            ProcessFacialTextureHack();

            /* Ensure display list address validity */
            dladrs = dladrs.Where(x => ROM.IsAddressSupported(x) == true).ToList();

            /* If still no hierarchy/animation and display list addresses found, search for display lists in segment 0x06 */
            if (HierarchyAddresses.Count == 0 && AnimationAddresses.Count == 0 && dladrs.Count == 0)
            {
                dladrs = ScanForDisplayLists(0x06);
            }

            /* Execute display lists */
            if (dladrs != null)
            {
                foreach (uint dla in dladrs)
                {
                    DisplayListEx dlex = new DisplayListEx(ListMode.Compile);
                    ROM.Renderer.Render(dla);
                    dlex.End();
                    DisplayLists.Add(dlex);
                }
            }

            /* Clean up address results */
            if (HierarchyAddresses.Count != 0 && AnimationAddresses.Count != 0)
            {
                HierarchyAddresses = HierarchyAddresses.Where(x => ROM.IsAddressSupported(x.Address) == true).GroupBy(x => x.Address).Select(x => x.First()).ToList();
                AnimationAddresses = AnimationAddresses.Where(x => ROM.IsAddressSupported(x.Address) == true).GroupBy(x => x.Address).Select(x => x.First()).ToList();
            }

            /* Initial data read */
            ReadHierarchies();
            ReadAnimation(CurrentHierarchy, CurrentAnimation, CurrentFrame);
        }
Exemplo n.º 25
0
            public RoomInfoClass(ROMHandler.ROMHandler rom, IHeaderParent parent, string fn)
            {
                ROM = rom;
                Parent = parent;

                System.IO.FileStream fs = new System.IO.FileStream(fn, System.IO.FileMode.Open);
                Data = new byte[fs.Length];
                fs.Read(Data, 0, (int)fs.Length);
                fs.Close();

                Description = System.IO.Path.GetFileNameWithoutExtension(fn);

                Load();
            }
Exemplo n.º 26
0
            public Waypoint(ROMHandler.ROMHandler rom, uint adr)
            {
                ROM = rom;
                Address = adr;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null) return;

                X = (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF)));
                Y = (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 2));
                Z = (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 4));
            }
Exemplo n.º 27
0
            public Polygon(ROMHandler.ROMHandler rom, uint adr, int number, Collision colheader)
            {
                ROM = rom;
                Address = adr;
                Number = number;
                ParentCollisionHeader = colheader;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null) return;

                PolygonType = Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr & 0xFFFFFF)));
                NormalXDirection = Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 0x8));
                NormalYDirection = Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 0xA));
                NormalZDirection = Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 0xC));
                CollisionPlaneDistFromOrigin = Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF) + 0xE));

                /* Read vertex IDs & fetch vertices */
                VertexIDs = new ushort[3];
                Vertices = new Vector3d[3];
                for (int i = 0; i < 3; i++)
                {
                    ushort vidx = (ushort)(Endian.SwapUInt16(BitConverter.ToUInt16(segdata, (int)(adr & 0xFFFFFF) + 0x2 + (i * 2))) & 0xFFF);
                    VertexIDs[i] = vidx;
                    Vertices[i] = ParentCollisionHeader.Vertices[vidx];
                }
            }
Exemplo n.º 28
0
            public Waterbox(ROMHandler.ROMHandler rom, uint adr, int number, Collision colheader)
            {
                ROM = rom;
                Address = adr;
                Number = number;
                ParentCollisionHeader = colheader;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null) return;

                Position = new Vector3d(
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)(adr & 0xFFFFFF))),
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)((adr & 0xFFFFFF) + 2))),
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)((adr & 0xFFFFFF) + 4))));

                SizeXZ = new Vector2d(
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)((adr & 0xFFFFFF) + 6))),
                    (double)Endian.SwapInt16(BitConverter.ToInt16(segdata, (int)((adr & 0xFFFFFF) + 8))));

                RoomPropRaw = (Endian.SwapUInt32(BitConverter.ToUInt32(segdata, (int)((adr & 0xFFFFFF) + 12))) & 0xFFFFFF);
            }
Exemplo n.º 29
0
            public PolygonType(ROMHandler.ROMHandler rom, uint adr, int number)
            {
                ROM = rom;
                Address = adr;
                Number = number;

                byte[] segdata = (byte[])ROM.SegmentMapping[(byte)(adr >> 24)];
                if (segdata == null) return;

                Raw = Endian.SwapUInt64(BitConverter.ToUInt64(segdata, (int)(adr & 0xFFFFFF)));
            }