HUD 渲染管线
基本信息
| 属性 | 值 |
|---|---|
| 渲染入口 | mcp.mobius.waila.overlay.OverlayRenderer(OverlayRenderer.java:12) |
| 事件驱动 | mcp.mobius.waila.overlay.WailaTickHandler(WailaTickHandler.java:24) |
| 射线检测 | mcp.mobius.waila.overlay.RayTracing(RayTracing.instance(),WailaTickHandler.java:46) |
| 几何计算 | mcp.mobius.waila.overlay.DisplayUtil |
| 外观参数 | mcp.mobius.waila.overlay.OverlayConfig(OverlayConfig.java:8) |
| 事件注册 | Waila.initialize 客户端分支(Waila.java:68-72) |
功能
Waila 是纯客户端 HUD 渲染框架,不修改世界、不注册方块物品。渲染分两个 tick 事件:
| 事件 | 阶段 | 行 | 职责 |
|---|---|---|---|
TickEvent.ClientTickEvent |
END |
WailaTickHandler.java:36-38 |
射线检测 → 填充 accessor → 调用 provider 生成 tip |
TickEvent.RenderTickEvent |
END |
WailaTickHandler.java:29-34 |
调用 OverlayRenderer.renderOverlay(tooltip) 绘制 |
ClientTickEvent 在 START 阶段直接 return(WailaTickHandler.java:38),保证与 RenderTickEvent 不重复触发。
可见性判定
OverlayRenderer.isOverlayVisible()(OverlayRenderer.java:18-24)要求 4 个条件同时成立:
mc.currentScreen == null—— 无 GUI 打开mc.theWorld != null—— 世界已加载Minecraft.isGuiEnabled()—— F3 隐藏 GUI 未开启!mc.gameSettings.keyBindPlayerList.getIsKeyPressed()—— 未按住 Tab 玩家列表ConfigHandler.instance().showTooltip()——waila.cfg.show为 true
不满足时 WailaTickHandler.java:40-44 会把 tooltip 置 null 并清空射线检测缓存。
方块 / 实体分支
renderOverlay(OverlayRenderer.java:26-38)按 MovingObjectPosition.typeOfHit 分流:
| 命中类型 | 额外条件 | 行 |
|---|---|---|
BLOCK |
RayTracing.getTargetStack() != null |
OverlayRenderer.java:29-32 |
ENTITY |
配置 general.showents 为 true |
OverlayRenderer.java:34-37 |
任一条件不满足即 return,不绘制任何内容(OverlayRenderer.java:27)。
tip 生成
WailaTickHandler.tickClient 按命中类型组装三段 tip(WailaTickHandler.java:52-55)。方块分支从 RayTracing.getTargetStack() 取目标 stack —— 注释说明这已是"proper stack or the override",即已应用 getWailaStack 覆盖(WailaTickHandler.java:59-60),随后 DataAccessorCommon.set(world, player, target) 填充上下文(WailaTickHandler.java:57-58)。
GL 状态
doRenderOverlay(OverlayRenderer.java:40-)按序:
glPushMatrix()+saveGLState()(OverlayRenderer.java:42-43)glScalef(OverlayConfig.scale, scale, 1.0f)—— 注意 Z 轴固定 1.0(OverlayRenderer.java:45)- 关闭
GL_RESCALE_NORMAL、标准物品光照、GL_LIGHTING、GL_DEPTH_TEST(OverlayRenderer.java:47-50) drawTooltipBox(x, y, w, h, bgcolor, gradient1, gradient2)(OverlayRenderer.java:52-59)
saveGLState 会缓存 hasBlending / hasDepthTest / boundTexIndex 三个静态字段(OverlayRenderer.java:14-16),绘制结束后恢复。
装饰器渲染
世界内 3D 装饰由独立的 DecoratorRenderer 负责,与 HUD 文本渲染是两条路。Waila.preInit(Waila.java:62)与 Waila.initialize(Waila.java:69)各注册一次 new DecoratorRenderer() 到 MinecraftForge.EVENT_BUS,即客户端环境下该事件总线上有两个实例。扩展点见 方块装饰器。
数值
| 项 | 值 | 来源 |
|---|---|---|
| 订阅的 tick 事件数 | 2 | WailaTickHandler.java:29、WailaTickHandler.java:36 |
overlay 包内类数 |
8 | src/main/java/mcp/mobius/waila/overlay/ |
OverlayConfig 静态字段数 |
8 | OverlayConfig.java:10-17 |
| 保存的 GL 状态数 | 3 | OverlayRenderer.java:14-16 |
DecoratorRenderer 注册次数 |
2 | Waila.java:62、Waila.java:69 |
交互
外观参数来自 general 分区,见 通用配置项。绘制产出的图形化行由 内置 Tooltip 渲染器 提供。实体区开关 general.showents 见 模块配置项。
相关条目
- 内置 Tooltip 渲染器 - 7 个已注册 + 3 个未接线的渲染器类
- Tooltip 渲染器 API - 自定义渲染器的实现契约
- 方块装饰器 - 世界内 3D 装饰扩展点
- 通用配置项 -
posx/posy/scale/ 颜色参数 - 网络协议 - tip 生成依赖的 NBT 同步