Skip to content

MGFXModern GMod FX

面向 Garry's Mod 的 shader-backed immediate UI renderer。可以从 Lux 导入 @lux/mgfx,也可以使用生成好的 loader,在普通 GLua 里调用 MGFX.*。

给 Plain GLua 使用

当 addon 仍然是普通 GLua 时,直接使用生成好的 loader 分发。客户端 loader 运行后会安装 全局 MGFX facade,已有 panel 可以直接调用 MGFX.*

lua
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()
end

从 Lux 快速开始

lux
import * 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()
}
lua
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()
end

文档入口

核心边界

MGFX 是 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。

维护规则

示例:轮盘扇区

lux
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,
  }),
})
lua
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,
    }),
})