public static void AddGraphicsTriangleVerticesToTriangleTab() { int numVertices = 3; if (KeyboardUtilities.IsCtrlHeld()) { numVertices = 4; } if (KeyboardUtilities.IsNumberHeld()) { numVertices = KeyboardUtilities.GetCurrentlyInputtedNumber().Value; } uint triangleAddress = Config.TriangleManager.TriangleAddress; if (triangleAddress == 0) { return; } TriangleDataModel triangle = new TriangleDataModel(triangleAddress); List <List <short> > triangleVertices = new List <List <short> >() { new List <short>() { triangle.X1, triangle.Y1, triangle.Z1 }, new List <short>() { triangle.X2, triangle.Y2, triangle.Z2 }, new List <short>() { triangle.X3, triangle.Y3, triangle.Z3 }, }; int structSize = numVertices * 0x10; uint ramStart = 0x80000000; for (uint baseAddress = ramStart; baseAddress < ramStart + Config.RamSize - structSize; baseAddress += 2) { List <uint> addresses = new List <uint>(); List <string> names = new List <string>(); List <List <short> > vertices = new List <List <short> >(); for (int i = 0; i < numVertices; i++) { List <short> vertex = new List <short>(); for (int j = 0; j < 3; j++) { uint offset = (uint)(i * 0x10 + j * 0x02); uint address = baseAddress + offset; short value = Config.Stream.GetInt16(address); string component = j == 0 ? "x" : j == 1 ? "y" : "z"; string name = "v" + (i + 1) + component; addresses.Add(address); names.Add(name); vertex.Add(value); } vertices.Add(vertex); } List <List <List <short> > > vertexSubsets = ControlUtilities.GetSubsets(vertices, 3); foreach (List <List <short> > vertexSubset in vertexSubsets) { if (AreVerticesEqual(triangleVertices, vertexSubset)) { List <WatchVariableControlPrecursor> precursors = new List <WatchVariableControlPrecursor>(); for (int i = 0; i < addresses.Count; i++) { WatchVariable watchVar = new WatchVariable( memoryTypeName: "short", specialType: null, baseAddressType: BaseAddressTypeEnum.Relative, offsetUS: null, offsetJP: null, offsetPAL: null, offsetDefault: addresses[i], mask: null, shift: null); WatchVariableControlPrecursor precursor = new WatchVariableControlPrecursor( name: names[i], watchVar: watchVar, subclass: WatchVariableSubclass.Number, backgroundColor: null, displayType: null, roundingLimit: null, useHex: null, invertBool: null, isYaw: null, coordinate: null, groupList: new List <VariableGroup>() { VariableGroup.Custom }); precursors.Add(precursor); } Config.TriangleManager.AddVariables( precursors.ConvertAll(precursor => precursor.CreateWatchVariableControl())); } } } }