RenderContext
用途:一次渲染回调的上下文。只在本次回调期间有效——不要把它或它返回的 canvas() / matrices() 存起来跨帧使用。
方法速览
| 方法 | 用途 |
|---|---|
width() / height() | 本层逻辑尺寸(逻辑坐标,左上角为原点) |
partialTick() | 帧插值参数 [0,1](当前恒接近 0,见下) |
layer() | 当前渲染层 |
matrices() | 变换栈(与 canvas().save/restore 共用同一份状态) |
canvas() | 中立绘制入口 |
drawTexture(...) | 绘制纹理的指定子区域(精灵图/图集) |
advanced() | 裸图形 API 出口(破坏可移植性) |
完整签名
public interface RenderContext {
int width();
int height();
double partialTick();
RenderLayer layer();
MatrixStack matrices();
RenderCanvas canvas();
void drawTexture(RenderImage image, float x, float y, float w, float h,
float u0, float , float u1, float );
AdvancedRenderAccess advanced();
}width() / height()
签名:
int width();
int height();行为:返回本层的逻辑尺寸(像素)。宿主在进入插槽前已把画布变换设置为「逻辑空间」,所以直接用逻辑坐标绘制即可,不需要按窗口分辨率换算。窗口缩放/全屏只影响显示尺寸,不影响这里的逻辑尺寸。
partialTick()
签名:
double partialTick();行为:帧插值参数,范围 [0,1]。固定步长模式(-Dseecmd.gl.frameMode=fixed:<n>)下由宿主按 (now - lastStep) / stepNanos 计算并截断;vsync / unlimited 模式恒为 1.0。
诚实说明:本引擎是「每帧一次逻辑更新 + 同帧渲染」,固定步长下该值恒接近 0;游玩时间走音频时钟,与帧间隔无关。请把它当常量设计,不要依赖它做平滑。
layer()
签名:
RenderLayer layer();行为:返回当前处于哪个渲染层(见 RenderLayer)。最常见的用法是过滤:只在 HUD / OVERLAY 等层绘制。
matrices()
签名:
MatrixStack matrices();行为:返回变换栈。push() 等价于 canvas().save(),两者共用同一份底层状态,可以混用但配对必须守恒。详见 MatrixStack。
canvas()
签名:
RenderCanvas canvas();行为:返回本层的中立绘制入口。宿主在进入插槽前把状态(颜色/透明度/裁剪/变换)重置为默认,插槽结束后强制恢复;但插槽内部的状态污染会影响同层其它模组,所以请自行 save() / restore() 配对。
drawTexture(...)
签名:
void drawTexture(RenderImage image, float x, float y, float w, float h,
float u0, float , float u1, float );行为:把图片的指定区域绘制到目标矩形,用于精灵图/图集。源区域用归一化坐标 [0,1](u 沿宽度、v 沿高度,原点在图片左上角),与图片像素尺寸无关,因此同一段代码适用于任意尺寸的图集。
u1 必须大于 u0、 必须大于 ;image 须是经 ModContext#resources() 加载的句柄。
advanced()
签名:
AdvancedRenderAccess advanced();行为:返回裸图形 API 出口。会破坏可移植性与像素对账,非必要不要用,详见 AdvancedRenderAccess。
示例:从 4×5 图集取第 2 列第 3 行
// 图集 4 列 × 5 行:格宽 0.25,格高 0.2
ctx.drawTexture(sheet,
x, y, 64, 64, // 目标矩形(逻辑坐标)
0.25f, 0.4f, 0.5f, 0.6f); // 源区域:第 2 列、第 3 行