Merge branch 'glow-freeze'
ci / gates (push) Successful in 34s

This commit is contained in:
DKChan committed 2026-11-06 06:19:09 +08:00
commit 7aa0126b22
5 files changed
+110 -49

No files matched your search

+38 -17
View File
@@ -5,7 +5,8 @@
# 微光色值与呈现参数 = game/presentation/views/ui_kit.gd TG_GLOW_*/TYPE_GLOW_*(v2 冻结);
# 合成公式 = game/presentation/views/cell_type_glow.gdshader(blend_mix 距离场柔光);
# 带域/格心取样 = game/probe/type_glow_shot_probe.gd(de<格边×0.125 / 内缩 20%);
# 硬指标门 = art-bible §4.1(L≥0.30 线性域 / 饱和≤0.55 / 避 300°–345°);
# 准入门值(亮度地板/饱和上限/禁入色相带/近色容差)单点在本件 FLOOR_L·CEIL_SAT·
# BANNED_HUE·NEAR_EPS;art-bible §4.1 只述「未开格底与微光存在相对亮度关系」并指路本件。
# 既有色板比对池 = game/tests/golden/palette_baseline/ 两张条带并集(palette_check.py 同源)。
# 方案 §2.3 机检 C 口径订正:模型 0.49/0.51 是反解近似(ui_kit.gd 头注「模型域与实测的差
# = shader 距离场权重非扁平混合」),比较对象改为 shader 精确合成模型(逐像素复刻),判据线
@@ -43,12 +44,13 @@ CELL = 45 # D 区实比格边
BAND = CELL * BAND_FRAC # 5.625
CORE_PAD = int(CELL * 0.20) # 格心内缩(探针 CORE_PAD_FRAC=0.20)
# ── 三关铺底代表值 = 色表墙顶受光家族最亮槽 H2(tools/recolor_terrain_tiles.py PALETTES)──
H2_VALUES = {
"dungeon": (181, 155, 119),
"underdark": (186, 193, 210),
"deep_underdark": (150, 158, 186),
}
# ── 铺底准入门值单点(文档侧只述「未开格底与微光存在相对亮度关系」,数值归本件)──
FLOOR_L = 0.30 # 未开格底相对亮度地板(线性域)
CEIL_SAT = 0.55 # 饱和度上限
BANNED_HUE = (300.0, 345.0) # 禁入色相带(Boss 紫赤独占)
NEAR_EPS = 8 # 近色容差(三通道差全 <此值 即近色)
B_MIN_CH_DIFF = 8 # 机检 B|格底-微光可辨底线(三通道至少一通道 ≥此值)
C_MODEL_TOL = 2 # 机检 C|样图与合成模型容差(±此值 /255)
BOARD_TYPES = ["dungeon", "underdark", "deep_underdark"]
BASE_VARIANTS = [ # (底型名,瓦片件名后缀)——素砖 + 两种装饰变体(高墙瓦片词表在册件)
("素砖", "terrain_wall_center"),
@@ -139,6 +141,23 @@ def load_tiles():
return tiles
def lit_slots(tiles):
"""铺底代表值 = 该关三块底型瓦片像素里线性亮度最大的实测色(顶面受光档)。
零表值:不引用任何色表常量,素材换色后读数自动跟随。"""
slots = {}
for bt in BOARD_TYPES:
best = None
for vn, _ in BASE_VARIANTS:
px = tiles[(bt, vn)]
for y in range(CELL):
for x in range(CELL):
c = px[x, y]
if best is None or rel_lum(c) > rel_lum(best):
best = c
slots[bt] = best
return slots
# ── 带域/格心取样(探针口径)──
def band_pixels():
"""带域像素集(整数格坐标 de < 格边×0.125,type_glow_shot_probe 口径)。"""
@@ -187,21 +206,22 @@ def load_baseline_palette():
def gate_d(tiles):
baseline = load_baseline_palette()
lit = lit_slots(tiles)
rows = []
all_pass = True
for bt in BOARD_TYPES:
rgb = H2_VALUES[bt]
rgb = lit[bt]
h, s = hsv(rgb)
lin = rel_lum(rgb)
l_ok = lin >= 0.30
s_ok = s <= 0.55
hue_ok = not (300.0 <= h <= 345.0)
l_ok = lin >= FLOOR_L
s_ok = s <= CEIL_SAT
hue_ok = not (BANNED_HUE[0] <= h <= BANNED_HUE[1])
# 近色门:三值=在役素材色(已在基线池内),palette_check 双门②只判新增色——报读数不判红
near = [b for b in baseline if all(abs(rgb[i] - b[i]) < 8 for i in range(3))]
near = [b for b in baseline if all(abs(rgb[i] - b[i]) < NEAR_EPS for i in range(3))]
ok = l_ok and s_ok and hue_ok
all_pass = all_pass and ok
rows.append((bt, rgb, lin, s, h, len(near), ok))
check("D-" + bt, "铺底代表值门(L/饱和/禁入带;近色只报读数)", ok,
check("D-" + bt, "铺底代表值门(底型瓦片实测顶面受光档;亮度/饱和/禁入带,近色只报读数)", ok,
"RGB=%s L=%.3f 饱和=%.3f 色相=%.1f° 近色对=%d(在役素材色,非新增)%s%s%s"
% (rgb, lin, s, h, len(near),
"" if l_ok else " [L红]", "" if s_ok else " [饱和红]",
@@ -300,6 +320,7 @@ def run_checks(img, cell_pngs, tiles, blocks, gray_top, main_top, main_bot):
table2 = [] # 90 行组间表
band_means = {}
fail_b, fail_c = [], []
lit = lit_slots(tiles)
for bt, y0 in blocks:
for vn, _ in BASE_VARIANTS:
@@ -321,13 +342,13 @@ def run_checks(img, cell_pngs, tiles, blocks, gray_top, main_top, main_bot):
model = model_band_mean(px, glow)
diff_model = max(abs(band_mean[i] - model[i]) for i in range(3))
ch_diff = [abs(band_mean[i] - core_mean[i]) for i in range(3)]
b_ok = max(ch_diff) >= 8
c_ok = diff_model <= 2
b_ok = max(ch_diff) >= B_MIN_CH_DIFF
c_ok = diff_model <= C_MODEL_TOL
if not b_ok:
fail_b.append("%s/%s/%s" % (bt, vn, gname))
if not c_ok:
fail_c.append("%s/%s/%s" % (bt, vn, gname))
hue_gap = abs(hsv(H2_VALUES[bt])[0] - hsv(glow)[0])
hue_gap = abs(hsv(lit[bt])[0] - hsv(glow)[0])
hue_gap = min(hue_gap, 360 - hue_gap)
table1.append((bt, vn, gname, band_mean, core_mean, model,
diff_model, ch_diff, hue_gap, b_ok and c_ok))
@@ -396,7 +417,7 @@ def write_report(table1, table2, d_rows):
]
for cid, name, ok, detail in CHECKS:
lines.append("| %s | %s | %s:%s |" % (cid, "PASS" if ok else "FAIL", name, detail))
lines += ["", "## S1 机检 D:铺底代表值(H2 槽)五门", "",
lines += ["", "## S1 机检 D:铺底代表值(底型瓦片实测顶面受光档)五门", "",
"| 关 | RGB | L(线性域) | 饱和 | 色相 | 近色对 | 判定 |", "|---|---|---|---|---|---|---|"]
for bt, rgb, lin, s, h, near, ok in d_rows:
lines.append("| %s | %s | %.3f | %.3f | %.1f° | %d | %s |" % (bt, rgb, lin, s, h, near, "过" if ok else "红"))