public HudParentBase()
            {
                State |= HudElementStates.IsRegistered;

                Visible  = true;
                children = new List <HudNodeBase>();

                accessorDelegates = new HudUpdateAccessors()
                {
                    Item1 = GetOrSetApiMember,
                    Item2 = new MyTuple <Func <ushort>, Func <Vector3D> >(() => layerData.fullZOffset, null),
                    Item3 = BeginInputDepth,
                    Item4 = BeginInput,
                    Item5 = BeginLayout,
                    Item6 = BeginDraw
                };
            }
                /// <summary>
                /// Builds sorted update accessor lists
                /// </summary>
                private void BuildSortedUpdateLists()
                {
                    // Lower 32 bits store the index, upper 32 store draw depth and distance
                    ulong indexMask = 0x00000000FFFFFFFF;

                    // Build sorted depth test list
                    for (int n = 0; n < indexBuffer.Count; n++)
                    {
                        int index = (int)(indexBuffer[n] & indexMask);
                        HudUpdateAccessors accessors = updateAccessors[index];

                        depthTestActionBuffer.Add(accessors.Item3);
                    }

                    // Build sorted input list
                    for (int n = 0; n < indexBuffer.Count; n++)
                    {
                        int index = (int)(indexBuffer[n] & indexMask);
                        HudUpdateAccessors accessors = updateAccessors[index];

                        inputActionBuffer.Add(accessors.Item4);
                    }

                    // Build sorted draw list
                    for (int n = 0; n < indexBuffer.Count; n++)
                    {
                        int index = (int)(indexBuffer[n] & indexMask);
                        HudUpdateAccessors accessors = updateAccessors[index];

                        drawActionBuffer.Add(accessors.Item6);
                    }

                    if (depthTestActionBuffer.Capacity > depthTestActionBuffer.Count * 3 && depthTestActionBuffer.Count > 200)
                    {
                        depthTestActionBuffer.TrimExcess();
                        inputActionBuffer.TrimExcess();
                        drawActionBuffer.TrimExcess();
                    }
                }
                /// <summary>
                /// Rebuilds main update accessor list from UI tree as well as the layout accessors
                /// </summary>
                private void RebuildUpdateLists()
                {
                    // Clear update lists and rebuild accessor lists from HUD tree
                    updateAccessors.Clear();
                    layoutActions.Clear();
                    uniqueOriginFuncs.Clear();

                    // Add client UI elements
                    for (int n = 0; n < clients.Count; n++)
                    {
                        updateAccessors.AddRange(clients[n].UpdateAccessors);
                    }

                    if (updateAccessors.Capacity > updateAccessors.Count * 3 && updateAccessors.Count > 200)
                    {
                        updateAccessors.TrimExcess();
                    }

                    // Build distance func HashSet
                    for (int n = 0; n < updateAccessors.Count; n++)
                    {
                        uniqueOriginFuncs.Add(updateAccessors[n].Item2.Item2);
                    }

                    layoutActions.EnsureCapacity(updateAccessors.Count);

                    // Build layout list (without sorting)
                    for (int n = 0; n < updateAccessors.Count; n++)
                    {
                        HudUpdateAccessors accessors = updateAccessors[n];
                        layoutActions.Add(accessors.Item5);
                    }

                    if (layoutActions.Capacity > layoutActions.Count * 3 && layoutActions.Count > 200)
                    {
                        layoutActions.TrimExcess();
                    }
                }