private void pasteRenderInfo(SOTreeNode so)
        {
            SuperObjectInfo info = GetStructure <SuperObjectInfo>(processHandle, so.superObject.info);

            info.renderInfo = clipboardBuffer;
            WriteStructure(processHandle, so.superObject.info, info);
        }
        private void setSOCamera(SOTreeNode so, bool camera)
        {
            SuperObjectInfo info = GetStructure <SuperObjectInfo>(processHandle, so.superObject.info);

            info.isCamera = camera ? 1 : 0;
            WriteStructure(processHandle, so.superObject.info, info);
        }
        private void copyRenderInfo(SOTreeNode so)
        {
            SuperObjectInfo info = GetStructure <SuperObjectInfo>(processHandle, so.superObject.info);

            clipboardBuffer = info.renderInfo;
        }
        private void retrieveHierarchyRecursive(SOTreeNode parent, int mainCharacterAddress, int previousMainSectorAddress)
        {
            int nextBrother = parent.superObject.firstChild; // First brother is the child of the parent object

            if (nextBrother == 0)
            {
                return;
            }
            do
            {
                SuperObject so = GetStructure <SuperObject>(processHandle, nextBrother);

                bool isMainChar       = (mainCharacterAddress == nextBrother) ? true : false;
                bool isPreviousSector = (previousMainSectorAddress == nextBrother) ? true : false;

                string          name           = "SO Type " + so.type + " address 0x" + nextBrother.ToString("X");
                SuperObjectInfo soInfo         = GetStructure <SuperObjectInfo>(processHandle, so.info);
                int             someInfoStruct = soInfo.standardGameStruct;
                int             string1address = someInfoStruct + 0x50;
                int             string2address = someInfoStruct + 0x84;
                int             string3address = someInfoStruct + 0xAC;
                string          string1        = ReadString(processHandle, string1address, 32);
                string          string2        = ReadString(processHandle, string2address, 32);
                string          string3        = ReadString(processHandle, string3address, 32);

                bool visible = SuperObject.getVisibleBit(so.renderBits);
                if (!visible)
                {
                    name = "(INVIS) " + name;
                }

                if (so.type == 2)
                {
                    name += "(" + string1 + ", " + string2 + ", " + string3 + ")";
                }

                if (isMainChar)
                {
                    if (so.type == 2)
                    {
                        name = "(M) " + name;
                    }
                    else
                    {
                        name = "(ACTIVE) " + name;
                    }
                }

                if (isPreviousSector)
                {
                    name = "(PREV ACTIVE) " + name;
                }

                var childNode = new SOTreeNode()
                {
                    name               = name,
                    superObject        = so,
                    superObjectAddress = nextBrother,
                    isMainCharacter    = isMainChar
                };

                retrieveHierarchyRecursive(childNode, mainCharacterAddress, previousMainSectorAddress);
                parent.subitems.Add(childNode);
                nextBrother = so.nextBrother;
            } while (nextBrother != 0);
        }