POLARISUI / C++ / 0.1.0

禁止商用。所有使用 PolarisUI 的应用必须公开完整源码。许可全文

Windows x64 / C++17 / OpenGL 3.3+ · 不依赖 Java/JNI · 版本与校验值

C++ 控件与渲染 API

公开接口以 ui.hpp 为准,命名空间 polaris::ui,要求 C++17。

创建一帧

窗口和渲染器构造顺序为 Window、Renderer、Canvas、Ui。保持窗口的 OpenGL 上下文 current,先调用 Window::poll(),再依次调用 Renderer::begin()、背景绘制、Ui::begin()、控件、Ui::end()、Renderer::render() 和 Window::swap()。完整代码见 hello.cpp。

窗口宽高是客户区物理像素,dpi_scale() 将它们换成逻辑尺寸。控件和鼠标坐标均使用逻辑像素。Input::pressed / released 只对一次 poll 有效,down 保持鼠标按住状态。poll() 为 false 后停止循环。

交互控件

方法值/返回行为
label、panel不返回状态文字、可选玻璃背景与标题
button返回本帧激活按下捕获,范围内释放或 Enter 激活
checkbox、togglebool&,返回值变化开关布尔状态
radioint&,返回选项变化选中指定整数选项
sliderfloat&,返回值变化拖拽捕获、上下限、焦点方向键
text_fieldUTF-8 string&单行文字、码点级编辑和粘贴
number_fieldfloat&+/- 步进,有限范围
comboint&弹出选择、滚动,最多同时显示 8 项
tabsint&横向选项导航
listint&单选、滚轮、裁剪
progress、separator、badge不返回状态进度、分隔与状态文字
tooltip不返回状态指针命中时显示提示
material_settingsTheme&8 参数滑块、3 材质模板与贝塞尔开关

ID 不能为空、同帧不能重复,且跨帧须稳定。disabled(true) 影响随后绘制的控件,直到 disabled(false) 或下一次 begin()。Tab / Shift+Tab 按上一帧的调用顺序切换焦点;不可见和禁用控件不保留焦点。下拉弹层使用独立绘制阶段,并阻止其他控件响应同一轮点击。

材质参数

字段范围含义
tint0–1表面颜色混合;0 不染色
blur0–1清晰/模糊背景混合;0 不模糊
sigma0–32物理像素高斯半径;0 跳过模糊 pass
refraction0–30屏幕空间边缘偏移,不是物理折射率
shine0–1.5边缘高光强度
dispersion0–2RGB 通道采样分离
surface_opacity0–1表面覆盖透明度
corner_smoothing0–1归一化贝塞尔圆角手柄

Theme::light() 返回浅色默认主题,Theme::liquid() 返回零染色/零模糊折射主题,Theme::normal() 返回不折射的实色材质。修改字段后 validate() 可提前检查;绘制也检查范围与 NaN。

Canvas::glass(rect, material) 可使用不同的面材质,但模糊半径由本帧 Renderer::begin 中传入的主题统一决定。多种面材质的 sigma 不会各自触发独立模糊 pass。

自定义绘制

Canvas 提供 fill、stroke、line、ring、color_plane、text 和 glass。clip() 设置矩形裁剪;push_clip(rect, radius) / pop_clip() 支持最多 32 层形状裁剪,必须配对。backdrop() 将之前已绘制的内容重新冻结为随后玻璃的背景,避免玻璃采样到旧的画面。

单帧最多 65,536 条绘制指令。文本为系统字体灰度图集,字体缓存最多 16 张 2048² 纹理、24,000 个字形键;大量动态字号变化触及上限时会抛异常。使用同一个渲染器和稳定字号可以复用图集。

宿主 OpenGL 集成

宿主已持有 Win32 OpenGL 3.3 上下文时,可不创建 Window,直接在 current 的上下文中构造 Renderer。render 的末尾两个参数接收目标 FBO ID 与颜色附件,默认窗口 FBO 0 / GL_BACK。

目标必须是单采样 FBO,多重采样须由宿主先 resolve。渲染器恢复程序、VAO、FBO、viewport、scissor、blend、纹理和采样器等被修改的 GL 状态。宿主负责提供符合约定的绘制尺寸和有效颜色附件。

read_pixels(w,h) 返回默认窗口 back buffer 的自上而下 RGBA,在 swap 前调用。save_png(path,pixels) 使用 WIC 保存 PNG;它不读取宿主 FBO,也不捕获桌面。

生命周期和异常

窗口与渲染器只能在构造线程使用,渲染器的创建、使用和销毁必须保持原上下文 current。同进程只能有一个活动渲染器,可销毁后重新创建。Canvas 中已绑定的文字渲染服务仅在对应 Renderer 存活时有效。

无效范围或 UTF-8 抛 invalid_argument;不配对的 begin/end、重复 ID、错误线程/context 抛 logic_error;容量超限抛 length_error;Win32、GL、字体或 PNG 错误抛 runtime_error。错误线程或错误上下文析构 Renderer/Window 会终止进程,以避免在其他线程/context 错误释放 GPU 对象。

本版没有 Java 的布局树、表格、树控件、弹窗框架、绘图图表或全部复杂控件。Ui 状态仍由立即模式调用顺序和显式 Rect 控制。