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 个条件同时成立:

  1. mc.currentScreen == null —— 无 GUI 打开
  2. mc.theWorld != null —— 世界已加载
  3. Minecraft.isGuiEnabled() —— F3 隐藏 GUI 未开启
  4. !mc.gameSettings.keyBindPlayerList.getIsKeyPressed() —— 未按住 Tab 玩家列表
  5. 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-)按序:

  1. glPushMatrix() + saveGLState()(OverlayRenderer.java:42-43)
  2. glScalef(OverlayConfig.scale, scale, 1.0f) —— 注意 Z 轴固定 1.0(OverlayRenderer.java:45)
  3. 关闭 GL_RESCALE_NORMAL、标准物品光照、GL_LIGHTING、GL_DEPTH_TEST(OverlayRenderer.java:47-50)
  4. 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 见 模块配置项。

相关条目