示例#1
0
        public void ReadHierarchies()
        {
            foreach (AddressClass ac in HierarchyAddresses)
            {
                uint adr = ac.Address;
                if (ROM.IsAddressSupported(adr) == false)
                {
                    continue;
                }

                uint blladr = Endian.SwapUInt32(BitConverter.ToUInt32(Nanami.RDRAM, (int)Nanami.Segments[adr >> 24].RAMAddress + (int)(adr & 0xFFFFFF)));
                if (ROM.IsAddressSupported(blladr) == false)
                {
                    return;
                }

                byte        lcount = Nanami.RDRAM[Nanami.Segments[adr >> 24].RAMAddress + (adr & 0xFFFFFF) + 4];
                LimbClass[] limbs  = new LimbClass[lcount];

                byte dlcount = lcount;
                if (ROM.IsAddressSupported((adr & 0xFFFFFF) + 8) == true)
                {
                    dlcount = Nanami.RDRAM[Nanami.Segments[adr >> 24].RAMAddress + (adr & 0xFFFFFF) + 8];
                    if (dlcount == 0)
                    {
                        dlcount = lcount;
                    }
                }
                HierarchyMatrices.Add(new byte[0x40 * dlcount]);

                for (int i = 0; i < limbs.Length; i++)
                {
                    uint cbadr = Endian.SwapUInt32(BitConverter.ToUInt32(Nanami.RDRAM, (int)(Nanami.Segments[blladr >> 24].RAMAddress + (blladr & 0xFFFFFF) + (i << 2))));
                    if (ROM.IsAddressSupported(cbadr) == false)
                    {
                        continue;
                    }

                    byte cbseg = (byte)(cbadr >> 24);
                    limbs[i]             = new LimbClass();
                    limbs[i].Translation = new Vector3d(
                        (double)Endian.SwapInt16(BitConverter.ToInt16(Nanami.RDRAM, (int)(Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF)))),
                        (double)Endian.SwapInt16(BitConverter.ToInt16(Nanami.RDRAM, (int)(Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 2))),
                        (double)Endian.SwapInt16(BitConverter.ToInt16(Nanami.RDRAM, (int)(Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 4))));
                    limbs[i].Child       = (sbyte)Nanami.RDRAM[Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 6];
                    limbs[i].Sibling     = (sbyte)Nanami.RDRAM[Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 7];
                    limbs[i].DisplayList = Endian.SwapUInt32(BitConverter.ToUInt32(Nanami.RDRAM, (int)(Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 8)));
                }

                Hierarchies.Add(limbs);
            }
        }
示例#2
0
        public void ReadHierarchies()
        {
            foreach (AddressClass ac in HierarchyAddresses)
            {
                uint adr = ac.Address;
                if (ROM.IsAddressSupported(adr) == false) continue;

                uint blladr = Endian.SwapUInt32(BitConverter.ToUInt32(Nanami.RDRAM, (int)Nanami.Segments[adr >> 24].RAMAddress + (int)(adr & 0xFFFFFF)));
                if (ROM.IsAddressSupported(blladr) == false) return;

                byte lcount = Nanami.RDRAM[Nanami.Segments[adr >> 24].RAMAddress + (adr & 0xFFFFFF) + 4];
                LimbClass[] limbs = new LimbClass[lcount];

                byte dlcount = lcount;
                if (ROM.IsAddressSupported((adr & 0xFFFFFF) + 8) == true)
                {
                    dlcount = Nanami.RDRAM[Nanami.Segments[adr >> 24].RAMAddress + (adr & 0xFFFFFF) + 8];
                    if (dlcount == 0) dlcount = lcount;
                }
                HierarchyMatrices.Add(new byte[0x40 * dlcount]);

                for (int i = 0; i < limbs.Length; i++)
                {
                    uint cbadr = Endian.SwapUInt32(BitConverter.ToUInt32(Nanami.RDRAM, (int)(Nanami.Segments[blladr >> 24].RAMAddress + (blladr & 0xFFFFFF) + (i << 2))));
                    if (ROM.IsAddressSupported(cbadr) == false) continue;

                    byte cbseg = (byte)(cbadr >> 24);
                    limbs[i] = new LimbClass();
                    limbs[i].Translation = new Vector3d(
                        (double)Endian.SwapInt16(BitConverter.ToInt16(Nanami.RDRAM, (int)(Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF)))),
                        (double)Endian.SwapInt16(BitConverter.ToInt16(Nanami.RDRAM, (int)(Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 2))),
                        (double)Endian.SwapInt16(BitConverter.ToInt16(Nanami.RDRAM, (int)(Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 4))));
                    limbs[i].Child = (sbyte)Nanami.RDRAM[Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 6];
                    limbs[i].Sibling = (sbyte)Nanami.RDRAM[Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 7];
                    limbs[i].DisplayList = Endian.SwapUInt32(BitConverter.ToUInt32(Nanami.RDRAM, (int)(Nanami.Segments[cbseg].RAMAddress + (cbadr & 0xFFFFFF) + 8)));
                }

                Hierarchies.Add(limbs);
            }
        }