Plain GLua 可直接使用
现有 addon 可以挂载生成好的 loader 分发,并通过 MGFX.StartPanel、MGFX.RoundedBoxEx、gradient、text、widget 和诊断接口调用 MGFX.*。
面向 Garry's Mod 的 shader-backed immediate UI renderer。可以从 Lux 导入 @lux/mgfx,也可以使用生成好的 loader,在普通 GLua 里调用 MGFX.*。
当 addon 仍然是普通 GLua 时,直接使用生成好的 loader 分发。客户端 loader 运行后会安装 全局 MGFX facade,已有 panel 可以直接调用 MGFX.*。
function PANEL:Paint(w, h)
MGFX.StartPanel(self, w, h)
MGFX.RoundedBoxEx(0, 0, w, h, {
radius = 10,
fill = MGFX.LinearGradient(
0,
0,
1,
1,
Color(30, 130, 255, 230),
Color(255, 210, 110, 230)
),
})
MGFX.EndPanel()
endimport * as mgfx from "@lux/mgfx"
client fn paintPanel(panel, w, h) {
mgfx.api.startPanel(panel, w, h)
mgfx.api.roundedBoxEx(0, 0, w, h, {
radius = 10,
fill = mgfx.api.linearGradient(0, 0, 1, 1, {
{0.00, Color(30, 130, 255, 230)},
{0.55, Color(60, 200, 255, 230)},
{1.00, Color(255, 210, 110, 230)},
}),
backdrop = { blur = 8, tint = Color(0, 8, 12, 120) },
})
mgfx.api.progressBarEx(24, 84, w - 48, 10, 0.72, {
radius = 5,
track = Color(10, 18, 24, 190),
fill = mgfx.api.linearGradient(
0, 0, 1, 0,
Color(30, 130, 255, 230),
Color(60, 200, 255, 230)
),
})
mgfx.api.endPanel()
}local mgfx = __lux_import("@lux/mgfx")
local function paintPanel(panel, w, h)
mgfx.api.startPanel(panel, w, h)
mgfx.api.roundedBoxEx(0, 0, w, h, {
radius = 10,
fill = mgfx.api.linearGradient(0, 0, 1, 1, {
{0.00, Color(30, 130, 255, 230)},
{0.55, Color(60, 200, 255, 230)},
{1.00, Color(255, 210, 110, 230)},
}),
backdrop = {
blur = 8,
tint = Color(0, 8, 12, 120),
},
})
mgfx.api.progressBarEx(24, 84, w - 48, 10, 0.72, {
radius = 5,
track = Color(10, 18, 24, 190),
fill = mgfx.api.linearGradient(
0, 0, 1, 0,
Color(30, 130, 255, 230),
Color(60, 200, 255, 230)
),
})
mgfx.api.endPanel()
endMGFX 是 Lux package,也是底层 renderer,不是 UI framework。它不拥有 layout、input、focus、component lifecycle 或 transition state。调用方每帧计算当前视觉状态,再把明确的 draw arguments 传给 Lux 里的 mgfx.api.*,或传给 GLua 里安装后的 MGFX.* facade。
文本也不是“全部进 MGFX composer”。普通文本优先走原生 GMod text;只有需要 shader text effects 的内容才进入 whole-run composer。
site_build/ 产物;修改 docs/ 源文件后重新构建。local fill = mgfx.api.sectorAngularGradient({
{0.00, Color(35, 212, 232, 170)},
{0.52, Color(80, 220, 160, 150)},
{1.00, Color(245, 158, 11, 135)},
})
mgfx.api.sectorEx(cx, cy, innerR, outerR, startDeg, endDeg, {
fill = fill,
stroke = Color(255, 255, 255, 34),
strokeWidth = 1,
backdrop = { blur = 7, tint = Color(4, 10, 14, 120) },
innerGlow = { color = Color(255, 96, 78, 90), width = 28 },
transform = mgfx.api.pointerTilt(mx, my, {
perspective = 900,
maxRotateX = 4,
maxRotateY = 6,
}),
})local fill = MGFX.SectorAngularGradient({
{0.00, Color(35, 212, 232, 170)},
{0.52, Color(80, 220, 160, 150)},
{1.00, Color(245, 158, 11, 135)},
})
MGFX.SectorEx(cx, cy, innerR, outerR, startDeg, endDeg, {
fill = fill,
stroke = Color(255, 255, 255, 34),
strokeWidth = 1,
backdrop = {blur = 7, tint = Color(4, 10, 14, 120)},
innerGlow = {color = Color(255, 96, 78, 90), width = 28},
transform = MGFX.PointerTilt(mx, my, {
perspective = 900,
maxRotateX = 4,
maxRotateY = 6,
}),
})