渲染系统(Render System)

基本信息

属性 值
核心入口 com.caedis.duradisplay.render.DurabilityRenderer
渲染器抽象 com.caedis.duradisplay.render.OverlayRenderer
文本渲染器 com.caedis.duradisplay.render.TextRenderer
横条渲染器 com.caedis.duradisplay.render.BarRenderer
竖条渲染器 com.caedis.duradisplay.render.VerticalBarRenderer
Mixin 入口 MixinRenderItem、MixinGuiScreen、MixinGuiContainerCreative
协处理类 com.caedis.duradisplay.overlay.OverlayInfo(编译期生成)
协处理类 com.caedis.duradisplay.core.DuraDisplayCore(IFMLLoadingPlugin,依赖 CoFH)

渲染管线

DuraDisplay 把 Item.showDurabilityBar 的返回值从布尔渲染开关重定向为"渲染 DuraDisplay overlay"的信号。

  1. MixinRenderItem.showDurabilityBar 在 RenderItem.renderItemOverlayIntoGUI 的 INVOKE showDurabilityBar 处 @Redirect:
    • 若 DurabilityRenderer.Execute == false 或 DuraDisplayConfig.Enable == false,调原版 item.showDurabilityBar(stack) 返回原行为
    • 否则调 DurabilityRenderer.Render(fontRenderer, stack, x, y) 并返回 false(关闭原版条带)
  2. DurabilityRenderer.Render 遍历 OverlayInfo.getOverlays(),每个 overlay 调 getRenderer(stack);非 null 即 fOverlay.Render(fontRenderer, x, y)
  3. OverlayDurabilityLike.getRenderer 根据 cfg.style 分发到 Text / Bar / VerticalBar 的 Render

Execute 标志

DurabilityRenderer.Execute 是线程局部的渲染开关,默认 true。下表展示关闭它的两个 mixin:

Mixin 目标 关闭时机
MixinGuiScreen GuiScreen.drawScreen HEAD 置 false(关闭整段 GUI 屏幕绘制期间的所有 overlay),RETURN 置 true
MixinGuiContainerCreative GuiContainerCreative.drawGuiContainerBackgroundLayer HEAD 置 false(不渲染创造物品栏背景层物品的 overlay,避免视觉错位),RETURN 置 true

效果:原版 RenderItem.renderItemOverlayIntoGUI 在这些 GUI 中仍会执行(也仍会走 mixin),但因为 Execute == false,mixin 回退到原版 showDurabilityBar,所以这些区域不会出现 DuraDisplay overlay。

渲染器

TextRenderer(文本)

参数 取值
字体缩放 glScalef(0.5, 0.5, 0.5)(半像素精度)
默认位置 numpad 风格 1-9:1/4/7 左对齐,3/6/9 右对齐,2/5/8 居中;7/8/9 顶部,4/5/6 中部,1/2/3 底部
描边 4 次 drawString 偏移 ±1 像素 + 第 5 次居中绘制(黑色描边)
Angelica 加速 若加载 angelica,通过 FontRendererAccessor 包 beginBatch/endBatch,将 5 次 drawString 合并到一次 batch
状态切换 GL_LIGHTING/GL_DEPTH_TEST 关,Blend 开;绘制完恢复

BarRenderer(横条)

绘制位置:物品底部 y + 14 - offset 处,长 13 像素、高 1(前景)/2(背景)。启用 SmoothBar 时长度直接用 percent * 13.0(亚像素),否则 Math.round(percent * 13.0)。showBackground 时绘制深色背景(暗度与 percent 反相关)。

VerticalBarRenderer(竖条)

绘制位置:物品右侧 x + offset 处,宽 1(前景)/2(背景)、高 13。SmoothBar 与 showBackground 行为与横条相同,方向改为向上。

复用实例

BarRenderer.reuse / VerticalBarRenderer.reuse / TextRenderer.reuse 是单例可复用实例——of(...) 工厂方法覆盖字段后返回引用,每帧零分配。DurabilityLikeInfo 同样用 reuse 单例。

OverlayInfo 编译时生成

OverlayProcessor 注解处理器扫描 @com.caedis.duradisplay.annotation.Overlay 标注的具体(非 abstract)Overlay 子类,把全限定类名注入生成的 OverlayInfo.overlayClassNames 静态数组。运行时 getOverlays() 用 Class.forName(n).getConstructor().newInstance() 反射实例化;getConfigs() 返回每个 overlay 的 config()。

新增 overlay 只需:

  1. 在 src/main/java/.../overlay/MyOverlay.java 写 extends OverlayDurabilityLike(或直接实现 Overlay<Config>)
  2. 类上加 @Overlay
  3. (如使用 ConfigDurabilityLike 继承)在 ConfigDurabilityLike 子类中实现 category() 和 postLoadConfig()

构建期 JavaC 会自动生成 OverlayInfo.java,无需手动注册。

DuraDisplayCore(IFMLLoadingPlugin)

属性 值
@MCVersion "1.7.10"
@SortingIndex 1005
@DependsOn "cofh.asm.LoadingPlugin"
实现 IFMLLoadingPlugin、IEarlyMixinLoader
注册的 mixins minecraft.MixinRenderItem、minecraft.MixinGuiScreen、minecraft.MixinGuiContainerCreative

启动时为这三个 mixin 添加 CoFH ASM 钩子;本身无 transformer。

相关条目