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