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); } }
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); } }