渲染系统(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"的信号。
MixinRenderItem.showDurabilityBar在RenderItem.renderItemOverlayIntoGUI的INVOKE showDurabilityBar处@Redirect:- 若
DurabilityRenderer.Execute == false或DuraDisplayConfig.Enable == false,调原版item.showDurabilityBar(stack)返回原行为 - 否则调
DurabilityRenderer.Render(fontRenderer, stack, x, y)并返回false(关闭原版条带)
- 若
DurabilityRenderer.Render遍历OverlayInfo.getOverlays(),每个 overlay 调getRenderer(stack);非 null 即fOverlay.Render(fontRenderer, x, y)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 只需:
- 在
src/main/java/.../overlay/MyOverlay.java写extends OverlayDurabilityLike(或直接实现Overlay<Config>) - 类上加
@Overlay - (如使用
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。
相关条目
- 耐久度 Overlay - 触发
DurabilityRenderer.Render的代表性 overlay - AE2 物品渲染钩子 - 走 AE2 GUI 而非原版
RenderItem的另一条入口 - 配置系统 -
Enable开关与热加载