Skip to content

fix(ui): 修复新 ClickGUI 的键盘输入、调色板渐变与饰品滚动裁剪 - #190

Merged
gaoyu06 merged 4 commits into
FPSMasterTeam:mainfrom
Serendisand:main
Sep 19, 2026
Merged

gaoyu06 merged 4 commits into
FPSMasterTeam:mainfrom
Serendisand:main

Conversation

@Serendisand

Copy link
Copy Markdown
Contributor

现象

新 ClickGUI(共享 Prism 版)三个问题:

  1. 绑定按钮点不动——按下后不进入 ...
    捕获态,按键也写不进去;文本框打不进字。开关、滑条这类纯鼠标的控件却一切正常。
  2. 调色板无论点哪儿都是同一个颜色(SV 方块整块纯色、色相条是六段色带),但右侧的选中色块显示是对的。
  3. 饰品界面往下滚的时候,饰品缩略图会越过列表边界,画到面板甚至窗口外面。

原因

  1. 键鼠缓冲被别帧清掉:typedChars/原始键码存在共享的 EdgeUi.fallback 里,而 EdgeUi.end() 无条件调
    fallback.endFrame()。HUD 覆盖层每帧都会 beginOverlay/end 一次,且在 updateCameraAndRender 里排在
    drawScreen 前面(反编译确认:renderGameOverlay 在 672、ForgeHooksClient.drawScreen 在
    764)。于是玩家这一帧敲的键、打的字在 ClickGUI 读到之前就被冲掉了。鼠标走的是屏幕自己的
    GuiInputState,所以不受影响。
  2. GL shade model 被留成 GL_FLAT:TargetDisplay.drawCircle 的 finally 和
    GradientUtils.drawGradientVertical 结尾都把 shade model 还原成 GL_FLAT,而原版
    GUI/世界渲染从不碰它,基线一直是 GL 默认的 GL_SMOOTH。FLAT
    一旦留在状态里,之后所有逐顶点着色的渐变都被拍成最后一个顶点的颜色:SV
    方块整个变黑,色相条变成六段纯色。单选色的色块(右侧圆点)不受 shade model 影响,所以它一直是对的。
  3. 缩略图在 clip 栈弹空之后才上屏:饰品缩略图是 3D 渲染,攒到 2D 通道结束之后才画,那时 clip
    已经失效;列表滚动时卡片被裁掉一半,缩略图却照画不误。

修复

  1. EdgeUi 增加 screenFrame 标志,只有宿主屏幕(ScaledGuiScreen)那一帧才有资格清共享键鼠缓冲;覆盖层
    begin/end 不再动它。
  2. 两处 shade model 还原改为 GL_SMOOTH(原版基线)。
  3. CosmeticsScreen 在收集回调(paintItemPreview)那一刻抄下当前的 GL 裁剪框,绘制缩略图时自己
    glScissor 套上,画完还原

Serendisand and others added 4 commits September 19, 2026 08:42
HUD 覆盖层(通知)每帧都会 EdgeUi.beginOverlay/end 一次,而它在
updateCameraAndRender 里排在 drawScreen 前面:end() 里无脑调 fallback.endFrame()
就把玩家这一帧敲的键、打的字在 ClickGUI 读到之前冲掉了。表现是绑定按钮和文本框
双双点不动,而纯鼠标的开关、滑条照常。

只有喂过 EdgeUi.keyTyped 的宿主屏幕那一帧才有资格清这份共享缓冲。
饰品缩略图是 3D 渲染,攒到 2D 通道结束之后才上屏,那时 clip 栈已经弹空,
滚动时缩略图会横穿列表边界画到面板外面。在收集回调那一刻把当前的 GL 裁剪框
抄下来,绘制时自己套上。
TargetDisplay 画完 ESP 圈、GradientUtils 画完渐变,都把 shade model 还原成 GL_FLAT,
而原版 GUI/世界渲染从不碰它,基线一直是 GL 默认的 GL_SMOOTH。FLAT 一旦留在状态里,
之后所有逐顶点着色的渐变都被拍成一块纯色:ClickGUI 调色板的 SV 方块整个变成最后一个
顶点的颜色(黑),色相条变成六段纯色,而单选色的色块不受影响——看起来就是「色板全是
同一个颜色,右边选中的颜色却是对的」。
review 出两处:

- glGetInteger 要求 buffer 剩余 >=16(checkBuffer),4 会在饰品列表
  开裁时直接抛异常崩渲染循环;给 16,同 vanilla 的 GLAllocation 用法。
- handleInput 先鼠标后键盘:屏幕在 handleMouseInput 里关掉后,同批
  Keyboard.next() 的按键仍派发到死实例。缓冲现在只由宿主屏幕帧清,
  死屏喂的键会攒到下一个 ScaledGuiScreen 打开才冒出来;不是当前屏
  就不喂。
@gaoyu06
gaoyu06 merged commit 2596c2f into FPSMasterTeam:main Sep 19, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants