Theseus 模组文档
API 参考 / 渲染、资源与语言

CustomRenderLayer


用途:声明一个带小数层号的新层,参与全局排序。与 RenderEvent 插槽的区别:插槽在同一位置只有「订阅顺序」,而自定义层提供声明式层号,多模组叠加时按层号全序绘制(同层号按注册顺序)。

完整签名

java
public interface CustomRenderLayer {

    String id();

    double index();

    void render(RenderContext ctx);
}

id()

签名:

java
String id();

行为:层 id,仅用于诊断与日志(同模组内应唯一,跨模组可重复)。

index()

签名:

java
double index();

行为:层号,决定插入位置:index 落在 [L, L+1) ⇒ 渲染于第 L 层内容之后、第 L+1 层内容之前;index < 0 ⇒ 一切内容之前;index >= 6 ⇒ FULLSCREEN 之后(滤镜之后、延后暂停 UI 之前)。

index < 4 的自定义层处于世界相机深度作用域内(3D/z 原语生效);index >= 4 永久正交、3D 原语退化为 2D。

render(RenderContext ctx)

签名:

java
void render(RenderContext ctx);

行为:渲染线程内同步调用。ctx 生命周期同 RenderEvent(不得缓存);ctx.layer() 返回该边界所属的内置层(自定义层没有自己的枚举值)。

示例:插在音符与判定特效之间的一层

java
public final class TrailLayer implements CustomRenderLayer {
    @Override public String id() { return "trail"; }
    @Override public double index() { return 2.5; }   // NOTES 之后、JUDGE_FX 之前
    @Override public void render(RenderContext ctx) {
        RenderCanvas c = ctx.canvas();
        c.save();
        c.setAlpha(0.35);
        c.setColor(java.awt.Color.CYAN);
        c.fillRect(0, ctx.height() - 60, ctx.width(), 60);
        c.restore();
    }
}

// onPreInit 内注册
ctx.registries().customRenderLayers().register(
        RegistryKey.of("mymod", "trail", CustomRenderLayer.class), new TrailLayer());