视口与绘制上下文(viewport 包)

基本信息

属性 值
包路径 com.cleanroommc.modularui.screen.viewport
文件数 7
继承链 IViewportStack(接口)→ GuiViewportStack(:21)→ GuiContext(:25)→ ModularGuiContext(:41)
坐标变换 TransformationMatrix(TransformationMatrix.java:15)

功能

类层次

类 文件:行 继承 / 实现 作用
GuiViewportStack viewport/GuiViewportStack.java:21 implements IViewportStack(api/layout/IViewportStack.java) 维护视口栈,提供坐标变换的压栈/弹栈
GuiContext viewport/GuiContext.java:25 extends GuiViewportStack 在栈上叠加当前鼠标、按键等输入状态
ModularGuiContext viewport/ModularGuiContext.java:41 extends GuiContext 实际传给所有控件绘制方法的对象
TransformationMatrix viewport/TransformationMatrix.java:15 — 3×3 仿射变换矩阵(缩放/平移)
DeferredRenderQueue viewport/DeferredRenderQueue.java — 延迟渲染队列
LocatedElement<T> viewport/LocatedElement.java:7 泛型 已定位的元素
LocatedWidget viewport/LocatedWidget.java:13 extends LocatedElement<IWidget> 已定位的控件

ModularGuiContext 的使用面

ModularGuiContext 是控件与世界交互的唯一上下文。 Widget 的 4 个绘制方法全部以它为第一个参数 (widget/Widget.java:151、:177、:189、:203):

public void drawBackground(ModularGuiContext context, WidgetThemeEntry<?> widgetTheme)
public void draw           (ModularGuiContext context, WidgetThemeEntry<?> widgetTheme)
public void drawOverlay    (ModularGuiContext context, WidgetThemeEntry<?> widgetTheme)
public void drawForeground (ModularGuiContext context)

命中测试

IWidget.isInside(IViewportStack stack, int mx, int my)(api/widget/IWidget.java:79) 与带 absolute 参数的重载(:93)接受视口栈而非裸坐标—— 因此嵌在滚动区、变换控件或缩放区域里的控件能正确判断鼠标是否在自己身上。 IWidget 的默认实现从 stack 取出当前矩阵后逐层回溯比较(:94-95 起的局部变量)。

实现 IViewport 的控件

IViewport(api/layout/IViewport.java)意味着该控件提供自己的坐标视口, 子控件的坐标相对它解释。实现者包括:

控件 文件
ModularPanel screen/ModularPanel.java:63
DragHandle widget/DragHandle.java
DraggableWidget widget/DraggableWidget.java:16
AbstractScrollWidget widget/AbstractScrollWidget.java:29
Expandable widgets/Expandable.java

数值

数值名 值 来源
变换矩阵类型 仿射(缩放 + 平移) viewport/TransformationMatrix.java:15

交互

  • 鼠标位置、按键状态由 GuiContext 提供,控件从 ModularGuiContext 读取
  • 事件分发顺序由 IViewportStack 的压栈顺序决定
  • DeferredRenderQueue 让控件把绘制指令延后到当前帧末尾统一提交

相关条目