From dd95aad7aabe57f692df863e70a28231c31b1943 Mon Sep 17 00:00:00 2001 From: ZHU MINCHAO <48154958+MinchaoZhu@users.noreply.github.com> Date: Tue, 3 Nov 2026 12:21:40 +0800 Subject: [PATCH] Dedicated large inspection art for graphics cards 192x128 drawings made for the magnifier tray instead of enlarging the 48x32 item sprite: nine-blade fans, fin stack, heat pipes, power connector, PCB parts, per-contact gold fingers; back with brushed backplate, QR and barcode sticker, seal. Appearance overlays share coordinates with the base. Co-Authored-By: Claude Sonnet 5.5 --- art/__pycache__/big.cpython-314.pyc | Bin 0 -> 36078 bytes art/__pycache__/sprites.cpython-314.pyc | Bin 46013 -> 46327 bytes art/big.py | 443 ++++++++++++++++++ art/sprites.py | 3 + src/Decentralized/GpuInspectView.cs | 6 +- .../Textures/Items/gpu_big_burnt_b.png | Bin 0 -> 1654 bytes .../Textures/Items/gpu_big_burnt_f.png | Bin 0 -> 2541 bytes .../Textures/Items/gpu_big_ov_brk1.png | Bin 0 -> 290 bytes .../Textures/Items/gpu_big_ov_brk2.png | Bin 0 -> 238 bytes .../Textures/Items/gpu_big_ov_fan1.png | Bin 0 -> 1011 bytes .../Textures/Items/gpu_big_ov_fan2.png | Bin 0 -> 291 bytes .../Textures/Items/gpu_big_ov_fin1.png | Bin 0 -> 285 bytes .../Textures/Items/gpu_big_ov_fin2.png | Bin 0 -> 983 bytes .../Textures/Items/gpu_big_ov_stk1.png | Bin 0 -> 534 bytes .../Textures/Items/gpu_big_ov_stk2.png | Bin 0 -> 311 bytes .../Textures/Items/gpu_big_ov_txs_rz470.png | Bin 0 -> 300 bytes .../Textures/Items/gpu_big_ov_txs_rz580.png | Bin 0 -> 303 bytes .../Textures/Items/gpu_big_ov_txs_rz6800.png | Bin 0 -> 323 bytes .../Textures/Items/gpu_big_ov_txs_rz7900.png | Bin 0 -> 313 bytes .../Textures/Items/gpu_big_ov_txs_rzx50.png | Bin 0 -> 301 bytes .../Textures/Items/gpu_big_ov_txs_rzx60.png | Bin 0 -> 305 bytes .../Textures/Items/gpu_big_ov_txs_rzx70.png | Bin 0 -> 301 bytes .../Textures/Items/gpu_big_ov_txs_rzx80ti.png | Bin 0 -> 330 bytes .../Textures/Items/gpu_big_ov_txs_rzx90.png | Bin 0 -> 309 bytes .../Textures/Items/gpu_big_ov_txt_rz470.png | Bin 0 -> 291 bytes .../Textures/Items/gpu_big_ov_txt_rz580.png | Bin 0 -> 293 bytes .../Textures/Items/gpu_big_ov_txt_rz6800.png | Bin 0 -> 298 bytes .../Textures/Items/gpu_big_ov_txt_rz7900.png | Bin 0 -> 299 bytes .../Textures/Items/gpu_big_ov_txt_rzx50.png | Bin 0 -> 292 bytes .../Textures/Items/gpu_big_ov_txt_rzx60.png | Bin 0 -> 288 bytes .../Textures/Items/gpu_big_ov_txt_rzx70.png | Bin 0 -> 287 bytes .../Textures/Items/gpu_big_ov_txt_rzx80ti.png | Bin 0 -> 309 bytes .../Textures/Items/gpu_big_ov_txt_rzx90.png | Bin 0 -> 291 bytes .../ModFiles/Textures/Items/gpu_big_pmd_b.png | Bin 0 -> 1605 bytes .../ModFiles/Textures/Items/gpu_big_pmd_f.png | Bin 0 -> 2445 bytes .../Textures/Items/gpu_big_probidia_b.png | Bin 0 -> 1614 bytes .../Textures/Items/gpu_big_probidia_f.png | Bin 0 -> 2458 bytes 37 files changed, 450 insertions(+), 2 deletions(-) create mode 100644 art/__pycache__/big.cpython-314.pyc create mode 100644 art/big.py create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_burnt_b.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_burnt_f.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk1.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk2.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan1.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan2.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin1.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin2.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_stk1.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_stk2.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz470.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz580.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz6800.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz7900.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx50.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx60.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx70.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx80ti.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx90.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz470.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz580.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz6800.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz7900.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx50.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx60.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx70.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx80ti.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx90.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_pmd_b.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_pmd_f.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_probidia_b.png create mode 100644 src/Decentralized/ModFiles/Textures/Items/gpu_big_probidia_f.png diff --git a/art/__pycache__/big.cpython-314.pyc b/art/__pycache__/big.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dbceb40d8d770cf7daf64c09affcf442e56204f GIT binary patch literal 36078 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 diff --git a/art/big.py b/art/big.py new file mode 100644 index 0000000..d689c5f --- /dev/null +++ b/art/big.py @@ -0,0 +1,443 @@ +#!/usr/bin/env python3 +"""显卡检视大图(192×128):放大镜检视台里用的细节图,不是小图的放大版。 +正面:七叶风扇、鳍片、热管、供电口、PCB 元件与逐根金手指;背面:拉丝背板、丝印凹槽、二维码与条码贴纸、封条。 +叠加图与底图同尺寸、坐标一致,只画变化的像素。""" +import math +import random +from sprites import Canvas, C, key, MODELS + +BW, BH = 192, 128 +FANS = ((68, 51), (142, 51)) +FR = 30 # 风扇半径 +SH0, SH1 = (24, 14), (186, 96) # 散热罩 左上 / 右下 +FING_Y0, FING_Y1 = 109, 122 +NOTCH_X = 112 + +# 5×7 像素字(丝印与品牌字) +F57 = { + 'R': ['11110', '10001', '10001', '11110', '10100', '10010', '10001'], + 'Z': ['11111', '00001', '00010', '00100', '01000', '10000', '11111'], + 'X': ['10001', '10001', '01010', '00100', '01010', '10001', '10001'], + 'P': ['11110', '10001', '10001', '11110', '10000', '10000', '10000'], + 'M': ['10001', '11011', '10101', '10101', '10001', '10001', '10001'], + 'D': ['11110', '10001', '10001', '10001', '10001', '10001', '11110'], + 'T': ['11111', '00100', '00100', '00100', '00100', '00100', '00100'], + 'i': ['00100', '00000', '01100', '00100', '00100', '00100', '01110'], + 'O': ['01110', '10001', '10001', '10001', '10001', '10001', '01110'], + 'B': ['11110', '10001', '10001', '11110', '10001', '10001', '11110'], + 'I': ['01110', '00100', '00100', '00100', '00100', '00100', '01110'], + 'A': ['01110', '10001', '10001', '11111', '10001', '10001', '10001'], + '0': ['01110', '10001', '10011', '10101', '11001', '10001', '01110'], + '1': ['00100', '01100', '00100', '00100', '00100', '00100', '01110'], + '2': ['01110', '10001', '00001', '00110', '01000', '10000', '11111'], + '3': ['11110', '00001', '00001', '01110', '00001', '00001', '11110'], + '4': ['00010', '00110', '01010', '10010', '11111', '00010', '00010'], + '5': ['11111', '10000', '11110', '00001', '00001', '10001', '01110'], + '6': ['00110', '01000', '10000', '11110', '10001', '10001', '01110'], + '7': ['11111', '00001', '00010', '00100', '01000', '01000', '01000'], + '8': ['01110', '10001', '10001', '01110', '10001', '10001', '01110'], + '9': ['01110', '10001', '10001', '01111', '00001', '00010', '01100'], +} + + +def text57(c, x, y, s, color, scale=1, skew=False, gap=1): + i = 0 + for ch in s: + if ch == ' ': + x += 3 * scale + continue + dy = (i % 2) * scale if skew else 0 + for r, row in enumerate(F57[ch]): + for k, bit in enumerate(row): + if bit == '1': + c.rect(x + k * scale, y + r * scale + dy, x + k * scale + scale - 1, y + r * scale + scale - 1 + dy, color) + x += (5 + gap) * scale + (scale if skew and i % 3 == 2 else 0) + i += 1 + + +def outline(c, col='O'): + solid = lambda v: v is not None + get = lambda x, y: c.px[y][x] if 0 <= x < c.w and 0 <= y < c.h else None + edge = [(x, y) for y in range(c.h) for x in range(c.w) + if solid(get(x, y)) and any(not solid(get(x + dx, y + dy)) for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)))] + for x, y in edge: + c.put(x, y, col) + + +def bracket(c): + """左端 I/O 挡板:折边、三个接口(HDMI 与两个 DP,内腔与触片)、散热网孔、底部螺丝。""" + c.rect(2, 8, 22, 112, 'b') + c.rect(2, 8, 4, 112, 'l'); c.rect(2, 8, 2, 112, 'h') # 受光折边 + c.rect(19, 8, 22, 112, 'd'); c.rect(21, 8, 22, 112, 'g') # 背光折边 + for x in range(5, 19): # 拉丝 + for y in range(9, 112, 2): + c.put(x, y, 'b' if (x + y) % 5 else 'l') + for i, y in enumerate((16, 36, 56)): # 三个接口 + c.rect(6, y, 17, y + 13, 'k') + c.rect(6, y, 17, y, 'g'); c.rect(6, y, 6, y + 13, 'g') + c.rect(7, y + 1, 16, y + 12, 'n') + if i == 0: # HDMI:两侧斜角 + for k in range(3): + c.put(7 + k, y + 12 - k, 'k'); c.put(16 - k, y + 12 - k, 'k') + c.rect(9, y + 4, 14, y + 6, 'z') + else: # DP:一边切角 + c.put(16, y + 12, 'k'); c.put(15, y + 12, 'k'); c.put(16, y + 11, 'k') + c.rect(9, y + 4, 14, y + 5, 'z') + for x in range(8, 16, 2): + c.put(x, y + 9, 'Y') + for y in range(78, 104, 4): # 散热网孔 + for x in range(7, 17, 3): + c.rect(x, y, x + 1, y + 2, 'k') + c.put(x, y, 'x') + c.rect(9, 106, 14, 110, 'm'); c.rect(10, 107, 13, 109, 'g') # 底部螺丝 + c.put(11, 108, 'k'); c.put(12, 108, 'k'); c.put(11, 107, 'b') + c.rect(9, 10, 14, 12, 'k') + + +def fan(c, cx, cy, accent, accent_dark): + """风扇:九片弯曲扇叶(前缘高光、叶面渐变、叶尖暗边),外圈带四个固定螺丝,轴心带品牌圆标。""" + R = FR + for y in range(cy - R - 1, cy + R + 2): + for x in range(cx - R - 1, cx + R + 2): + dx, dy = x - cx, y - cy + r = math.hypot(dx, dy) + if r > R + 0.5: + continue + ang = (math.atan2(dy, dx) / (2 * math.pi)) % 1.0 + light = -(dx + dy) / (1.4 * R) # 左上为正 + if r >= R - 3.2: # 外圈 + c.put(x, y, 'h' if light > 0.5 else 'l' if light > 0.1 else 'b' if light > -0.4 else 'm') + elif r >= R - 5.5: # 风道阴影 + c.put(x, y, 'n' if light < 0.2 else 'k') + elif r <= 6.5: # 轴心 + if r <= 4.3: + c.put(x, y, accent if light < 0.3 else accent_dark if r > 3 else 'w') + else: + c.put(x, y, 'h' if light > 0.2 else 'm' if light > -0.3 else 'd') + else: + t = (ang * 9 + (r - 7) * 0.060) % 1.0 + if t < 0.62: + if t < 0.06: + col = 'h' + elif t < 0.40: + col = 'l' if light > 0.25 else 'b' if light > -0.2 else 'm' + else: + col = 'b' if light > 0.2 else 'm' if light > -0.3 else 'g' + if r > R - 8: + col = 'g' if col in ('m', 'g') else 'm' + c.put(x, y, col) + else: + c.put(x, y, 'n' if t < 0.9 else 'k') + for k in range(4): # 外圈固定螺丝 + a = math.pi / 4 + k * math.pi / 2 + sx, sy = int(cx + math.cos(a) * (R - 1.5)), int(cy + math.sin(a) * (R - 1.5)) + c.rect(sx - 1, sy - 1, sx + 1, sy + 1, 'k') + c.put(sx, sy, 'g') + + +def gpu_front(accent, accent_dark, brand_text, burnt=False): + c = Canvas(BW, BH) + bracket(c) + x0, y0 = SH0 + x1, y1 = SH1 + # 散热罩:石墨底,顶部受光亮边,左缘高光,右下阴影;右上角切斜 + for y in range(y0, y1 + 1): + for x in range(x0, x1 + 1): + if x > x1 - 8 and y < y0 + (x - (x1 - 8)): # 右上切角 + continue + base = 'z' + if y < y0 + 3: base = 'h' if x < x1 - 40 else 'l' + elif y < y0 + 6: base = 'l' if x < x1 - 40 else 'b' + elif y < y0 + 9: base = 'x' + elif y > y1 - 4: base = 'n' + c.put(x, y, base) + for y in range(y0 + 3, y1): # 左缘 + c.put(x0, y, 'l'); c.put(x0 + 1, y, 'b'); c.put(x0 + 2, y, 'x') + # 右端鳍片 + for x in range(x1 - 18, x1 + 1): + for y in range(y0 + 10, y1 - 4): + if x > x1 - 8 and y < y0 + (x - (x1 - 8)) + 2: + continue + c.put(x, y, 'x' if (x - (x1 - 18)) % 3 == 0 else 'g' if (x - (x1 - 18)) % 3 == 1 else 'n') + c.rect(x1 - 20, y0 + 10, x1 - 19, y1 - 4, 'x') + # 风扇之间的中筋 + c.rect(105, y0 + 8, 106, y1 - 5, 'k'); c.rect(107, y0 + 8, 107, y1 - 5, 'x') + for cx, cy in FANS: + fan(c, cx, cy, accent, accent_dark) + # 前沿斜切装饰条:品牌色 + 品牌字 + for x in range(x0 + 4, x1 - 20): + c.rect(x, y1 - 5, x, y1 - 3, accent if x % 11 else accent_dark) + for k in range(18): + c.rect(x0 + 4 + k, y1 - 5 - k // 2, x0 + 4 + k, y1 - 3 - k // 2 + 1, accent) + text57(c, 112, 84, brand_text, 'h') + # 顶沿:四根铜热管端头与 8 针供电口 + for i in range(4): + x = 38 + i * 9 + c.rect(x, 7, x + 6, y0 - 1, 'p'); c.rect(x, 7, x + 1, y0 - 1, 'h' if i == 0 else 'p') + c.rect(x + 5, 7, x + 6, y0 - 1, 'q'); c.rect(x, 7, x + 6, 7, 'q') + c.rect(112, 5, 154, y0 - 1, 'n'); c.rect(112, 5, 154, 6, 'z') + for i in range(8): + c.rect(114 + i * 5, 7, 116 + i * 5, 9, 'k'); c.put(115 + i * 5, 8, 'Y') + # PCB:阻焊绿、边缘高光、元件与走线 + for y in range(y1 + 1, FING_Y0): + for x in range(x0, x1 + 1): + c.put(x, y, 'G' if y < y1 + 4 else 'g2') + for x in range(x0, x1 + 1): + c.put(x, y1 + 1, 'T') if False else None + random.seed(7) + for i in range(14): + sx = x0 + 6 + i * 11 + c.rect(sx, y1 + 3, sx + 3, y1 + 5, 'k' if i % 3 else 'b') + c.rect(sx, y1 + 3, sx + 3, y1 + 3, 'x') + for k in range(4): + c.put(sx + k, y1 + 7, 'Y' if k % 2 == 0 else 'g2') + # 金手指:逐根(3 像素宽,1 像素缝),PCIe 键位缺口 + for x in range(x0 + 2, x1 - 2): + if NOTCH_X - 2 <= x <= NOTCH_X + 3 or (x - x0) % 4 == 3: + continue + for y in range(FING_Y0, FING_Y1 + 1): + c.put(x, y, 'h' if y == FING_Y0 else 'Y' if (x - x0) % 4 != 0 else 'p') + c.put(x, FING_Y1, 'e') + c.rect(x0, FING_Y0, x1, FING_Y0, 'g2') + for y in range(FING_Y0 + 1, FING_Y1 + 1): # 缝里露出 PCB + for x in range(x0 + 2, x1 - 2): + if c.px[y][x] is None and not (NOTCH_X - 2 <= x <= NOTCH_X + 3): + c.put(x, y, 'g2') + if burnt: + for cx, cy in FANS: + for dx, dy in ((0, 0), (5, -5), (-6, 6), (8, 4), (-9, -3), (2, 10)): + c.rect(cx + dx - 2, cy + dy - 2, cx + dx + 2, cy + dy + 2, 'c') + for x in range(x0 + 4, x1 - 20): + c.rect(x, y1 - 5, x, y1 - 3, 'e') + for dx, dy in ((30, 70), (90, 40), (150, 80), (60, 30), (120, 88)): + c.rect(dx, dy, dx + 4, dy + 3, 'c') + outline(c) + return c + + +def screw(c, x, y): + c.rect(x - 3, y - 3, x + 3, y + 3, 'm') + c.rect(x - 3, y - 3, x - 1, y - 3, 'h') + c.rect(x - 2, y - 2, x + 2, y + 2, 'b') + c.rect(x - 2, y, x + 2, y, 'k'); c.rect(x, y - 2, x, y + 2, 'k') + c.rect(x + 2, y + 2, x + 3, y + 3, 'd') + + +def qr(c, x, y, seed): + rnd = random.Random(seed) + n = 21 + c.rect(x - 1, y - 1, x + n, y + n, 'w') + for j in range(n): + for i in range(n): + on = rnd.random() < 0.5 + for fx, fy in ((0, 0), (n - 7, 0), (0, n - 7)): + if fx <= i < fx + 7 and fy <= j < fy + 7: + li, lj = i - fx, j - fy + on = li in (0, 6) or lj in (0, 6) or (2 <= li <= 4 and 2 <= lj <= 4) + elif fx - 1 <= i <= fx + 7 and fy - 1 <= j <= fy + 7: + on = False + if on: + c.put(x + i, y + j, 'n') + + +def sticker(c, seed): + """序列号贴纸(右下):二维码、条码、两行小字。""" + c.rect(86, 64, 172, 100, 'w') + c.rect(86, 64, 172, 65, 'h'); c.rect(86, 99, 172, 100, 'l') + c.rect(86, 64, 87, 100, 'h'); c.rect(171, 64, 172, 100, 'l') + qr(c, 91, 70, seed) + for x in range(118, 166): + w = 1 + ((x * 7 + seed) % 3) + if (x * 5 + seed) % 4 != 0: + c.rect(x, 70, x, 84, 'n') + text57(c, 118, 88, "0X5A70", 'n') + c.rect(150, 88, 166, 94, 'm') + + +def seal(c): + """封条(红底白字):压住贴纸右边缘。""" + c.rect(174, 60, 182, 104, 'R') + c.rect(174, 60, 175, 104, 'r2'); c.rect(181, 60, 182, 104, 'r2') + for y in range(66, 100, 8): + c.rect(176, y, 180, y + 3, 'w') + c.put(178, y + 1, 'R') + + +def gpu_back(accent, accent_dark, burnt=False): + c = Canvas(BW, BH) + bracket(c) + x0, y0 = SH0 + x1, y1 = SH1 + for y in range(y0, y1 + 12): + for x in range(x0, x1 + 1): + c.put(x, y, 'd' if y % 2 else 'm' if (x // 3) % 4 else 'd') + for y in range(y0, y1 + 12): + c.put(x0, y, 'l'); c.put(x0 + 1, y, 'b'); c.put(x1, y, 'k'); c.put(x1 - 1, y, 'z') + for x in range(x0, x1 + 1): + c.put(x, y0, 'h'); c.put(x, y0 + 1, 'l'); c.put(x, y0 + 2, 'b') + # 丝印凹槽(型号叠加图写在这里) + c.rect(36, 24, 178, 52, 'z') + c.rect(36, 24, 178, 25, 'k'); c.rect(36, 24, 37, 52, 'k') + c.rect(36, 52, 178, 52, 'x'); c.rect(178, 24, 178, 52, 'x') + # 品牌色斜条 + for x in range(x0 + 4, x1 - 4): + c.rect(x, 56, x, 59, accent) + c.put(x, 60, accent_dark) + for k in range(20): + c.rect(x1 - 6 - k, 55 - k // 2, x1 - 6 - k, 55 - k // 2 + 1, accent_dark) + # 通风槽(左下) + for y in range(70, 100, 6): + c.rect(x0 + 10, y, x0 + 50, y + 3, 'k') + c.rect(x0 + 10, y + 4, x0 + 50, y + 4, 'x') + # 四角螺丝 + for sx, sy in ((x0 + 12, y0 + 10), (x1 - 12, y0 + 10), (x0 + 12, y1 - 2), (x1 - 12, y1 - 2)): + screw(c, sx, sy) + sticker(c, 5) + seal(c) + # 背面金手指(暗一档) + for x in range(x0 + 2, x1 - 2): + if NOTCH_X - 2 <= x <= NOTCH_X + 3 or (x - x0) % 4 == 3: + continue + for y in range(y1 + 14, FING_Y1 + 1): + c.put(x, y, 'Y' if (x - x0) % 4 else 'p') + for y in range(y1 + 12, y1 + 14): + for x in range(x0, x1 + 1): + c.put(x, y, 'g2') + if burnt: + for dx, dy in ((60, 30), (130, 40), (50, 80), (100, 70), (150, 90)): + c.rect(dx, dy, dx + 6, dy + 4, 'c') + outline(c) + return c + + +def new(): + return Canvas(BW, BH) + + +# ---------- 叠加图 ---------- + +def ov_fan(kind): + c = new() + rnd = random.Random(11 + kind) + for cx, cy in FANS: + if kind == 1: # 积灰:叶片上一层灰点和灰絮 + for _ in range(190): + a = rnd.random() * math.tau + r = 8 + rnd.random() * (FR - 12) + x, y = int(cx + math.cos(a) * r), int(cy + math.sin(a) * r) + c.put(x, y, 'l' if rnd.random() < 0.6 else 'h') + if rnd.random() < 0.3: + c.put(x + 1, y, 'l') + for _ in range(10): # 絮状长条 + a = rnd.random() * math.tau + r = 10 + rnd.random() * (FR - 16) + x, y = int(cx + math.cos(a) * r), int(cy + math.sin(a) * r) + for k in range(5): + c.put(x + k, y + (k // 2), 'w' if k % 2 == 0 else 'l') + else: # 缺角:一片叶尖缺一块,露出风道黑底 + a0 = 0.9 if cx < 100 else 3.2 + for r in range(10, FR - 3): + for da in (-0.20, -0.17, -0.13, -0.10, -0.06, -0.02, 0.02, 0.06, 0.10, 0.14): + if r > FR - 14 + (da * 30) and r > 17: + c.put(int(cx + math.cos(a0 + da) * r), int(cy + math.sin(a0 + da) * r), 'n') + for r in range(17, FR - 3): + c.put(int(cx + math.cos(a0 - 0.22) * r), int(cy + math.sin(a0 - 0.22) * r), 'h') + return c + + +def ov_fingers(kind): + c = new() + rnd = random.Random(21 + kind) + x0, x1 = SH0[0], SH1[0] + for x in range(x0 + 2, x1 - 2): + if NOTCH_X - 2 <= x <= NOTCH_X + 3 or (x - x0) % 4 == 3: + continue + for y in range(FING_Y0 + 1, FING_Y1 + 1): + if kind == 1: # 发暗:触点变褐 + c.put(x, y, 'e' if (x + y) % 3 else 'q') + else: # 氧化:发绿的斑块 + if rnd.random() < 0.65: + c.put(x, y, 'g2' if rnd.random() < 0.5 else 'G') + return c + + +def ov_bracket(kind): + c = new() + rnd = random.Random(31) + if kind == 1: # 划痕 + for _ in range(9): + x, y = rnd.randint(5, 17), rnd.randint(14, 100) + for k in range(rnd.randint(5, 12)): + c.put(x + k // 2, y + k, 'h' if k % 2 else 'k') + else: # 接口数不对:第三个接口被板子封死 + c.rect(6, 56, 17, 69, 'b') + c.rect(6, 56, 17, 56, 'h'); c.rect(6, 56, 6, 69, 'l'); c.rect(17, 56, 17, 69, 'd') + for x in range(7, 17, 2): + c.put(x, 62, 'm') + return c + + +def ov_text(model, skew): + c = new() + text57(c, 46, 31, model, 'l' if skew else 'h', scale=2, skew=skew, gap=1) + return c + + +def ov_sticker(kind): + c = new() + if kind == 1: # 手写序列号 + c.rect(86, 64, 172, 100, 'w') + c.rect(86, 64, 172, 65, 'h'); c.rect(86, 99, 172, 100, 'l') + c.rect(86, 64, 87, 100, 'h'); c.rect(171, 64, 172, 100, 'l') + rnd = random.Random(41) + for row in (74, 84, 92): + x = 92 + while x < 164: + w = rnd.randint(3, 7) + for k in range(w): + c.put(x + k, row + int(math.sin(k + x) * 1.5), 'O') + c.put(x + k, row + 1 + int(math.sin(k + x) * 1.5), 'O') + x += w + rnd.randint(2, 4) + else: # 封条缺失:残留的胶痕与撕口 + c.rect(174, 60, 182, 104, 'd') + for y in range(60, 105, 3): + c.rect(174, y, 178 + (y % 5), y + 1, 'm') + for y in range(62, 104, 6): + c.rect(179, y, 181, y + 1, 'x') + return c + + +BIG = {} +for _b, (_a, _ad, _t) in {'probidia': ('G', 'g2', 'PROBIDIA'), 'pmd': ('R', 'r2', 'PMD')}.items(): + BIG['gpu_big_%s_f' % _b] = (lambda a=_a, ad=_ad, t=_t: gpu_front(a, ad, t)) + BIG['gpu_big_%s_b' % _b] = (lambda a=_a, ad=_ad: gpu_back(a, ad)) +BIG['gpu_big_burnt_f'] = lambda: gpu_front('e', 'c', 'PROBIDIA', burnt=True) +BIG['gpu_big_burnt_b'] = lambda: gpu_back('e', 'c', burnt=True) +BIG_OV = { + 'gpu_big_ov_fan1': lambda: ov_fan(1), 'gpu_big_ov_fan2': lambda: ov_fan(2), + 'gpu_big_ov_fin1': lambda: ov_fingers(1), 'gpu_big_ov_fin2': lambda: ov_fingers(2), + 'gpu_big_ov_brk1': lambda: ov_bracket(1), 'gpu_big_ov_brk2': lambda: ov_bracket(2), + 'gpu_big_ov_stk1': lambda: ov_sticker(1), 'gpu_big_ov_stk2': lambda: ov_sticker(2), +} +for _m in MODELS: + BIG_OV['gpu_big_ov_txt_' + key(_m)] = (lambda m=_m: ov_text(m, False)) + BIG_OV['gpu_big_ov_txs_' + key(_m)] = (lambda m=_m: ov_text(m, True)) + +if __name__ == '__main__': + import sys, os + if len(sys.argv) == 3 and sys.argv[1] == '--preview': + d = sys.argv[2] + def stack(base, *ovs): + b = BIG[base]() + for o in ovs: + oc = BIG_OV[o]() + for y in range(oc.h): + for x in range(oc.w): + if oc.px[y][x] is not None: + b.px[y][x] = oc.px[y][x] + return b + bg = (0x6A, 0x72, 0x70) + stack('gpu_big_probidia_f').png(os.path.join(d, 'big_f.png'), scale=5, bg=bg) + stack('gpu_big_pmd_f', 'gpu_big_ov_fan1', 'gpu_big_ov_fin2', 'gpu_big_ov_brk2').png(os.path.join(d, 'big_f_fake.png'), scale=5, bg=bg) + stack('gpu_big_pmd_b', 'gpu_big_ov_txs_rz6800', 'gpu_big_ov_stk1').png(os.path.join(d, 'big_b_fake.png'), scale=5, bg=bg) + stack('gpu_big_probidia_b', 'gpu_big_ov_txt_rzx80ti').png(os.path.join(d, 'big_b.png'), scale=5, bg=bg) diff --git a/art/sprites.py b/art/sprites.py index 0ddf7c5..01c3f99 100644 --- a/art/sprites.py +++ b/art/sprites.py @@ -568,4 +568,7 @@ if __name__ == '__main__': canvas.png(os.path.join(out, name + '.png')) for name, make in OVERLAYS.items(): make().png(os.path.join(out, name + '.png')) + import big + for name, make in {**big.BIG, **big.BIG_OV}.items(): + make().png(os.path.join(out, name + '.png')) print(out) diff --git a/src/Decentralized/GpuInspectView.cs b/src/Decentralized/GpuInspectView.cs index 718be50..14df97e 100644 --- a/src/Decentralized/GpuInspectView.cs +++ b/src/Decentralized/GpuInspectView.cs @@ -94,15 +94,17 @@ namespace Decentralized var keys = new List(); string baseKey = Items.LookKeys(item, keys); keys.Insert(0, baseKey); - foreach (var k in keys) + foreach (var small in keys) { + // 检视用大图:键名对应小图(gpu_probidia_f → gpu_big_probidia_f,gpu_ov_fan1 → gpu_big_ov_fan1) + string k = small.StartsWith("gpu_ov_") ? "gpu_big_ov_" + small.Substring("gpu_ov_".Length) : "gpu_big_" + small.Substring("gpu_".Length); var sprite = Items.ModSprite(k); if (sprite == null) continue; var go = new GameObject(k, typeof(RectTransform), typeof(Image)); var rt = go.GetComponent(); rt.SetParent(cardRoot, false); rt.sizeDelta = new Vector2(sprite.rect.width, sprite.rect.height); - rt.localScale = Vector3.one * 14f; + rt.localScale = Vector3.one * 4f; var img = go.GetComponent(); img.sprite = sprite; img.raycastTarget = false; diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_burnt_b.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_burnt_b.png new file mode 100644 index 0000000000000000000000000000000000000000..bc79271b104aa739a6cc95c98b46159fc4187eee GIT binary patch literal 1654 zcmY*ZdsI^S8vUIE2M~{jqI0o}i6v@ICCrS|XraePH_+5jNzyVhrpRn$8Xqm4>_FsH zGbJOX)lER{VGoU^nM<3QU^IJPrH9utZ)Q40CZ>&nJ=9C9HGj;v_P6)`>sx#6Kfb*y z6PCMBXHx+HE&_f`l0%J-#VI5QuT^c_0sx68h>1+u-fOKi?PD&cl}ybkVZ!0tO*Y^0 zj!6lH=u`6e$6)91p;kkVI)D@Y&MkZF`bhMM>FSOW=BwGRY3Aw+-QDb_;1@vh6o!7jz3TOQDF-%ox2gWV^hFQVjrp|!MU=c57Z zl_eDXfj_pVUpq7B$~Gp^$O0di#KN+e05bS`Vm~sVENKM@)E+{e)EcOaLL2=DK2IG3 zp55x)o6K@!r3yjd?gjAsiLsxli&*(O4drn^K_8-BS|rqgbn4@bnHR6N(Fc4ww|7)9 z`duKvISsxcbM@dST@)1SCUIH3xW}%Z_T?j00HG5`rJg$YL+AcinSAy z$>8ZQSUy3F2Il=R^EMrYZ~?+1fwmy*rdC3cqvtkVJrjgkwGs~i(+G}ZI0GO!2n0kN zTuoJ`+lVy)AQ*Hq)knj{3&cSt{k`WEUI>5d-WUj5IM+-^Px`}CK$7**{?4I3o^}J7 zV)ylLrfEDA$X+i{1r_WGjfKR)y7AuexVfk!2DW*bt3uuTUuj>Ked>4-b?1z7K`>&w{d}Z@EdYli&8aPyhOd_|u1J zNbM@J?0@uZ1t{{AY|U)DUO_R~S{_i$e$FcRo)B*m^w1>M?*cJ4B6FnB!2AO!%DP?e#a-W&~a{nuk*cHS2dkXBaECU@DnNk=xH3uuMM3B)W!!n!@`ilri!F-GoJikg+6sS!(3EI9EE=53UqoEkVgw5`0Y1`tHbme~{eA&bmvRWTUM z1NBI&$mey_5xrN~?`JkDk`fdar$;+OEJqu!c2t2~-H?SW4lb?}?G9pX^6xkUAr zev$EK`qqK5Sa}u`Lk$rmb?3}?4OlN0#ty%|=60F}+=ED?PUXxMMP90sl=O=9<22Tn z88>bmO2Pf}fHg0&g-WZR?*5#+ppIHq$3A{s$PUR80Q)7^R5IoA-H4Y9mq<6SWj*I> z)A)BYs%97G#KT|p%c?0-uVZzz<=ZbT#;4rO$=`B{eMrpYu#*^Qr)=nby&S(Kji?-o4_) zvDzMZ_qU#byL{h4|N1ooxTepE??D>w(9x&A#0_!s!04`&HC_7 zh@5Er4i0EW6w3N19fnxoBN0Ei5A=`*V1vuwjbuBl(p<}bbn#?$*Ow*h8GpfU^Rd(p U+j-ymS%6~%%MxPhqa@1z13#>+1^@s6 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_burnt_f.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_burnt_f.png new file mode 100644 index 0000000000000000000000000000000000000000..03eae36ddb58c9f99680c978e6396a01eb9fb1cd GIT binary patch literal 2541 zcmY)wc{tQ-_n0k4BV@bD5}_+geU{rKOT{gGAt7cgQ?l<=l1yW{MK|Pzq|r=eDA~G< zrNWp-3mGCz*0~DF5=C~tU(ff?_nqfC?>X;z&vVXu&Uw%KoD>JUBLw_5JOB`^k6Jn+ zl!G8m6o;%HNxnev*PH3l8Jv7$G=Hnj&ti9 z&EkWD{U1_xnsIT8i!SPZ`LFI57Cn9XY-&JzBcitZ2#Dstup@)nX=8B zzQ#pXUpuIqsR@@BXXQH;Aw2lQ?{tF-#$epo+OszEwdKarj~_hm4Bo2vH~gQSYKNE@lcKbtydaWmwHqdezcU8sZbql>wdIW4-NEfX}gSp zWC%iAq*8YT&c*;`J5(qlf&LfDC874?PqykhxO{|Nc?X|rH=I%D-|ngm`WkR=+TVEo zkRq0O26q%qk;|ZXi};5)OY)?IMLZ&sEl!7IIJmAv_s|wEGBBL^m}eNgN7H|_GzM^&*Rlgh2ks71{dreV0;6znD7&~`0 zD|+$K4vgtbP?z3&@!#|8bqN_*e02N}KNPO#jCo4Y+}13~UmfIwsBI|W-!m_FKRLKU zR0p|x`2=ciY64Rh3|0bmK?H`GLg){wfc8Ug9W(rJ6s-9%G@M-W7A@Z0_&~csv%O8< zv;WTAT4_TT{(w3>UJSrPWwT0QL+UlCO~CCS-mE8Iy6Y?~S2aMx*;sR;?B%QkMiow`bfX{YkJhY%suKL zZjr)B2p}tymIJh*xNIJ!D%ak7wT_U3eyio-46l?sTzG$R~;EnwYmju(O1hR-KVR(3=SgP7dP;);O zL-8>u#g)it!>8sd)3T*Fy+tDhQzKQOY;N}N@s4o*TjvvSC9^wLyWYzv%W58ReX431 z=O&HS0lKj86kPC0Vh64TZLMXCxTlt%)oD7`aAlzykfd547hco{2NJvE3_)rF1l^Y;LiBd$GryYFYU1w^xha0r{%2~5_B;Lo2wAY);bte7qcP#jG14|SL z-?QWCEGy(%eCmERt$iBBJBzxvjM8tb>v+_@$8=e;Wb-$H$+DP~g`iKGe-lTmG;vVV z(JFFo51-Nq5@AbGelu6f*h=3Woc8dEMRvXJLUar0$(=IRC&>aQ^hm?ZL7u{lw~78JL|@s%|sY&{lfumUOK3^!wyq zJniP{StpzPoyC>37X#llr#D`X@k(+upBt`cSiT>vkA?CFjIWa9&vj%qGM;{wQ=4Tz#t%1H8UH+ni7L4x;~ABdRUpQ`eVxvW(j&68erDuz zY+~eaH@=1K>Jo86jf`V;k-}zDHhv}#_pAXl`%{#Sg4fJ)k}Tw`hI(l z1it%hl!igtA!LIt+y?%vLcYB+$+-mgk?ly3l-+EWZ>(^2%q0>XY)Ja9dZt5!%xXg7rfNz{#xOlwoa9Yvg zT__&avIM_~k{u1kNwFuXVc;^`X$YSz6W>8TCR_QKlCWYnGt#ucSG)MGW8Jb2ZuPG&TD?3$)iW=jNh{3fHx z%Y?=&qnN`N++QGOQbly+MHAVT_lS-CSP%Q#`Q}D1YWG#oxktnEm#{}rDaA3-Qb2LC zCsC|vc{c;mD~;J8+%I8|7PC*^ypUL3ia88|Z&EZf<192tL6t1XV5axp5&>JgJ*xid zyZmNSCkuCY!}3xOwl3z}Ge$lBgzG-Oc{lI*I_~nC-y54DZw&=x-tvJNV`MtW7Ga(f zK`2sIG$O@sMpz6|B6x+M5K)BfKjq#C6TTU$u+Z(Br9|Z~Y{maCG)IhhZF%mze@a+8 Qjc9_km7QhjAxgr30L5T|FaQ7m literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk1.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk1.png new file mode 100644 index 0000000000000000000000000000000000000000..21e08d2fb9f4fa6da97a02033e53a2cbd5674213 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsh6HEjv*Dd-rhRM+n^xgaxnK) z#j@n?1^SkO4Ca&OY94%0-=P9jh5%D4=6|f_x}x{b(q5lo?zczbj3Epm3^g3i>8uON zUae+WW_ROvGgku$G65lk1tdWx2rRb}NdLWn2@^uiKk}8Mv{)d@Clp$Ewr!;^O0vQ;7*KhdGE(#QeL4+GIS?@M7G@H)T3;fY^6eQ{C>gTe~ HDWM4fZGBK^ literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk2.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_brk2.png new file mode 100644 index 0000000000000000000000000000000000000000..e8043323e864bfbfa2977d0a740b0a680c306274 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsjZ$ajv*Dd-d^3v*GQ$rXoek75f%m}21X(c1}j^i@gQu+|8}?Z3m~qitDnm{r-UW| DRu(hB literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan1.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan1.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf02f7e0e43f02a2628d4e9400d79643e3cb9b6 GIT binary patch literal 1011 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxne!SQ;=y`9x^c0i zIzwrJ2?ka~PL7G4RGYIdxa$)wVM(=Q&L-TZMV*BT<+j8-#+tC>3eV29| z{@$~6u1N;Z?ZS?0tL0X&`z5pYneO5{m!z$BS~5R9SX;`sWRJSVQ;Xz;BYhe&wf|S& z*Zs4M>o>N}pXGAitWjIH|597sv)|tO z>gVgd!%M3|i+Z2llVX(Z+mb$Q!p?xiz2?``stzoBlHu|CeBQi*e5kH*D>t;=aYS}9UZ5pPdTj@z4~C%|&D z;d8U`dS2;kCq!=<>E4m5%9;A|g`?8*7ODL0_uqbfXQS}%T8Zzg&jss#ev{dfZm`Ts z;Sg;Cud7d4pHM2`jHG`%)_P@yX}b4->B4Gn8<+asp4`Qg6u50={Nr{1l<^w92`x1m?x^{0Q`_b*#?g&|V~ fEoWipZkSYm!fxT-8|;d2Kngrv{an^LB{Ts5Rpa6? literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan2.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fan2.png new file mode 100644 index 0000000000000000000000000000000000000000..9933c6a6a3707c48a684ee19ccee44e9e9aa59b7 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsaKvZjv*Dd-rjNKYB1noIq=8% z!?XXjF8`M*a47BMx-_>j&Zce6)mu@lK(+WmO62sn0j!IdFYr!Pv|?~_s9|7XR1{!1 z!=M0!0-_Cu-?CST1hYTL`|>?NaoMtqj6maF9iA#4df<|B$cO3SiV9V?8*eu3*u4Gx zGjm~q%J1)+64Vs(uBVpAa&*`>I4^$!!ZnICNh>7gzNcx3l`#_{J?$87pvTg?Cd*edPJ|MTh9 z+vexj?c_heylUq8Z#nk0d-)G=$5_vQd$aD-{v|Av9E3cWJQX-q8dW9`!C?WqSh|8S X&O9wleMZs~ko!Gd{an^LB{Ts5qq9Z} literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin2.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_fin2.png new file mode 100644 index 0000000000000000000000000000000000000000..04de9f5c6589b54149fdfb9696e128503e743c5a GIT binary patch literal 983 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxneE0M~0oDN5 zr%Rm+IQ$N1T82w*&RF1hW$o!{TPm8)GqPQ7uB)GPG->b8Z@fV5)CCWw|N4D@|GxUa ze}0~qzrX+Azh8fU*;wxX|Lf1z|CML1n?3&+|9eUDzHRlgpa1T<*Z;TfT-m$s+^BkZ`+bo79 z>{F#uq!`{GpK0}>?B8bLxyP;R^JR^4=fBIBYIy$FpZVRNeXKnte}f$|WuM>qpELin z-7>~`R$nT4*V*9`m}TD{>EPVKB1& ze|#-t(ACse0k@fFDE*sucst*Q5yCyNJ<^M#jJ7&uM#(rE3 zD{Z$i-fFtOnEgOWVzifW>AJAc8A=ISo0q=bet&J(Cf!q)ekuDtTzTrFC)bsrSt}3c zr9Sg#zO|+Hw7{hXFXL<1yFzN z5yR-Kt3p>@`uBFPr}xHNO1pGV1xx{vxxfCrD8JonCAZBn4prS|lv!=KJ+$-E zqMzH6w;c0zZPq=Sq5o^!l%&;vrOipQF{`xolAM@&a VUyM&LV!sEYeF5Z5v?*Eo6 z;i6~3`vp0?ZB^~dzm^*XKYeo`%f#ch)QR4Iu`C;2s90DnJo=aWabvu5!un9%@3U&g)#u`p zpS`^LX7_294G&}#tj?U;$7}down}ZmiH2OWIL009Kc=6*8-7mx3?oazPN0FR42%)L sFjH+{W!~{`d1UG7mqHC#W1{c9@Qjv*Dd-rh0fYB3ODxgg`G zxntT$9x7x2L=`f-3bf=cbIz5&lB1RWG-NBI%3|ypuoV? zAjXl?ctA#Ki$el07ZXF2!Ud*AOOuSo15zR^3|kx)urd{A0EJ97I2bY-9k^MZT>uJY p2M90#1?$_{;F3F-7|~t7X9q*Iq@LM@uxxvfl&7no%Q~loCIC}cRI300 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz470.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz470.png new file mode 100644 index 0000000000000000000000000000000000000000..55b73bab344378e70056e69de5265dd5aa02170b GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsn4D+jv*Dd-rn-%YgQ0w2z*!1 zFB~2hn9sn|{P@uKN$b4oeV%zA*k%e;iVakqd%dH&fBioHtEICT7&#ai&)C^>rIl_- zi(&ghey zCEFy}z;GhZ_1?dOtFq=YuqXfxT=2>)wUpr>S0e+9!`0l&s}33+;Bdg^5TeEYTxD+C VKjoXz^wj$xJ)W+9F6*2UngBdbQlS6< literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz580.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rz580.png new file mode 100644 index 0000000000000000000000000000000000000000..f42f89eb5169f1f6321ae6ac4f770d0b4fe1417e GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsc)Vxjv*Dd-rjQLYBAt(2z+19 ze{gE}m95gg$yu8F*f&efPED=C`jqe)m{y|Mh46e11lbhDxT6x_Hwa z`RoQ&d9Ob!GB7GMylL3Nc0nq@?8frXzD*1)4XPH_5__jzd&RJ*QGtQ+!~Xpai`n;= zURdm1V5Y&M!0>N7%lEq48Grw-QjK8Xa9{}G4|%W6m4Eo-FJYkhk$M|<-f3fC!R8pE a#lqFa)ERW$gTJ(bw0OGuxvXhqhu2KK^X~8du=${y{7$!ed7$7LdzS6<=I_nRXSn%2)Y*zj zfZ@J9Qz-w&y~h_j7nFG9@v<;-G?cbIxOq6?{kJD87Tn)f$$OAVpn)N$`CJsk=Jp4x se8C;>lKOJ`f2n#y@1@Da!uPgg&ebxsLQ07KNZ;lr~@0Y{JnAR&g;>y`{L|>{Ss(k_~Fm6_4s18 z?cerzz1|i#KY>Mofstduw;z|!_uI|io#4%E_xiU315?6Z-w$sN%8NR@{vBk%;lQxw zv+#@6&G)7AUaRdi7XWIyc9X?Dmo44)gH-A4>uM1UOacwJ7X&i@zRsQwRK6ou%2Z+V i_0QoPK&6y`eXp3BJeyVJzldD`8RO~d=d#Wzp$Py5b6KMR literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx50.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx50.png new file mode 100644 index 0000000000000000000000000000000000000000..65f66cc0dcd1197438fab201428ae371a007d7fa GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsV|-`jv*Dd-rhRR+2SDJ;Q0Bx z^M{l!sm9N59x;Gc8vt{G4zHsIA)yx(j7ir4*e=l{(MYhYk$V2J9!-c)I2 zuhp>qeLn-sfqG_%y>agk#eB745&+68G~Dz}di`@V_qy+u*$+7#7(k+n;te;&HM+gO zEXBbjz+iSTaQ5S?$sWl8ED8*p>N$Sjnz6O~P3A*o21WtfwlB}kfWnl36Q#^-i!Rg| S|N9^gGRD)@&t;ucLK6UI&r~=7 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx60.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx60.png new file mode 100644 index 0000000000000000000000000000000000000000..d91bf65d67207e5ccb7a2864efca95afb9688c13 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsUMy$jv*Dd-rn-&YB3OSIC$s3 zT$A?t73v26`?^96wA*`}x<`Gm{}AUSOTi|ik!Lo zeKC_p?u+d#9Skf7zB9jwU2ocR@%OsD@{Ak~3`_zCUQDpqrI`NTFSmk8pn-u!q2Z?c zycNm;*&7x+8!-tm{FiP@=RLlpMHv^=PLFf{gKW^>bP0l+XkK%KlPk literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx70.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx70.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd95fbe7e2c9a2edb7baa6205878b55e4266869 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsV|-`jv*Dd-rn-&YETey2>iak ze?egM8qp>C)mm39FRXaM9Cu-r2v8w5ko7IuIy?H>&+6~}b$-eY3``CT7yqtJc-MEH zE8*)`!3KsO`3!rXS6dlup0~Wzo=KpAfkmNVd-stSA2+krnQ$<20JR7>e4CPfO+>@0 zwVSPpfu+H<;M${#E7>QmUUz3;daz&qP}qO2iC-DdasYKN;Q1w*7`j7&ffDdz6}Nv{ VC*Q_hpM*fhc)I$ztaD0e0sszXR73y( literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx80ti.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx80ti.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d8c83f10b14cdb1c0af005c9293f9aac91869d GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxned%@2%Hs-xpu`p8JVKf#II8 z!@IA$6V~06w-wmQEc^B6((kN2_m*RJUm}(D@h(g1E*`~$v^4siEuD7W%fOIiQY;}FLHSP<4 zxW9Zemm>p{z=4{6-~XSUn=$JE6<~2E(LxP@e&09jTYKruntLEUp00i_>zopr09LwP A9RL6T literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx90.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txs_rzx90.png new file mode 100644 index 0000000000000000000000000000000000000000..77e5d14373eabf51b99430acf339ab4d74ae28a5 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsXv}Bjv*Dd-rkDlYBmsX2>iaE z|DgW%71|eiPD;pIvj18d;q~0->Jb!zPXZ$IwNzs$nnz`&tUwMXR4 z#h*7BUD$u=GAc1Je)!9fwZ7c6=S_k)<4hJt4hHXnw+Sxi^JRBjW7y>6!oc*P-oCMl zw=Rt1qUxS9Pd5gpggvSj*_Q8Wr8iyAjbKq=IQCchO>V!F%l+eT{ej$fQFimIcAPbD f#^xfT#S%oU8;|T*H|yXELy#U%S3j3^P6QTIdOw@#Z<(v-TNzjy816~^dG%o4KNTZJCIJSf4!!Qs=6KmVu@OuT3``1E5~0WE zUQ9mwCPq!v0ahvtyse4ggjgx~x Ox;$O|T-G@yGywn<-co)5 literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz580.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz580.png new file mode 100644 index 0000000000000000000000000000000000000000..5777ff6b772a5b932bcb8b88b2a16180bc7e50e4 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsW+Z3jv*Dd-rhRM*s zbm@0Lzkc7l&lO+)J25ahFkEG}-Sy=pTY_c_1B*k6K)9~zrr8hHE3hE7h8j!)44c^ucUQ)J&1w!;6lh?e2sG61U_3iNNHuGv`!$e3 Mp00i_>zopr09>r7O4KfzV-(fxf8cupB2~4<-ous;83!<;QOlsS>e(#tpW`UEZCeuyx5wTOl90U U7pBZ!I~AnK)78&qol`;+02WJDivR!s literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz7900.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rz7900.png new file mode 100644 index 0000000000000000000000000000000000000000..eac40892085ce07b24e72e86999f2070ef809b65 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsZX9Rjv*Dd-rh>&b1>jxyKwiv z3E#uGISns%b)Bv5lwZ`gB!1IEQ=md@;N6?wWp{Ef{#yOntyg$&T&XRS0>c^khI@~1 z{#yRn<^ASea*P5DEDLshbT|KU^@>_lKLZED|7e!|cYo~t9=#XDd+pn}@79mK=RcNs ziLP~LU}-27KbUXoRJP}p>t+Uy1|Yh=U~zrxiMou_db4K7D+(|$Vsi-bV#|t{8eiU@ TdCW{=HAs`EtDnm{r-UW|PrO>R literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx50.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx50.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d5ccec12a632a3d3634d3fe2a8bdedfa05ec94 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsn?z^jv*Dd-rjQLYBmsXxOnHk ziJa2+OM53Ak!;iWBv%r+N^|LFMaF1mpjs>-VcGY`bM`K}e*eAn+RtA;zxlrI-RJYl z3@fBAT>N^KanIM?0u2lT4p*&iHumM!hP|G_z{tVCn8M$EHG1-@35(wgHZW{py=D62 zDzinD{VrE02BrgwJF*J)Rh4Hs{_TMq&`SQM~WPlC_`c|9Hvxve&< R&3=M(dAjiZ( zme|96uWT>Wt)DQ5dG8sEOB3WZrU(I5Vgsg@@#Sx`WdHw*&7Ak*`^DdRf9vPjFg4ud zE-7WW_;K|iX9gw*hQ*)PME!_=oZBkU!0^JB<^8QgXROwo=MrG#X!yL{VYk@7Hw9jw z-I*OhYWL3n|8{~d1B(KK+jgFVdQ I&MBb@0KB$NqW}N^ literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx80ti.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx80ti.png new file mode 100644 index 0000000000000000000000000000000000000000..6d16b6473d63e5116af8de3fd7aaa6bd6a57f807 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsXv}Bjv*Dd-rkDlYBmsXxcH{t zRPRvj%l!!_l8q)5@O@dnb>p-c32$#kpjs?o!Lxnqmw$U<`|tO@{iRXy`L^{}K5o8l zU0uuJ!0?1!V6Wri>+fUJuO8d7kX3$ywSt&P2m#3?r%Q~loCIEtgRnGtb literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx90.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_ov_txt_rzx90.png new file mode 100644 index 0000000000000000000000000000000000000000..66399361c34f2cccc7cd1aa0f7259fed8cdee929 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^2Y|SNgAGW=wxnePsaKvZjv*Dd-rjQLYBmsYz4)fy zR8Q&mrJV^TA5}T#G0Se*x?ikFQPi6es1^%Yu=HAPzHL>%ef_(vbCOw^5f%6XPTDI12UNszI=KVp4aMe->Q*;1&i$@2z~Hncm2=u_mz4nC^#5A MUHx3vIVCg!01>iK8~^|S literal 0 HcmV?d00001 diff --git a/src/Decentralized/ModFiles/Textures/Items/gpu_big_pmd_b.png b/src/Decentralized/ModFiles/Textures/Items/gpu_big_pmd_b.png new file mode 100644 index 0000000000000000000000000000000000000000..f24624ad551355235910e18966fcbf2fe1bb062f GIT binary patch literal 1605 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 m)E_*>lNXvP;C^#1|wfn8Vt literal 0 HcmV?d00001