Brapi

Brapi

一个适用于 Fabric 模组的快速 UI 渲染库。支持圆角矩形、渐变、纹理和 SDF 文字。

基础库

Brapi

一个面向 Fabric 模组的 UI 渲染库。通过简洁的 API 支持圆角矩形、文本、渐变、纹理和九宫格精灵。未来计划支持 SVG 光栅化、阴影、更多文本选项、可切换的即时模式渲染和线条。

为什么

在 Minecraft 中制作好看的 UI 比想象中更困难。原版工具对于基础矩形来说效果不错,但一旦你想要平滑的圆角、圆形或美观的文本,就会遇到瓶颈。 通常你只有两个选择:

  1. 引入像 Skia 这样的大型图形库,这对新手来说很难配置
  2. 从头编写自己的着色器,这意味着要处理额外的设置和大多数模组作者宁愿跳过的样板代码

Brapi 提供了第三种选择。它是一个轻量级层,位于 Minecraft 现有渲染系统之上,让你无需痛苦就能获得漂亮的视觉效果。 主要优势:

  • 零样板代码:无需繁琐设置。只需创建 BRender,添加绘制调用,然后刷新即可。
  • 复杂形状简单化:用一行代码绘制圆形、轮廓和圆角矩形(甚至支持不同角半径)。
  • 自动批处理与分层:Brapi 自动确定正确的绘制顺序,让你的 UI 看起来正确,无需你微观管理。

📦 设置

添加为依赖

将仓库和依赖添加到 build.gradle:

repositories {
    exclusiveContent {
        forRepository {
            maven {
                name = "Modrinth"
                url = "https://api.modrinth.com/maven"
            }
        }
        filter {
            includeGroup "maven.modrinth"
        }
    }
}
dependencies {
    modImplementation "maven.modrinth:brapi:0.25.3+${minecraft_version}+fabric" // 目前仅支持 Minecraft 版本 1.21.11
}

fabric.mod.json:

"depends": {
    "brapi": "*"
}

在代码中使用

创建 BRender 实例,添加绘制调用,然后调用 flush(graphics) 提交。所有内容在帧结束时按图层排序渲染。

🎨 所有颜色均为 ARGB 格式:0xFFFF0000 = 不透明红色,0x80FF0000 = 50% 透明红色。
📐 坐标以 GuiScale 为单位:(100, 100) 在缩放 3 时 = (300, 300) 像素。

填充形状

  • bRender.rect(100, 100, 100, 100, 0xFFFF0000, layer); - 红色 100x100 矩形
  • bRender.roundRect(100, 100, 100, 100, 0xFFFF0000, 10, layer); - 圆角矩形,半径 10px
  • bRender.roundRect(100, 100, 100, 100, 0xFFFF0000, 10, 5, layer); - 左上/右下 10px,右上/左下 5px 半径
  • bRender.roundRect(100, 100, 100, 100, 0xFFFF0000, 10, 5, 20, 30, layer); - 各角独立半径
  • bRender.circle(100, 100, 50, 0xFFFF0000, layer); - 圆形,半径 50px

渐变

所有填充形状都通过 Gradient 和 GradientDirection 支持渐变:

  • bRender.roundRect(100, 100, 100, 100, gradient, GradientDirection.LEFT_RIGHT, 10, layer);

方向:LEFT_RIGHT、TOP_BOTTOM、TOP_LEFT_BOTTOM_RIGHT、TOP_RIGHT_BOTTOM_LEFT

描边(仅轮廓)

  • bRender.stroke(100, 100, 100, 100, 0xFFFF0000, 2, layer); - 2px 轮廓矩形
  • bRender.strokeRounded(100, 100, 100, 100, 0xFFFF0000, 10, 2, layer); - 2px 圆角轮廓,半径 10px
  • bRender.strokeRounded(100, 100, 100, 100, 0xFFFF0000, 10, 5, 2, layer); - 左上/右下 10px,右上/左下 5px
  • bRender.strokeRounded(100, 100, 100, 100, 0xFFFF0000, 10, 5, 20, 30, 2, layer); - 各角独立半径

填充 + 描边

  • bRender.roundRectStroked(100, 100, 100, 100, 0xFF0000FF, 0xFFFF0000, 10, 2, layer); - 蓝色填充,2px 红色描边

文本

  • bRender.drawText(font, "Hello!", 100, 100, 24, 0xFFFFFFFF, layer); - BFont 文本
  • bRender.drawText(font, formattedCharSequence, 100, 100, 24, 0xFFFFFFFF, layer); - 带逐字符颜色的格式化文本

纹理

  • bRender.drawTexture(tex, 100, 100, 200, 150, 0xFFFFFFFF, linear, layer); - 拉伸填充
  • bRender.drawTextureCropped(tex, 100, 100, 64, 64, 0, 0, 32, 32, 0xFFFFFFFF, linear, layer); - 裁剪
  • bRender.drawTextureTiled(tex, 100, 100, 200, 200, 0xFFFFFFFF, linear, layer); - 平铺
  • bRender.drawTexture9Slice(slice, 100, 100, 300, 200, 0xFFFFFFFF, linear, layer); - 九宫格

🔄 刷新

BRender r = new BRender();
r.roundRect(...);
r.flush(graphics); // 提交到绘制列表